web-dev-qa-db-fra.com

Comment vérifier qu'un fichier existe dans ansible?

Je dois vérifier si un fichier existe dans /etc/. Si le fichier existe, je dois ignorer la tâche. Voici le code que j'utilise:

- name: checking the file exists
  command: touch file.txt
  when: $(! -s /etc/file.txt)

Si le file.txt existe, je dois ignorer la tâche.

83
E Dine Sh

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

tasks:
  - name: Check that the somefile.conf exists
    stat:
      path: /etc/file.txt
    register: stat_result

  - name: Create the file, if it doesnt exist already
    file:
      path: /etc/file.txt
      state: touch
    when: stat_result.stat.exists == False 
136
Arbab Nazar

Le module stat le fera tout en obtenant de nombreuses autres informations pour les fichiers. De la documentation exemple:

- stat: path=/path/to/something
  register: p

- debug: msg="Path exists and is a directory"
  when: p.stat.isdir is defined and p.stat.isdir
23
Bruce P

Ceci peut être réalisé avec le module stat pour ignorer la tâche lorsque le fichier existe.

- hosts: servers
  tasks:
  - name: Ansible check file exists.
    stat:
      path: /etc/issue
    register: p
  - debug:
      msg: "File exists..."
    when: p.stat.exists
  - debug:
      msg: "File not found"
    when: p.stat.exists == False
18
Rajeshkanna

En général, vous feriez cela avec le module statistique . Mais le module de commande a l'option creates qui rend ceci très simple:

- name: touch file
  command: touch /etc/file.txt
  args:
    creates: /etc/file.txt

Je suppose que votre commande tactile est juste un exemple? La meilleure pratique serait de ne rien vérifier du tout et de laisser ansible faire son travail - avec le bon module. Donc, si vous voulez vous assurer que le fichier existe, utilisez le module de fichier:

- name: make sure file exists
  file:
    path: /etc/file.txt
    state: touch
12
udondan
vars:
  mypath: "/etc/file.txt"

tasks:
  - name: checking the file exists
    command: touch file.txt
    when: mypath is not exists
3
DreamUth

Je trouve que cela peut être ennuyeux et sujet aux erreurs de faire beaucoup de ces vérifications de type .stat.exists. Par exemple, ils ont besoin de plus de soin pour que le mode de vérification (--check) fonctionne.

Beaucoup de réponses suggèrent ici

  • obtenir et vous inscrire
  • appliquer lorsque l'expression de registre est vraie

Cependant, il s’agit parfois d’une odeur de code, il est donc important de toujours rechercher de meilleurs moyens d’utiliser Ansible. En particulier, l’utilisation du bon module présente de nombreux avantages. par exemple.

- name: install ntpdate
  package:
    name: ntpdate

ou

- file:
    path: /etc/file.txt
    owner: root
    group: root
    mode: 0644

Mais quand ce n’est pas possible, utilisez un seul module, vérifiez également si vous pouvez vous inscrire et vérifier le résultat d’une tâche précédente. par exemple.

# jmeter_version: 4.0 
- name: Download Jmeter archive
  get_url:
    url: "http://archive.Apache.org/dist/jmeter/binaries/Apache-jmeter-{{ jmeter_version }}.tgz"
    dest: "/opt/jmeter/Apache-jmeter-{{ jmeter_version }}.tgz"
    checksum: sha512:eee7d68bd1f7e7b269fabaf8f09821697165518b112a979a25c5f128c4de8ca6ad12d3b20cd9380a2b53ca52762b4c4979e564a8c2ff37196692fbd217f1e343
  register: download_result

- name: Extract Apache-jmeter
  unarchive:
    src: "/opt/jmeter/Apache-jmeter-{{ jmeter_version }}.tgz"
    dest: "/opt/jmeter/"
    remote_src: yes
    creates: "/opt/jmeter/Apache-jmeter-{{ jmeter_version }}"
  when: download_result.state == 'file'

Notez le when: mais aussi le creates: afin que --check ne produise pas d'erreur

Je mentionne cela parce que souvent ces pratiques moins qu'idéales se présentent par paires, c'est-à-dire sans paquet apt/yum, nous devons donc 1) télécharger et 2) décompresser

J'espère que cela t'aides

2
KCD