ansible-過(guò)濾

filters

現(xiàn)在我有一個(gè)需求,我想要將獲取到的變量的值中的所有字母都變成大寫(xiě),如果想要在playbook中實(shí)現(xiàn)這個(gè)需求,我該怎么辦呢?我可以借助一個(gè)叫做"過(guò)濾器"的東西,幫助我完成剛才的需求,"過(guò)濾器(filters)"可以幫助我們對(duì)數(shù)據(jù)進(jìn)行處理,這樣解釋可能不夠直觀,不如這樣,我們先來(lái)看一個(gè)過(guò)濾器的小例子,然后結(jié)合示例解釋過(guò)濾器是個(gè)什么東西,示例如下

---
- hosts: test70
  remote_user: root
  gather_facts: no
  vars:
    testvar: 1a2b3c
  tasks:
  - debug:
      msg: "{{ testvar | upper }}"

一些跟字符串操作有關(guān)的過(guò)濾器

---
- hosts: test70
  remote_user: root
  vars:
    testvar: "abc123ABC 666"
    testvar1: "  abc  "
    testvar2: '123456789'
    testvar3: "1a2b,@#$%^&"
  tasks:
  - debug:
      #將字符串轉(zhuǎn)換成純大寫(xiě)
      msg: "{{ testvar | upper }}"
  - debug:
      #將字符串轉(zhuǎn)換成純小寫(xiě)
      msg: "{{ testvar | lower }}"
  - debug:
      #將字符串變成首字母大寫(xiě),之后所有字母純小寫(xiě)
      msg: "{{ testvar | capitalize }}"
  - debug:
      #將字符串反轉(zhuǎn)
      msg: "{{ testvar | reverse }}"
  - debug:
      #返回字符串的第一個(gè)字符
      msg: "{{ testvar | first }}"
  - debug:
      #返回字符串的最后一個(gè)字符
      msg: "{{ testvar | last }}"
  - debug:
      #將字符串開(kāi)頭和結(jié)尾的空格去除
      msg: "{{ testvar1 | trim }}"
  - debug:
      #將字符串放在中間,并且設(shè)置字符串的長(zhǎng)度為30,字符串兩邊用空格補(bǔ)齊30位長(zhǎng)
      msg: "{{ testvar1 | center(width=30) }}"
  - debug:
      #返回字符串長(zhǎng)度,length與count等效,可以寫(xiě)為count
      msg: "{{ testvar2 | length }}"
  - debug:
      #將字符串轉(zhuǎn)換成列表,每個(gè)字符作為一個(gè)元素
      msg: "{{ testvar3 | list }}"
  - debug:
      #將字符串轉(zhuǎn)換成列表,每個(gè)字符作為一個(gè)元素,并且隨機(jī)打亂順序
      #shuffle的字面意思為洗牌
      msg: "{{ testvar3 | shuffle }}"
  - debug:
      #將字符串轉(zhuǎn)換成列表,每個(gè)字符作為一個(gè)元素,并且隨機(jī)打亂順序
      #在隨機(jī)打亂順序時(shí),將ansible_date_time.epoch的值設(shè)置為隨機(jī)種子
      #也可以使用其他值作為隨機(jī)種子,ansible_date_time.epoch是facts信息
      msg: "{{ testvar3 | shuffle(seed=(ansible_date_time.epoch)) }}"

跟數(shù)字操作有關(guān)的過(guò)濾器

