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?
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.
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
.
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.
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"}}
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.
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" }}'