Ansible—— 35. playbook 過濾器

1. 過濾器初識

獲取到的變量的值中的所有字母都變成大寫

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

2. 字符串過濾器

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

2. 數字過濾器

---
- hosts: test70
  remote_user: root
  vars:
    testvar4: -1
  tasks:
  - debug:
      #將對應的值轉換成int類型
      #ansible中,字符串和整形不能直接計算,比如{{ 8+'8' }}會報錯
      #所以,我們可以把一個值爲數字的字符串轉換成整形後再做計算
      msg: "{{ 8+('8' | int) }}"
  - debug:
      #將對應的值轉換成int類型,如果無法轉換,默認返回0
      #使用int(default=6)或者int(6)時,如果無法轉換則返回指定值6
      msg: "{{ 'a' | int(default=6) }}"
  - debug:
      #將對應的值轉換成浮點型,如果無法轉換,默認返回'0.0'
      msg: "{{ '8' | float }}"
  - debug:
      #當對應的值無法被轉換成浮點型時,則返回指定值’8.8‘
      msg: "{{ 'a' | float(8.88) }}"
  - debug:
      #獲取對應數值的絕對值
      msg: "{{ testvar4 | abs }}"
  - debug:
      #四捨五入
      msg: "{{ 12.5 | round }}"
  - debug:
      #取小數點後五位
      msg: "{{ 3.1415926 | round(5) }}"
  - debug:
      #從0到100中隨機返回一個隨機數
      msg: "{{ 100 | random }}"
  - debug:
      #從5到10中隨機返回一個隨機數
      msg: "{{ 10 | random(start=5) }}"
  - debug:
      #從5到15中隨機返回一個隨機數,步長爲3
      #步長爲3的意思是返回的隨機數只有可能是5、8、11、14中的一個
      msg: "{{ 15 | random(start=5,step=3) }}"
  - debug:
      #從0到15中隨機返回一個隨機數,這個隨機數是5的倍數
      msg: "{{ 15 | random(step=5) }}"
  - debug:
      #從0到15中隨機返回一個隨機數,並將ansible_date_time.epoch的值設置爲隨機種子
      #也可以使用其他值作爲隨機種子,ansible_date_time.epoch是facts信息
      #seed參數從ansible2.3版本開始可用
      msg: "{{ 15 | random(seed=(ansible_date_time.epoch)) }}"

3. 列表過濾器

