¿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