
Tengo un libro de jugadas ansible:
---
- hosts: servers
gather_facts: false
become: yes
ignore_errors: yes
tasks:
- include_vars: users.yml
- name: Check that user exists
shell: "grep -q {{item.username}} /etc/passwd"
ignore_errors: yes
with_items: "{{ users }}"
register: userexist
- name: Block user
user:
name: "{{ item.username }}"
shell: /bin/false
when: userexist is succeeded
with_items: "{{ userexist.results }}"
Y el playbook funciona correctamente, pero cuando un usuario no está presente en el archivo /etc/passwd, el playbook omite la tarea "Bloquear usuario", porque obtiene "rc": 1. ¿Cómo se puede ignorar "rc": 1 correctamente y ejecutarlo? ¿La tarea "Bloquear usuario", cuando el usuario no está presente?
Respuesta1
Deberá asegurarse de que ambas tareas se ejecuten juntas para cada entrada de su lista. Actualmente, en la segunda solo se utilizará un nombre de usuario de la primera tarea.
Teóricamente esto sería ideal paraun bloque, pero no puedes combinar un bloque con un bucle. Para solucionar este problema, puede mover las tareas reales a otro archivo .yml que incluya:
libro de jugadas.yml:
---
- hosts: servers
gather_facts: false
become: yes
vars:
users:
- blah: blubb
username: nagios
- blubb: bleh
username: foobar
tasks:
- name: set shell
include_tasks: set_shell.yml
loop: "{{ users }}"
set_shell.yml
---
- name: Check that user exists
shell: "grep -q {{ item.username }} /etc/passwd"
ignore_errors: yes
register: userexist
- name: Block user
user:
name: "{{ item.username }}"
shell: /bin/false
when: userexist is succeeded
Esto ejecutará ambas tareas secuencialmente para cada usuario de su lista.