---
- 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:
      #返回列表長度,length與count等效,可以寫爲count
      msg: "{{ testvar7 | length }}"
  - debug:
      #返回列表中的第一個值
      msg: "{{ testvar7 | first }}"
  - debug:
      #返回列表中的最後一個值
      msg: "{{ testvar7 | last }}"
  - debug:
      #返回列表中最小的值
      msg: "{{ testvar7 | min }}"
  - debug:
      #返回列表中最大的值
      msg: "{{ testvar7 | max }}"
  - debug:
      #將列表升序排序輸出
      msg: "{{ testvar7 | sort }}"
  - debug:
      #將列表降序排序輸出
      msg: "{{ testvar7 | sort(reverse=true) }}"
  - debug:
      #返回純數字非嵌套列表中所有數字的和
      msg: "{{ testvar7 | sum }}"
  - debug:
      #如果列表中包含列表,那麼使用flatten可以'拉平'嵌套的列表
      #2.5版本中可用,執行如下示例後查看效果
      msg: "{{ testvar8 | flatten }}"
  - debug:
      #如果列表中嵌套了列表,那麼將第1層的嵌套列表‘拉平’
      #2.5版本中可用,執行如下示例後查看效果
      msg: "{{ testvar8 | flatten(levels=1) }}"
  - debug:
      #過濾器都是可以自由結合使用的,就好像linux命令中的管道符一樣
      #如下,取出嵌套列表中的最大值
      msg: "{{ testvar8 | flatten | max }}"
  - debug:
      #將列表中的元素合併成一個字符串
      msg: "{{ testvar9 | join }}"
  - debug:
      #將列表中的元素合併成一個字符串,每個元素之間用指定的字符隔開
      msg: "{{ testvar9 | join(' , ') }}"
  - debug:
      #從列表中隨機返回一個元素
      #對列表使用random過濾器時,不能使用start和step參數
      msg: "{{ testvar9 | random }}"
  - debug:
      #從列表中隨機返回一個元素,並將ansible_date_time.epoch的值設置爲隨機種子
      #seed參數從ansible2.3版本開始可用
      msg: "{{ testvar9 | random(seed=(ansible_date_time.epoch)) }}"
  - debug:
      #隨機打亂順序列表中元素的順序
      #shuffle的字面意思爲洗牌
      msg: "{{ testvar9 | shuffle }}"
  - debug:
      #隨機打亂順序列表中元素的順序
      #在隨機打亂順序時,將ansible_date_time.epoch的值設置爲隨機種子
      #seed參數從ansible2.3版本開始可用
      msg: "{{ testvar9 | shuffle(seed=(ansible_date_time.epoch)) }}"
  - debug:
      #將列表中的每個元素變成純大寫
      msg: "{{ testvar10 | upper }}"
  - debug:
      #將列表中的每個元素變成純小寫
      msg: "{{ testvar10 | lower }}"
  - debug:
      #去掉列表中重複的元素,重複的元素只留下一個
      msg: "{{ testvar11 | unique }}"
  - debug:
      #將兩個列表合併,重複的元素只留下一個
      #也就是求兩個列表的並集
      msg: "{{ testvar11 | union(testvar12) }}"
  - debug:
      #取出兩個列表的交集,重複的元素只留下一個
      msg: "{{ testvar11 | intersect(testvar12) }}"
  - debug:
      #取出存在於testvar11列表中,但是不存在於testvar12列表中的元素
      #去重後重復的元素只留下一個
      #換句話說就是:兩個列表的交集在列表1中的補集
      msg: "{{ testvar11 | difference(testvar12) }}"
  - debug:
      #取出兩個列表中各自獨有的元素,重複的元素只留下一個
      #即去除兩個列表的交集,剩餘的元素
      msg: "{{ testvar11 | symmetric_difference(testvar12) }}"

4. 變量過濾器

---
- hosts: test70
  remote_user: root
  gather_facts: no
  vars:
    testvar6: ''
  tasks:
  - debug:
      #如果變量沒有定義,則臨時返回一個指定的默認值
      #注:如果定義了變量,變量值爲空字符串,則會輸出空字符
      #default過濾器的別名是d
      msg: "{{ testvar5 | default('zsythink') }}"
  - debug:
      #如果變量的值是一個空字符串或者變量沒有定義,則臨時返回一個指定的默認值
      msg: "{{ testvar6 | default('zsythink',boolean=true) }}"
  - debug:
      #如果對應的變量未定義,則報出“Mandatory variable not defined.”錯誤,而不是報出默認錯誤
      msg: "{{ testvar5 | mandatory }}"

5. "可有可無"過濾器

一共定義了3個文件,只有第一個文件指定了權限,第二個文件和第三個文件沒有指定任何權限,這樣定義目的是,當這三個文件在目 標主機中創建時,只有第一個文件按照指定的權限被創建,之後的兩個文件都按照操作系統的默認權限進行創建,在實際工作中,你獲得列表中可能有幾十個這樣的文件需要被創建,這些文件中,有些文件需要特定的權限,有些不需要,所以,可能需要使用循環來處理這 個問題,但是在使用循環時,會遇到另一個問題,有的文件有mode屬性,有的文件沒有mode屬性。

  vars:
    paths:
      - path: /tmp/testfile
        mode: '0444'
      - path: /tmp/foo
      - path: /tmp/bar

使用file模塊在目標主機中創建文件,一共循環了兩遍,因爲我們需要對文件是否有 mode屬性進行判斷,然後根據判斷結果調整file模塊的參數設定。

