when tutorial run playbook how for files español dummies arquitectura file ansible

file - tutorial - ¿Cómo crear un archivo vacío con Ansible?



arquitectura ansible (10)

¿Cuál es la forma más fácil de crear un archivo vacío con Ansible? Sé que puedo guardar un archivo vacío en el directorio de files y luego copiarlo en el host remoto, pero me parece un tanto insatisfactorio.

Otra forma es tocar un archivo en el host remoto:

- name: create fake ''nologin'' shell file: path=/etc/nologin state=touch owner=root group=sys mode=0555

Pero luego el archivo se toca cada vez, apareciendo como una línea amarilla en el registro, que tampoco es satisfactorio ...

¿Hay alguna mejor solución para este simple problema?


Algo como esto (usar el módulo de stat primero para recopilar datos sobre él y luego filtrar usando un condicional) debería funcionar:

- stat: path=/etc/nologin register: p - name: create fake ''nologin'' shell file: path=/etc/nologin state=touch owner=root group=sys mode=0555 when: p.stat.exists is defined and not p.stat.exists

Alternativamente, podría aprovechar la funcionalidad changed_when .


Basándose en la respuesta aceptada, si desea que se verifiquen los permisos en el archivo en cada ejecución, y estos se modifiquen en consecuencia si el archivo existe, o simplemente cree el archivo si no existe, puede usar lo siguiente:

- stat: path=/etc/nologin register: p - name: create fake ''nologin'' shell file: path=/etc/nologin owner=root group=sys mode=0555 state={{ "file" if p.stat.exists else "touch"}}


Cambiado si el archivo no existe. Crea un archivo vacío.

- name: create fake ''nologin'' shell file: path: /etc/nologin state: touch register: p changed_when: p.diff.before.state == "absent"


El módulo de archivo proporciona una forma de tocar el archivo sin modificar su tiempo.

- name: Touch again the same file, but dont change times this makes the task idempotent file: path: /etc/foo.conf state: touch mode: u+rw,g-wx,o-rwx modification_time: preserve access_time: preserve

Referencia: https://docs.ansible.com/ansible/latest/modules/file_module.html


La documentación del módulo de archivo dice

Si state=file , el archivo NO se creará si no existe, consulte el módulo de copia o plantilla si desea ese comportamiento.

Entonces usamos el módulo de copia, usando force=no para crear un nuevo archivo vacío solo cuando el archivo aún no existe (si el archivo existe, su contenido se conserva).

- name: ensure file exists copy: content: "" dest: /etc/nologin force: no group: sys owner: root mode: 0555

Esta es una solución declarativa y elegante.


Otra opción, usando el módulo de comando:

- name: Create file command: touch /path/to/file args: creates: /path/to/file

El argumento ''crea'' asegura que esta acción no se realice si el archivo existe.


Para crear un archivo en la máquina remota con el comando ad-hoc

ansible client -m file -a"dest=/tmp/file state=touch"

Por favor, corríjame si estoy equivocado


Resulta que no tengo suficiente reputación para poner esto como un comentario, que sería un lugar más apropiado para esto:

Re. La respuesta de AllBlackt, si prefiere el formato multilínea de Ansible, necesita ajustar la cita por state (pasé unos minutos resolviendo esto, así que espero que esto acelere a alguien más),

- stat: path: "/etc/nologin" register: p - name: create fake ''nologin'' shell file: path: "/etc/nologin" owner: root group: sys mode: 0555 state: ''{{ "file" if p.stat.exists else "touch" }}''


Una combinación de dos respuestas, con un giro. El código se detectará como modificado, cuando se cree el archivo o se actualice el permiso.

- name: Touch again the same file, but dont change times this makes the task idempotent file: path: /etc/foo.conf state: touch mode: 0644 modification_time: preserve access_time: preserve changed_when: > p.diff.before.state == "absent" or p.diff.before.mode|default("0644") != "0644"

y una versión que también corrige al propietario y al grupo y lo detecta como modificado cuando corrige estos:

- name: Touch again the same file, but dont change times this makes the task idempotent file: path: /etc/foo.conf state: touch state: touch mode: 0644 owner: root group: root modification_time: preserve access_time: preserve register: p changed_when: > p.diff.before.state == "absent" or p.diff.before.mode|default("0644") != "0644" or p.diff.before.owner|default(0) != 0 or p.diff.before.group|default(0) != 0


file: path=/etc/nologin state=touch

Equivalente completo al tacto (nuevo en 1.4+): use stat si no desea cambiar la marca de tiempo del archivo.