使用ansible的过滤器完成的代码片:
file_list.yml
---
files:
- name: /tmp/test/group
checksum: 337ee88100ee84085665203d5198a50dd02321cf
- name: /tmp/test/hosts
checksum: 06964fa0fc063de59135e09a48eab879a5bdc068
checksum.yml
---
- hosts: localhost
gather_facts: false
vars_files:
- file_list.yml
tasks:
- name: check file sum
vars:
- check1: "{{ item.checksum }}"
- check2: "{{ lookup('file','{{ item.name }}') | hash('sha1') }}"
assert:
fail_msg: "Check fail! file: {{ item.name }}"
success_msg: "Check success! file: {{ item.name }}"
that:
- check1 == check2
loop: "{{ files }}"
ignore_errors: true
但是运行后问题出现了,即使文件里存放的checksum值与sha1sum算出的值一致也判断为不相等,那么问题在于哪里呢。
经过排查发现,使用lookup的file提取出的文件由于包含换行(即“\n”),就会出现sha1匹配不成功的现象。
修改checksum.yml:
checksum.yml
- hosts: localhost
gather_facts: false
vars_files:
- file_list.yml
tasks:
- name: save vars
shell: "sha1sum {{ item.name }}"
register: check2
loop: "{{ files }}"
- name: check sha1sum
vars:
- flag: [ 0 , 1 ]
- check1: "{{ item.0.checksum }}"
assert:
fail_msg: "Check fail! file: {{ item.0.name }}"
success_msg: "Check success! file: {{ item.0.name }}"
that:
- check1 == check2.result[item.1].stdout | regex_replace(' .*$')
with_together:
- "{{ files }}"
- "{{ flag }}"
ignore_errors: true
成功解决