- hosts: test70
  remote_user: root
  gather_facts: no
  vars:
    paths:
      - path: /tmp/test
        mode: '0444'
      - path: /tmp/foo
      - path: /tmp/bar
  tasks:
  - file: dest={{item.path}} state=touch mode={{item.mode}}
    with_items: "{{ paths }}"
    when: item.mode is defined
  - file: dest={{item.path}} state=touch
    with_items: "{{ paths }}"
    when: item.mode is undefined

並沒有對文件是否有mode屬性進行判斷,而是直接調用了file模塊的mode參數,將mode參數的值設定爲了" {{item.mode | default(omit)}}",這是什麼意思呢?它的意思是,如果item有mode屬性,就把file模塊的mode參數的值設置爲item的 mode屬性的值,如果item沒有mode屬性,file模塊就直接省略mode參數,'omit’的字面意思就是"省略",換成大白話說就是:[有就 用,沒有就不用,可以有,也可以沒有],所謂的"可有可無"就是這個意思。

- hosts: test70
  remote_user: root
  gather_facts: no
  vars:
    paths:
      - path: /tmp/test
        mode: '0444'
      - path: /tmp/foo
      - path: /tmp/bar
  tasks:
  - file: dest={{item.path}} state=touch mode={{item.mode | default(omit)}}
    with_items: "{{ paths }}"

6. 利用過濾器進行格式轉換

vim /testdir/ansible/wsCdnLogList
{"logs":[{"domainName":"asia1.cdn.test.com","files":[{"dateFrom":"2018-09-05-0000","dateTo":"2018-09-05-2359","logUrl":"http://log.testcd.com/log/zsy/asia1.cdn.test.com/2018-09-05-0000-2330_asia1.cdn.test.com.all.log.gz?wskey=XXXXX5a","fileSize":254,"fileName":"2018-09-05-0000-2330_asia1.cdn.test.com.all.log.gz","fileMd5":"error"}]},{"domainName":"image1.cdn.test.com","files":[{"dateFrom":"2018-09-05-2200","dateTo":"2018-09-05-2259","logUrl":"http://log.testcd.com/log/zsy/image1.cdn.test.com/2018-09-05-2200-2230_image1.cdn.test.com.cn.log.gz?wskey=XXXXX1c","fileSize":10509,"fileName":"2018-09-05-2200-2230_image1.cdn.test.com.cn.log.gz","fileMd5":"error"},{"dateFrom":"2018-09-05-2300","dateTo":"2018-09-05-2359","logUrl":"http://log.testcd.com/log/zsy/image1.cdn.test.com/2018-09-05-2300-2330_image1.cdn.test.com.cn.log.gz?wskey=XXXXXfe","fileSize":5637,"fileName":"2018-09-05-2300-2330_image1.cdn.test.com.cn.log.gz","fileMd5":"error"}]}]}
---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - include_vars:
      file: "/testdir/ansible/wsCdnLogList"
      name: testvar
  - debug:
      msg: "{{ testvar }}"

json是yaml的子集,yaml是json的超集,yaml格式的數據和json格式的數據是可以互相轉換的,所以,對於 ansible來說,當我們把上例中的json數據文件當做變量文件引入時,就好像引入了一個我們定義好的yaml格式的變量文件一樣,對於 ansible來說是沒有區別的,而且,即使在變量文件中使用yaml格式定義了變量,在使用debug模塊輸出變量信息時,ansible也會自動將 yaml格式的數據轉化爲json格式後進行輸出,json數據轉換成yaml的格式。通過with_subelements循環,獲取到當前整個大列表中的所有日誌的logUrl屬性。

logs:
-   domainName: asia1.cdn.test.com
    files:
    -   dateFrom: 2018-09-05-0000
        dateTo: 2018-09-05-2359
        fileMd5: error
        fileName: 2018-09-05-0000-2330_asia1.cdn.test.com.all.log.gz
        fileSize: 254
        logUrl: http://log.testcd.com/log/zsy/asia1.cdn.test.com/2018-09-05-0000-2330_asia1.cdn.test.com.all.log.gz?wskey=XXXXX5a
