Execute cópia e defina apenas se algo mudou

2

Para Ansible, eu tenho um papel que define o fuso horário e preenche a configuração do sistema básico (Ubuntu),

- name: set timezone
  copy: content='Europe/Berlin'
        dest=/etc/timezone
        owner=root
        group=root
        mode=0644
        backup=yes

- name: update timezone
  command: dpkg-reconfigure --frontend noninteractive tzdata

Esses dois comandos são executados, não importa o quê. Isso significa que quando o Ansible é executado duas vezes para o mesmo destino, um ainda recebe um changed=2 no resumo do resultado,

default                    : ok=41   changed=2    unreachable=0    failed=0

Idealmente, tudo deve ser ok na segunda execução.

Embora eu esteja supondo que o update timezone deva ter algum tipo de dependência do set timezone , não sei ao certo como fazer isso da melhor maneira.

    
por Nico Schlömer 07.09.2015 / 13:22

4 respostas

6

Você pode fazer isso usando register e when changed .

Ao usar registrar , o resultado do comando copy é salvo em uma variável. Esta variável pode então ser utilizada para criar uma when condicional na tarefa atualizar fuso horário .

Além disso, adicione uma quebra de linha \n no final do conteúdo do fuso horário, caso contrário, o Ansible sempre executará a cópia .

- name: set timezone
  copy: content='Europe/Berlin\n'
        dest=/etc/timezone
        owner=root
        group=root
        mode=0644
        backup=yes
  register: timezone

- name: update timezone
  command: dpkg-reconfigure --frontend noninteractive tzdata
  when: timezone.changed

Mas você também pode resolver esse problema criando um handler para o comando dpkg-reconfigure conforme descrito aqui :

tasks:
  - name: Set timezone variables
    copy: content='Europe/Berlin\n'
          dest=/etc/timezone
          owner=root
          group=root
          mode=0644
          backup=yes
    notify:
      - update timezone
handlers:
 - name: update timezone
   command: dpkg-reconfigure --frontend noninteractive tzdata
    
por 07.09.2015 / 13:29
3

Você só precisa registrar uma variável para o copy play e, em seguida, verificar se tem changed .

Por exemplo:

- name: make a file
  copy: ...
  register: whatever

- name: run a command
  command: ...
  when: whatever.changed
    
por 07.09.2015 / 13:29
2

Dependendo da versão do Ubuntu usada com os recursos do systemd, também pode ser útil:

- name: Set timezone
  command: timedatectl set-timezone Europe/Berlin
  changed_when: false
    
por 08.09.2015 / 19:56
1

Para definir um fuso horário com Ansible (> = 1.6) no Ubuntu, use o comando locale_gen .

- name: set timezone
  locale_gen: name=Europe/Berlin state=present

Nota: locale_gen é um módulo extra que atualmente é fornecido com o Ansible. pode ser removido em versões futuras.

    
por 09.10.2015 / 05:56