---
- hosts: test70
  remote_user: root
  vars:
    testvar4: -1
  tasks:
  - debug:
      #將對(duì)應(yīng)的值轉(zhuǎn)換成int類(lèi)型
      #ansible中,字符串和整形不能直接計(jì)算,比如{{ 8+'8' }}會(huì)報(bào)錯(cuò)
      #所以,我們可以把一個(gè)值為數(shù)字的字符串轉(zhuǎn)換成整形后再做計(jì)算
      msg: "{{ 8+('8' | int) }}"
  - debug:
      #將對(duì)應(yīng)的值轉(zhuǎn)換成int類(lèi)型,如果無(wú)法轉(zhuǎn)換,默認(rèn)返回0
      #使用int(default=6)或者int(6)時(shí),如果無(wú)法轉(zhuǎn)換則返回指定值6
      msg: "{{ 'a' | int(default=6) }}"
  - debug:
      #將對(duì)應(yīng)的值轉(zhuǎn)換成浮點(diǎn)型,如果無(wú)法轉(zhuǎn)換,默認(rèn)返回'0.0'
      msg: "{{ '8' | float }}"
  - debug:
      #當(dāng)對(duì)應(yīng)的值無(wú)法被轉(zhuǎn)換成浮點(diǎn)型時(shí),則返回指定值’8.8‘
      msg: "{{ 'a' | float(8.88) }}"
  - debug:
      #獲取對(duì)應(yīng)數(shù)值的絕對(duì)值
      msg: "{{ testvar4 | abs }}"
  - debug:
      #四舍五入
      msg: "{{ 12.5 | round }}"
  - debug:
      #取小數(shù)點(diǎn)后五位
      msg: "{{ 3.1415926 | round(5) }}"
  - debug:
      #從0到100中隨機(jī)返回一個(gè)隨機(jī)數(shù)
      msg: "{{ 100 | random }}"
  - debug:
      #從5到10中隨機(jī)返回一個(gè)隨機(jī)數(shù)
      msg: "{{ 10 | random(start=5) }}"
  - debug:
      #從5到15中隨機(jī)返回一個(gè)隨機(jī)數(shù),步長(zhǎng)為3
      #步長(zhǎng)為3的意思是返回的隨機(jī)數(shù)只有可能是5、8、11、14中的一個(gè)
      msg: "{{ 15 | random(start=5,step=3) }}"
  - debug:
      #從0到15中隨機(jī)返回一個(gè)隨機(jī)數(shù),這個(gè)隨機(jī)數(shù)是5的倍數(shù)
      msg: "{{ 15 | random(step=5) }}"
  - debug:
      #從0到15中隨機(jī)返回一個(gè)隨機(jī)數(shù),并將ansible_date_time.epoch的值設(shè)置為隨機(jī)種子
      #也可以使用其他值作為隨機(jī)種子,ansible_date_time.epoch是facts信息
      #seed參數(shù)從ansible2.3版本開(kāi)始可用
      msg: "{{ 15 | random(seed=(ansible_date_time.epoch)) }}"

列表操作相關(guān)的過(guò)濾器

