Quel est le moyen le plus simple de créer un fichier vide avec 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 plutôt insatisfaisant.
Une autre méthode consiste à 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 ensuite, le fichier est touché à chaque fois et apparaît sous la forme d'une ligne jaune dans le journal, ce qui n'est pas non plus satisfaisant ...
Existe-t-il une meilleure solution à ce problème simple?
La documentation du module de fichier dit
Si
state=file
, le fichier ne sera PAS créé s'il n'existe pas, consultez le module de copie ou de modèle si vous souhaitez ce comportement.
Nous utilisons donc le module de copie, 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 ceci (utiliser d'abord le module stat
pour recueillir des données à ce sujet, puis filtrer à l'aide d'une condition) 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 utiliser 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 'create' garantit que cette action n'est pas effectuée si le fichier existe.
En vous basant sur la réponse acceptée, si vous souhaitez que le fichier soit soumis à une vérification des autorisations à chaque exécution et que celles-ci soient modifiées en conséquence si le fichier existe, ou que vous créiez simplement le fichier s'il n'existe pas, vous pouvez utiliser les éléments suivants:
- 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 (nouveauté 1.4+) - utilisez stat si vous ne souhaitez pas modifier l'horodatage du fichier.
Il s'avère que je n'ai pas assez de réputation pour mettre cela comme commentaire, ce qui serait un endroit plus approprié pour cela:
Ré. La réponse de AllBlackt, si vous préférez le format multiligne d'Ansible, vous devez ajuster la citation pour state
(j'ai passé quelques minutes à résoudre ce problème, j'espère donc que cela accélère les performances de 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" }}'
module de fichier fournir un moyen de toucher le fichier sans modifier son heure.
- name: Touch again the same file, but dont change times this makes the task idempotent
file:
path: /etc/foo.conf
state: touch
mode: u+rw,g-wx,o-rwx
modification_time: preserve
access_time: preserve
Référence: https://docs.ansible.com/ansible/latest/modules/file_module.html
Une combinaison de deux réponses, avec une torsion. Le code sera détecté comme modifié lors de la création du fichier ou de la mise à jour de l'autorisation.
- name: Touch again the same file, but dont change times this makes the task idempotent
file:
path: /etc/foo.conf
state: touch
mode: 0644
modification_time: preserve
access_time: preserve
changed_when: >
p.diff.before.state == "absent" or
p.diff.before.mode|default("0644") != "0644"
et une version qui corrige également le propriétaire et le groupe et le détecte comme modifié lorsqu'il corrige les éléments suivants:
- name: Touch again the same file, but dont change times this makes the task idempotent
file:
path: /etc/foo.conf
state: touch
state: touch
mode: 0644
owner: root
group: root
modification_time: preserve
access_time: preserve
register: p
changed_when: >
p.diff.before.state == "absent" or
p.diff.before.mode|default("0644") != "0644" or
p.diff.before.owner|default(0) != 0 or
p.diff.before.group|default(0) != 0
Pour créer un fichier sur la machine distante avec la commande ad-hoc
ansible client -m file -a"dest=/tmp/file state=touch"
S'il vous plait corrigez moi si je me trompe
Modifié si le fichier n'existe pas. Créer un fichier vide.
- name: create fake 'nologin' Shell
file:
path: /etc/nologin
state: touch
register: p
changed_when: p.diff.before.state == "absent"