ansible

¿Cómo verificar un archivo existe en ansible?



(6)

Tengo que verificar si existe un archivo en /etc/ . Si el archivo existe, entonces tengo que omitir la tarea. Aquí está el código que estoy usando:

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

Si el file.txt existe, entonces tengo que omitir la tarea.


Creo que puede ser molesto y propenso a errores hacer muchas de estas .stat.exists tipo .stat.exists . Por ejemplo, requieren un cuidado especial para que el modo de verificación ( --check ) funcione.

Muchas respuestas aquí sugieren

  • obtener y registrarse
  • aplicar cuando la expresión de registro es verdadera

Sin embargo, a veces esto es un olor a código, así que siempre busque mejores formas de usar Ansible, específicamente existen muchas ventajas al usar el módulo correcto. p.ej

- name: install ntpdate package: name: ntpdate

o

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

Pero cuando no sea posible, use un módulo, también investigue si puede registrarse y verificar el resultado de una tarea anterior. p.ej

# 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''

Tenga en cuenta el when: pero también el creates: así que la comprobación no creates: errores

Menciono esto porque a menudo estas prácticas menos que ideales vienen en pares, es decir, sin paquete apt / yum, por lo que tenemos que 1) descargar y 2) descomprimir

Espero que esto ayude


El módulo de docs.ansible.com/ansible/stat_module.html hará esto y obtendrá mucha otra información para los archivos. De la documentación de ejemplo:

- 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 general, haría esto con el docs.ansible.com/ansible/stat_module.html . Pero el módulo de comando tiene la opción de creates que hace que esto sea muy simple:

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

¿Supongo que tu comando táctil es solo un ejemplo? La mejor práctica sería no verificar nada y dejar que Ansible haga su trabajo, con el módulo correcto. Entonces, si desea asegurarse de que el archivo existe, usaría el módulo de archivo:

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


Esto se puede lograr con el módulo de estadísticas para omitir la tarea cuando existe un archivo.

- 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


Primero puede verificar si el archivo de destino existe o no y luego tomar una decisión basada en la salida de su resultado.

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


vars: mypath: "/etc/file.txt" tasks: - name: checking the file exists command: touch file.txt when: mypath is not exists