---
- hosts: test70
  remote_user: root
  vars:
    testvar7: [22,18,5,33,27,30]
    testvar8: [1,[7,2,[15,9]],3,5]
    testvar9: [1,'b',5]
    testvar10: [1,'A','b',['QQ','wechat'],'CdEf']
    testvar11: ['abc',1,3,'a',3,'1','abc']
    testvar12: ['abc',2,'a','b','a']
  tasks:
  - debug:
      #返回列表長(zhǎng)度,length與count等效,可以寫(xiě)為count
      msg: "{{ testvar7 | length }}"
  - debug:
      #返回列表中的第一個(gè)值
      msg: "{{ testvar7 | first }}"
  - debug:
      #返回列表中的最后一個(gè)值
      msg: "{{ testvar7 | last }}"
  - debug:
      #返回列表中最小的值
      msg: "{{ testvar7 | min }}"
  - debug:
      #返回列表中最大的值
      msg: "{{ testvar7 | max }}"
  - debug:
      #將列表升序排序輸出
      msg: "{{ testvar7 | sort }}"
  - debug:
      #將列表降序排序輸出
      msg: "{{ testvar7 | sort(reverse=true) }}"
  - debug:
      #返回純數(shù)字非嵌套列表中所有數(shù)字的和
      msg: "{{ testvar7 | sum }}"
  - debug:
      #如果列表中包含列表,那么使用flatten可以'拉平'嵌套的列表
      #2.5版本中可用,執(zhí)行如下示例后查看效果
      msg: "{{ testvar8 | flatten }}"
  - debug:
      #如果列表中嵌套了列表,那么將第1層的嵌套列表‘拉平’
      #2.5版本中可用,執(zhí)行如下示例后查看效果
      msg: "{{ testvar8 | flatten(levels=1) }}"
  - debug:
      #過(guò)濾器都是可以自由結(jié)合使用的,就好像linux命令中的管道符一樣
      #如下,取出嵌套列表中的最大值
      msg: "{{ testvar8 | flatten | max }}"
  - debug:
      #將列表中的元素合并成一個(gè)字符串
      msg: "{{ testvar9 | join }}"
  - debug:
      #將列表中的元素合并成一個(gè)字符串,每個(gè)元素之間用指定的字符隔開(kāi)
      msg: "{{ testvar9 | join(' , ') }}"
  - debug:
      #從列表中隨機(jī)返回一個(gè)元素
      #對(duì)列表使用random過(guò)濾器時(shí),不能使用start和step參數(shù)
      msg: "{{ testvar9 | random }}"
  - debug:
      #從列表中隨機(jī)返回一個(gè)元素,并將ansible_date_time.epoch的值設(shè)置為隨機(jī)種子
      #seed參數(shù)從ansible2.3版本開(kāi)始可用
      msg: "{{ testvar9 | random(seed=(ansible_date_time.epoch)) }}"
  - debug:
      #隨機(jī)打亂順序列表中元素的順序
      #shuffle的字面意思為洗牌
      msg: "{{ testvar9 | shuffle }}"
  - debug:
      #隨機(jī)打亂順序列表中元素的順序
      #在隨機(jī)打亂順序時(shí),將ansible_date_time.epoch的值設(shè)置為隨機(jī)種子
      #seed參數(shù)從ansible2.3版本開(kāi)始可用
      msg: "{{ testvar9 | shuffle(seed=(ansible_date_time.epoch)) }}"
  - debug:
      #將列表中的每個(gè)元素變成純大寫(xiě)
      msg: "{{ testvar10 | upper }}"
  - debug:
      #將列表中的每個(gè)元素變成純小寫(xiě)
      msg: "{{ testvar10 | lower }}"
  - debug:
      #去掉列表中重復(fù)的元素,重復(fù)的元素只留下一個(gè)
      msg: "{{ testvar11 | unique }}"
  - debug:
      #將兩個(gè)列表合并,重復(fù)的元素只留下一個(gè)
      #也就是求兩個(gè)列表的并集
      msg: "{{ testvar11 | union(testvar12) }}"
  - debug:
      #取出兩個(gè)列表的交集,重復(fù)的元素只留下一個(gè)
      msg: "{{ testvar11 | intersect(testvar12) }}"
  - debug:
      #取出存在于testvar11列表中,但是不存在于testvar12列表中的元素
      #去重后重復(fù)的元素只留下一個(gè)
      #換句話說(shuō)就是:兩個(gè)列表的交集在列表1中的補(bǔ)集
      msg: "{{ testvar11 | difference(testvar12) }}"
  - debug:
      #取出兩個(gè)列表中各自獨(dú)有的元素,重復(fù)的元素只留下一個(gè)
      #即去除兩個(gè)列表的交集,剩余的元素
      msg: "{{ testvar11 | symmetric_difference(testvar12) }}"

變量未定義時(shí)相關(guān)操作的過(guò)濾器

---
- hosts: test70
  remote_user: root
  gather_facts: no
  vars:
    testvar6: ''
  tasks:
  - debug:
      #如果變量沒(méi)有定義,則臨時(shí)返回一個(gè)指定的默認(rèn)值
      #注:如果定義了變量,變量值為空字符串,則會(huì)輸出空字符
      #default過(guò)濾器的別名是d
      msg: "{{ testvar5 | default('zsythink') }}"
  - debug:
      #如果變量的值是一個(gè)空字符串或者變量沒(méi)有定義,則臨時(shí)返回一個(gè)指定的默認(rèn)值
      msg: "{{ testvar6 | default('zsythink',boolean=true) }}"
  - debug:
      #如果對(duì)應(yīng)的變量未定義,則報(bào)出“Mandatory variable not defined.”錯(cuò)誤,而不是報(bào)出默認(rèn)錯(cuò)誤
      msg: "{{ testvar5 | mandatory }}"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容