Ansible: copie o modelo somente quando o arquivo de destino não existir

44

Estou usando Ansible 1.6.6 para provisionar minha máquina.

Existe uma tarefa de modelo no meu manual que cria o ficheiro de destino do modelo Jinja2:

tasks:
    - template: src=somefile.j2 dest=/etc/somefile.conf

Eu não quero substituir somefile.conf se ele já existir. É possível com Ansible? Se sim, como?

    
por Slava Fomin II 05.07.2014 / 13:10

4 respostas

54

Você pode verificar a existência do arquivo usando stat e usar o modelo somente se o arquivo não existir.

tasks:
  - stat: path=/etc/somefile.conf
    register: st
  - template: src=somefile.j2 dest=/etc/somefile.conf
    when: not st.stat.exists
    
por 05.07.2014 / 13:54
27

Você pode usar apenas o parâmetro force do módulo de modelo:

tasks:
    - template: src=somefile.j2 dest=/etc/somefile.conf force=no

Ou nomeando a tarefa; -)

tasks:
    - name: Create file from template if it doesn't exist already.
      template: 
        src: somefile.j2
        dest:/etc/somefile.conf
        force: no

Do módulo de modelo Ansible docs:

force: the default is yes, which will replace the remote file when contents are different than the source. If no, the file will only be transferred if the destination does not exist.

Outras respostas usam stat porque o parâmetro force foi adicionado depois que foram escritas.

    
por 26.11.2015 / 18:00
10

Você pode primeiro verificar se o arquivo de destino existe ou não e, em seguida, tomar uma decisão com base na saída do resultado.

tasks:
  - name: Check that the somefile.conf exists
    stat:
      path: /etc/somefile.conf
    register: stat_result

  - name: Copy the template, if it doesnt exist already
    template:
      src: somefile.j2
      dest: /etc/somefile.conf
    when: stat_result.stat.exists == False   
    
por 16.01.2015 / 12:17
-2

De acordo comigo, a solução mais fácil é usar o atributo "force = no" no módulo de modelo

    
por 10.09.2016 / 14:09