Ansible: copier le modèle uniquement lorsque le fichier de destination n'existe pas

47

J'utilise Ansible 1.6.6pour approvisionner ma machine.

Il y a une tâche de modèle dans mon playbook qui crée un fichier de destination à partir d'un modèle Jinja2:

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

Je ne veux pas remplacer somefile.confs'il existe déjà. Est-ce possible avec Ansible? Si c'est le cas, comment?

Slava Fomin II
la source

Réponses:

61

Vous pouvez vérifier l'existence d'un fichier à l'aide de stat, puis utiliser le modèle uniquement si le fichier n'existe pas.

tasks:
  - stat: path=/etc/somefile.conf
    register: st
  - template: src=somefile.j2 dest=/etc/somefile.conf
    when: not st.stat.exists
Teftin
la source
42

Vous pouvez simplement utiliser le paramètre force du module template:

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

Ou nommer la tâche ;-)

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

À partir de la documentation du module de modèle Ansible :

force: la valeur par défaut est yes, ce qui remplacera le fichier distant lorsque le contenu sera différent de celui de la source. Si non, le fichier ne sera transféré que si la destination n'existe pas.

D'autres réponses utilisent statparce que le paramètre force a été ajouté après leur écriture.

Sanzante
la source
2
ma réponse utilise stat, car au moment de la question / réponse, il n'y avait pas d'argument de la force valable pour template
Teftin
10

Vous pouvez d’abord vérifier que le fichier de destination existe ou non, puis prendre une décision en fonction du résultat de son résultat.

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   
Arbabnazar
la source
1
Je préfère cette réponse car elle nomme ses tâches :)
Asfand Qazi
-3

Selon moi, la solution la plus simple consiste à utiliser l'attribut "force = no" du module de modèle.

Thibault Richard
la source