web-dev-qa-db-fra.com

Comment créer un fichier vide avec Ansible?

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?

86
dokaspar

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.

136
René Pijl

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.

32
ceejayoz

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.

24
Leynos

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"}}
11
AllBlackt

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.

9
jalmasi

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" }}'
3
Andrew Richards

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

3
Ravi Kulkarni

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
0
Roch Bourdon

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

0

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"
0
Dmitry Balashov