tenho 2 diretórios
$ tree dir{1..2}
dir1
├── file1
└── file2
dir2
├── file1
└── file2
Eu quero comparar todos os arquivos em dir1 com todos os arquivos em dir2 usando ansible e diferenças de impressão como esta
output:
${file1} from ${dir1}:
diff content
${file1} from ${dir2}:
diff content
e fará um loop por todos os arquivos para imprimir suas diferenças
abaixo está um snippet ansible que precisa ser modificado
---
- 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
Para o código sugerido na resposta de Vladimir, recebo a saída abaixo
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"
}
Por exemplo, dados os arquivos
e as diferenças
Declare as variáveis
e encontre os arquivos
Encontre os arquivos compartilhados. Declare a variável
fornece (resumido) para test_11 e test_13, respectivamente
Compare os arquivos compartilhados. Você tem que ignorar os erros porque diff retorna rc=1 se os arquivos forem diferentes
e criar o relatório
fornece (resumido) para test_11 e test_13, respectivamente
Exemplo de um playbook completo para testes
P: "A saída do módulo msg não é do meu agrado, prefiro um formato semelhante ao fornecido em Q dentro da seção de saída, pode ser obtido?"
R: Claro. Experimente o modelo abaixo. Se não é disso que você gosta, edite sua pergunta e forneça um exemplo do que você gosta mais
O formato da saída depende do retorno de chamada. Consulte DEFAULT_STDOUT_CALLBACK . Se você usar o conjunto de retorno de chamada ansible.builtin.default ANSIBLE_CALLBACK_RESULT_FORMAT=yaml
Ver