我有2个目录
$ tree dir{1..2}
dir1
├── file1
└── file2
dir2
├── file1
└── file2
我想使用 ansible 将 dir1 中的所有文件与 dir2 中的所有文件进行比较,并像这样打印差异
output:
${file1} from ${dir1}:
diff content
${file1} from ${dir2}:
diff content
它将遍历所有文件以打印它们的差异
下面是需要修改的ansible片段
---
- name: Compare files in two directories
hosts: localhost
gather_facts: false
tasks:
- name: Find files in directory 1
find:
paths: ~/dir1
file_type: file
register: dir1_files
- name: Find files in directory 2
find:
paths: ~/dir2
file_type: file
register: dir2_files
- name: Compare files
shell: diff dir1/file1 dir2/file1 ## how can I make sure path changes but filenames stay same using variables
loop: "{{ dir1_files.files }}"
register: diff_output
changed_when: false
failed_when: diff_output.rc == 1
- name: Print differences
debug:
msg: |
{{ item.item.path }} from dir1:
{{ item.stdout }}
{{ item.item.path }} from dir2:
{{ item.stdout }}
loop: "{{ diff_output.results }}"
when: item.stdout_lines | length > 0
对于 Vladimir 的回答中的建议代码,我得到以下输出
TASK [debug] *****************************************************************************************************************************************
ok: [localhost] => {
"msg": "file2 from dir1: \n 1,2c1,2\n < abc123\n < def456\n ---\n > abc101\n > def111\nfile2 from dir2: \n 1,2c1,2\n < abc123\n < def456\n ---\n > abc101\n > def111\nfile1 from dir1: \n 1,2c1,2\n < 123abc\n < 456def\n ---\n > 101abc\n > 111def\nfile1 from dir2: \n 1,2c1,2\n < 123abc\n < 456def\n ---\n > 101abc\n > 111def\n"
}
例如,给定文件
和差异
声明变量
并找到文件
找到共享文件。声明变量
分别为 test_11 和 test_13 给出(删节)
比较共享文件。您必须忽略这些错误,因为如果文件不同,diff将返回rc=1
并创建报告
分别为 test_11 和 test_13 给出(删节)
用于测试的完整剧本示例
问:“我不喜欢 msg 模块输出,我更喜欢输出部分中类似于 Q 中给出的格式,它可以实现吗?”
答:当然。试试下面的模板。如果这不是您喜欢的,请编辑您的问题并提供您更喜欢的示例
输出的格式取决于回调。请参阅DEFAULT_STDOUT_CALLBACK。如果你使用ansible.builtin.default回调设置 ANSIBLE_CALLBACK_RESULT_FORMAT=yaml
看