AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 745257
Accepted
Sollosa
Sollosa
Asked: 2023-05-08 16:32:39 +0800 CST2023-05-08 16:32:39 +0800 CST 2023-05-08 16:32:39 +0800 CST

ansible comparando todos os arquivos em 2 diretórios e imprimindo a diferença

  • 772

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"
}
diff
  • 1 1 respostas
  • 29 Views

1 respostas

  • Voted
  1. Best Answer
    Vladimir Botka
    2023-05-08T19:00:42+08:002023-05-08T19:00:42+08:00

    Por exemplo, dados os arquivos

    shell> ssh admin@test_11 ls -1 /tmp/dir[1,2]
    /tmp/dir1:
    file1
    file2
    
    /tmp/dir2:
    file1
    file2
    
    shell> ssh admin@test_13 ls -1 /tmp/dir[1,2]
    /tmp/dir1:
    
    /tmp/dir2:
    

    e as diferenças

    shell> ssh admin@test_11 diff /tmp/dir1/file1 /tmp/dir2/file1
    31,32d30
    < User1:*:1002:1004:My User1:/home/User1:/bin/sh
    < MyUser1:*:1003:1005:My User1:/home/MyUser1:/bin/sh
    
    shell> ssh admin@test_11 diff /tmp/dir1/file2 /tmp/dir2/file2
    33,34d32
    < alice:*:1004:1006:Alice:/home/alice:/bin/sh
    < bob:*:1005:1007:Bob:/home/bob:/bin/sh
    
    

    Declare as variáveis

      dir1: /tmp/dir1
      dir2: /tmp/dir2
      dir1_files: "{{ out_dir1.files|map(attribute='path') }}"
      dir2_files: "{{ out_dir2.files|map(attribute='path') }}"
    

    e encontre os arquivos

        - find:
            paths: "{{ dir1 }}"
            file_type: file
          register: out_dir1
        - find:
            paths: "{{ dir2 }}"
            file_type: file
          register: out_dir2
    

    Encontre os arquivos compartilhados. Declare a variável

      files_common: "{{ dir1_files|map('basename')|
                        intersect(dir2_files|map('basename')) }}"
    

    fornece (resumido) para test_11 e test_13, respectivamente

      files_common:
      - file1
      - file2
    
      files_common: []
    

    Compare os arquivos compartilhados. Você tem que ignorar os erros porque diff retorna rc=1 se os arquivos forem diferentes

      - command: "diff {{ dir1 }}/{{ item }} {{ dir2 }}/{{ item }}"
        loop: "{{ files_common }}"
        ignore_errors: true
        register: out_diff
    

    e criar o relatório

        - debug:
            msg: |
              {% for i in out_diff.results %}
              {{ i.cmd|join(' ') }}: |
                {{ i.stdout|indent(2) }}
              {% endfor %}
    

    fornece (resumido) para test_11 e test_13, respectivamente

      msg: |-
        diff /tmp/dir1/file1 /tmp/dir2/file1: |
          31,32d30
          < User1:*:1002:1004:My User1:/home/User1:/bin/sh
          < MyUser1:*:1003:1005:My User1:/home/MyUser1:/bin/sh
        diff /tmp/dir1/file2 /tmp/dir2/file2: |
          33,34d32
          < alice:*:1004:1006:Alice:/home/alice:/bin/sh
          < bob:*:1005:1007:Bob:/home/bob:/bin/sh
    
      msg: ""
    

    Exemplo de um playbook completo para testes

    - hosts: all
    
      vars:
    
        dir1: /tmp/dir1
        dir2: /tmp/dir2
        dir1_files: "{{ out_dir1.files|map(attribute='path') }}"
        dir2_files: "{{ out_dir2.files|map(attribute='path') }}"
        files_common: "{{ dir1_files|map('basename')|
                          intersect(dir2_files|map('basename')) }}"
        
        
      tasks:
    
        - find:
            paths: "{{ dir1 }}"
            file_type: file
          register: out_dir1
        - find:
            paths: "{{ dir2 }}"
            file_type: file
          register: out_dir2
        - debug:
            var: files_common
    
        - command: "diff {{ dir1 }}/{{ item }} {{ dir2 }}/{{ item }}"
          loop: "{{ files_common }}"
          ignore_errors: true
          register: out_diff
        - debug:
            msg: |
              {% for i in out_diff.results %}
              {{ i.cmd|join(' ') }}: |
                {{ i.stdout|indent(2) }}
              {% endfor %}
    

    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

        - debug:
            msg: |
              {% for i in out_diff.results %}
              {{ i.cmd.1|basename }} from {{ i.cmd.1|dirname }}: 
                {{ i.stdout|indent(2) }}
              {{ i.cmd.2|basename }} from {{ i.cmd.2|dirname }}: 
                {{ i.stdout|indent(2) }}
              {% endfor %}
    

    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

    shell> ANSIBLE_STDOUT_CALLBACK=default ANSIBLE_CALLBACK_RESULT_FORMAT=yaml ansible-playbook pb.yml
    
      ...
    ok: [test_11] => 
        msg: |-
            file1 from /tmp/dir1:
              31,32d30
              < User1:*:1002:1004:My User1:/home/User1:/bin/sh
              < MyUser1:*:1003:1005:My User1:/home/MyUser1:/bin/sh
            file1 from /tmp/dir2:
              31,32d30
              < User1:*:1002:1004:My User1:/home/User1:/bin/sh
              < MyUser1:*:1003:1005:My User1:/home/MyUser1:/bin/sh
            file2 from /tmp/dir1:
              33,34d32
              < alice:*:1004:1006:Alice:/home/alice:/bin/sh
              < bob:*:1005:1007:Bob:/home/bob:/bin/sh
            file2 from /tmp/dir2:
              33,34d32
              < alice:*:1004:1006:Alice:/home/alice:/bin/sh
              < bob:*:1005:1007:Bob:/home/bob:/bin/sh
    ok: [test_13] => 
        msg: ""
    

    Ver

    shell> ansible-doc -t callback ansible.builtin.default
    
    • 2

relate perguntas

  • Diff nomes de arquivos de dois diretórios?

  • Usando a saída de diff -e com sed

  • diff de arquivos de configuração mostrando apenas linhas não comentadas

  • Determine se duas imagens iso são iguais

  • git: use visual diff (meld) somente quando estiver na GUI

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve