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.
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
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
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
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
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 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
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