Comment créer un fichier vide avec Ansible?

Quel est le moyen le plus simple de créer un fichier vide en utilisant Ansible? Je sais que je peux enregistrer un fichier vide dans le répertoire files, puis le copier sur l'hôte distant, mais je trouve cela quelque peu insatisfaisant.

Une Autre façon est de toucher un fichier sur l'hôte distant:

- name: create fake 'nologin' shell
  file: path=/etc/nologin state=touch owner=root group=sys mode=0555

Mais alors le fichier est touché à chaque fois, apparaissant comme une ligne jaune dans le journal, ce qui est également insatisfaisant...

Y a-t-il une meilleure solution à ce problème simple?

74
demandé sur dokaspar 2015-02-05 18:25:10

6 réponses

La documentation du module file indique

Si state=file, le fichier ne sera pas créé s'il n'existe pas, consultez le module copie ou modèle si vous voulez ce comportement.

Nous utilisons donc le module copy, en utilisant force=no pour créer un nouveau fichier vide uniquement lorsque le fichier n'existe pas encore (si le fichier existe, son contenu est préservé).

- name: ensure file exists
  copy:
    content: ""
    dest: /etc/nologin
    force: no
    group: sys
    owner: root
    mode: 0555

C'est une solution déclarative et élégante.

117
répondu René Pijl 2017-12-22 17:30:11

Quelque chose comme ça (en utilisant le module stat d'abord pour recueillir des données à ce sujet, puis en filtrant à l'aide d'un conditionnel) devrait fonctionner:

- stat: path=/etc/nologin
  register: p

- name: create fake 'nologin' shell
  file: path=/etc/nologin state=touch owner=root group=sys mode=0555
  when: p.stat.exists is defined and not p.stat.exists

Vous pouvez également tirer parti de la fonctionnalité changed_when.

31
répondu ceejayoz 2017-02-28 14:03:13

Une autre option, en utilisant le module de commande:

- name: Create file
  command: touch /path/to/file
  args:
    creates: /path/to/file

L'argument 'creates' garantit que cette action n'est pas effectuée si le fichier existe.

23
répondu Leynos 2015-05-29 09:20:12

Sur la base de la réponse acceptée, si vous voulez que le fichier soit vérifié pour les autorisations à chaque exécution, et que celles-ci soient modifiées en conséquence si le fichier existe, ou simplement créer le fichier s'il n'existe pas, vous pouvez utiliser ce qui suit:

- stat: path=/etc/nologin
  register: p

- name: create fake 'nologin' shell
  file: path=/etc/nologin 
        owner=root
        group=sys
        mode=0555
        state={{ "file" if  p.stat.exists else "touch"}}
9
répondu AllBlackt 2016-01-14 13:34:57

file: path=/etc/nologin state=touch

Équivalent complet de touch (nouveau dans 1.4+) - utilisez stat si vous ne voulez pas changer l'horodatage du fichier.

8
répondu jalmasi 2016-06-03 11:39:28

S'avère que je n'ai pas assez de réputation pour mettre cela dans un commentaire, ce qui serait un endroit plus approprié pour cela:

Re. La réponse d'AllBlackt, si vous préférez le format multiligne D'Ansible, vous devez ajuster la citation pour state (j'ai passé quelques minutes à travailler, donc j'espère que cela accélère quelqu'un d'autre),

- stat:
    path: "/etc/nologin"
  register: p

- name: create fake 'nologin' shell
  file:
    path: "/etc/nologin"
    owner: root
    group: sys
    mode: 0555
    state: '{{ "file" if  p.stat.exists else "touch" }}'
3
répondu Andrew Richards 2018-04-24 22:27:51