-   domainName: image1.cdn.test.com
    files:
    -   dateFrom: 2018-09-05-2200
        dateTo: 2018-09-05-2259
        fileMd5: error
        fileName: 2018-09-05-2200-2230_image1.cdn.test.com.cn.log.gz
        fileSize: 10509
        logUrl: http://log.testcd.com/log/zsy/image1.cdn.test.com/2018-09-05-2200-2230_image1.cdn.test.com.cn.log.gz?wskey=XXXXX1c
    -   dateFrom: 2018-09-05-2300
        dateTo: 2018-09-05-2359
        fileMd5: error
        fileName: 2018-09-05-2300-2330_image1.cdn.test.com.cn.log.gz
        fileSize: 5637
        logUrl: http://log.testcd.com/log/zsy/image1.cdn.test.com/2018-09-05-2300-2330_image1.cdn.test.com.cn.log.gz?wskey=XXXXXfe
  tasks:
  - include_vars:
      file: "/testdir/ansible/wsCdnLogList"
      name: testvar
  - debug:
      msg: "{{ item.1.logUrl }}"
    with_subelements:
    - "{{testvar.logs}}"
    - files

json_query過濾器

json格式需要被json_query過濾器轉換的的數據
{
  "users": [
    {
      "name": "tom",
      "age": 18
    },
    {
      "name": "jerry",
      "age": 20
    }
  ]
}

yaml格式需要被json_query過濾器轉換的的數據

---
users:
- name: tom
  age: 18
- name: jerry
  age: 20

json_query(‘users[*].name’)表示找到users列表中所有元素的name屬性

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - include_vars:
      file: "/testdir/ansible/testvarfile"
      name: testvar
  - debug:
      msg: "{{ testvar | json_query('users[*].name') }}"
vim /testdir/ansible/testvarfile1
---
test:
  users:
  - name: tom
    age: 18
    hobby:
    - Skateboard
    - VideoGame
  - name: jerry
    age: 20
    hobby:
    - Music
---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - include_vars:
      file: "/testdir/ansible/testvarfile1"
      name: testvar
  - debug:
      msg: "{{ testvar | json_query('test.users[*].hobby[*]') }}"

json_query(‘test.users[?name==tom].hobby[*]’)表示只查找users列表中 name屬性等於tom的hobby信息,你肯定發現了,上例中,我們使用了"反引號"將tom引起來了,這是因爲當你在添加查詢條件時,對需要爲對應的 值添加引號,但是,上例中msg的值的外側已經存在一對雙引號,雙引號內又有一對單引號,所以,爲了不讓引號之間互相沖突,此處使用反引號將tom引起。

  tasks:
  - include_vars:
      file: "/testdir/ansible/testvarfile1"
      name: testvar
  - debug:
      msg: "{{ testvar | json_query('test.users[?name==`tom`].hobby[*]') }}"

除了使用反引號,也可以用querystring

  tasks:
  - include_vars:
      file: "/testdir/ansible/testvarfile1"
      name: testvar
  - debug:
      msg: "{{ testvar | json_query(querystring) }}"
    vars:
      querystring: "test.users[?name=='tom'].age"

同時獲取多個屬性值時,需要通過鍵值對的方式調用屬性

  tasks:
  - include_vars:
      file: "/testdir/ansible/testvarfile1"
      name: testvar
  - debug:
      msg: "{{ testvar | json_query('test.users[*].{uname:name,uage:age}') }}"

使用json_query過濾器找到cdn廠商返回的json數據中的所有日誌的logUrl

---
- hosts: test70
  remote_user: root
  gather_facts: no
  vars_files:
  - /testdir/ansible/wsCdnLogList
  tasks:
  - debug:
      msg: "{{item}}"
    with_items: "{{ logs | json_query('[*].files[*].logUrl') }}"

