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, alors je dois ignorer la tâche.

Vous pouvez d’abord vérifier que le fichier de destination existe ou non, puis prendre une décision en fonction de la sortie du 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 

Le module stat le fera aussi bien que d’obtenir beaucoup d’autres informations pour les fichiers. À partir de l’exemple de documentation:

 - 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 

En général, vous le feriez avec le module stat . Mais le module de commande a l’option create qui rend cela 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 faire son travail – avec le bon module. Donc, si vous voulez vous assurer que le fichier existe, vous utiliserez le module de fichier:

 - name: make sure file exists file: path: /etc/file.txt state: touch 

Cela 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 
 vars: mypath: "/etc/file.txt" tasks: - name: checking the file exists command: touch file.txt when: mypath is not exists 

Je trouve que cela peut être gênant et sujet aux erreurs pour faire beaucoup de ces .stat.exists type .stat.exists . Par exemple, ils ont besoin de précautions supplémentaires pour que le mode de vérification ( --check ) fonctionne.

Beaucoup de réponses suggèrent ici

  • obtenir et s’inscrire
  • appliquer lorsque l’expression du registre est vraie

Cependant, parfois, il s’agit d’une odeur de code, donc cherchez toujours de meilleures façons d’utiliser Ansible, en particulier, il ya de nombreux avantages à utiliser le bon module. par exemple

 - name: install ntpdate package: name: ntpdate 

ou

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

Mais si vous ne pouvez pas utiliser un seul module, vérifiez également si vous pouvez vous enregistrer 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: alors --check ne fait pas d’erreur

Je mentionne cela parce que souvent ces pratiques peu idéales se présentent par paires, c’est-à-dire qu’il n’ya pas de paquet apt / yum, donc nous devons 1) télécharger et 2) décompresser

J’espère que cela t’aides