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.