7. 常用過濾器

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  ######################################################################
  #在調用shell模塊時,如果引用某些變量時需要添加引號,則可以使用quote過濾器代替引號
  #示例如下,先看示例,後面會有註解
  - shell: "echo {{teststr | quote}} > /testdir/testfile"
    vars:
      teststr: "a\nb\nc"
  #上例中shell模塊的寫法與如下寫法完全等效
  #shell: "echo '{{teststr}}' > /testdir/testfile"
  #沒錯,如你所見,quote過濾器能夠代替引號
  #上例中,如果不對{{teststr}}添加引號,則會報錯,因爲teststr變量中包含"\n"轉義符
  ######################################################################
  #ternary過濾器可以實現三元運算的效果 示例如下
  #如下示例表示如果name變量的值是John,那麼對應的值則爲Mr,否則則爲Ms
  #簡便的實現類似if else對變量賦值的效果
  - debug: 
      msg: "{{ (name == 'John') | ternary('Mr','Ms') }}"
    vars:
      name: "John"
  ######################################################################
  #basename過濾器可以獲取到一個路徑字符串中的文件名
  - debug:
      msg: "{{teststr | basename}}"
    vars:
      teststr: "/testdir/ansible/testfile"
  ######################################################################
  #獲取到一個windows路徑字符串中的文件名,2.0版本以後的ansible可用
  - debug:
      msg: "{{teststr | win_basename}}"
    vars:
      teststr: 'D:\study\zsythink'
  ######################################################################
  #dirname過濾器可以獲取到一個路徑字符串中的路徑名
  - debug:
      msg: "{{teststr | dirname}}"
    vars:
      teststr: "/testdir/ansible/testfile"
  ######################################################################
  #獲取到一個windows路徑字符串中的文件名,2.0版本以後的ansible可用
  - debug:
      msg: "{{teststr | win_dirname}}"
    vars:
      teststr: 'D:\study\zsythink'
  ######################################################################
  #將一個windows路徑字符串中的盤符和路徑分開,2.0版本以後的ansible可用
  - debug:
      msg: "{{teststr | win_splitdrive}}"
    vars:
      teststr: 'D:\study\zsythink'
  #可以配合之前總結的過濾器一起使用,比如只獲取到盤符,示例如下
  #msg: "{{teststr | win_splitdrive | first}}"
  #可以配合之前總結的過濾器一起使用,比如只獲取到路徑,示例如下
  #msg: "{{teststr | win_splitdrive | last}}"
  ######################################################################
  #realpath過濾器可以獲取軟鏈接文件所指向的真正文件
  - debug:
      msg: "{{ path | realpath }}"
    vars:
      path: "/testdir/ansible/testsoft"
  ######################################################################
  #relpath過濾器可以獲取到path對於“指定路徑”來說的“相對路徑”
  - debug:
      msg: "{{ path | relpath('/testdir/testdir') }}"
    vars:
      path: "/testdir/ansible"
  ######################################################################
  #splitext過濾器可以將帶有文件名後綴的路徑從“.後綴”部分分開
  - debug:
      msg: "{{ path | splitext }}"
    vars:
      path: "/etc/nginx/conf.d/test.conf"
  #可以配置之前總結的過濾器,獲取到文件後綴
  #msg: "{{ path | splitext | last}}"
  #可以配置之前總結的過濾器,獲取到文件前綴名
  #msg: "{{ path | splitext | first | basename}}"
  ######################################################################
  #to_uuid過濾器能夠爲對應的字符串生成uuid
  - debug:
      msg: "{{ teststr | to_uuid }}"
    vars:
      teststr: "This is a test statement" 
  ######################################################################
  #bool過濾器可以根據字符串的內容返回bool值true或者false
  #字符串的內容爲yes、1、True、true則返回布爾值true,字符串內容爲其他內容則返回false
  - debug:
      msg: "{{ teststr | bool }}"
    vars:
      teststr: "1"
  #當和用戶交互時,有可能需要用戶從兩個選項中選擇一個,比如是否繼續,
  #這時,將用戶輸入的字符串通過bool過濾器處理後得出布爾值,從而進行判斷,比如如下用法
  #- debug:
  #    msg: "output when bool is true"
  #  when: some_string_user_input | bool
  ######################################################################
  #map過濾器可以從列表中獲取到每個元素所共有的某個屬性的值,並將這些值組成一個列表
  #當列表中嵌套了列表,不能越級獲取屬性的值,也就是說只能獲取直接子元素的共有屬性值。
  - vars:
      users:
      - name: tom
        age: 18
        hobby:
        - Skateboard
        - VideoGame
      - name: jerry
        age: 20
        hobby:
        - Music
    debug:
      msg: "{{ users | map(attribute='name') | list }}"
  #也可以組成一個字符串,用指定的字符隔開,比如分號
  #msg: "{{ users | map(attribute='name') | join(';') }}"
  ######################################################################
  #與python中的用法相同,兩個日期類型相減能夠算出兩個日期間的時間差
  #下例中,我們使用to_datatime過濾器將字符串類型轉換成了日期了類型,並且算出了時間差
  - debug:
      msg: '{{ ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 19:00:00" | to_datetime) }}'
  #默認情況下,to_datatime轉換的字符串的格式必須是“%Y-%m-%d %H:%M:%S”
  #如果對應的字符串不是這種格式,則需要在to_datetime中指定與字符串相同的時間格式,才能正確的轉換爲時間類型
  - debug:
      msg: '{{ ("20160814"| to_datetime("%Y%m%d")) - ("2012-12-25 19:00:00" | to_datetime) }}'
  #如下方法可以獲取到兩個日期之間一共相差多少秒
  - debug:
      msg: '{{ ( ("20160814"| to_datetime("%Y%m%d")) - ("20121225" | to_datetime("%Y%m%d")) ).total_seconds() }}'
  #如下方法可以獲取到兩個日期“時間位”相差多少秒,注意:日期位不會納入對比計算範圍
  #也就是說,下例中的2016-08-14和2012-12-25不會納入計算範圍
  #只是計算20:00:12與08:30:00相差多少秒
  #如果想要算出連帶日期的秒數差則使用total_seconds()
  - debug:
      msg: '{{ ( ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 08:30:00" | to_datetime) ).seconds }}'
  #如下方法可以獲取到兩個日期“日期位”相差多少天,注意:時間位不會納入對比計算範圍
  - debug:
      msg: '{{ ( ("2016-08-14 20:00:12"| to_datetime) - ("2012-12-25 08:30:00" | to_datetime) ).days }}'
  ######################################################################
  #使用base64編碼方式對字符串進行編碼
  - debug:
      msg: "{{ 'hello' | b64encode }}"
  #使用base64編碼方式對字符串進行解碼
  - debug:
      msg: "{{ 'aGVsbG8=' | b64decode }}"
  #######################################################################
  #使用sha1算法對字符串進行哈希
  - debug:
      msg: "{{ '123456' | hash('sha1') }}"
  #使用md5算法對字符串進行哈希
  - debug:
      msg: "{{ '123456' | hash('md5') }}"
  #獲取到字符串的校驗和,與md5哈希值一致
  - debug:
      msg: "{{ '123456' | checksum }}"
  #使用blowfish算法對字符串進行哈希,注:部分系統支持
  - debug:
      msg: "{{ '123456' | hash('blowfish') }}"
  #使用sha256算法對字符串進行哈希,哈希過程中會生成隨機"鹽",以便無法直接對比出原值
  - debug:
      msg: "{{ '123456' | password_hash('sha256') }}"
  #使用sha256算法對字符串進行哈希,並使用指定的字符串作爲"鹽"
  - debug:
      msg: "{{ '123456' | password_hash('sha256','mysalt') }}"
  #使用sha512算法對字符串進行哈希,哈希過程中會生成隨機"鹽",以便無法直接對比出原值
  - debug:
      msg: "{{ '123123' | password_hash('sha512') }}"
  #使用sha512算法對字符串進行哈希,並使用指定的字符串作爲"鹽"
  - debug:
      msg: "{{ '123123' | password_hash('sha512','ebzL.U5cjaHe55KK') }}"
  #如下方法可以冪等的爲每個主機的密碼生成對應哈希串
  #有了之前總結的過濾器用法作爲基礎,你一定已經看懂了
  - debug:
      msg: "{{ '123123' | password_hash('sha512', 65534|random(seed=inventory_hostname)|string) }}"

————Blueicex 2020/3/30 09:19 [email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章