
Eu tenho um manual 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 }}"
E o playbook funciona corretamente, mas quando um usuário não está presente no arquivo /etc/passwd, o playbook pula a tarefa "Bloquear usuário", pois obtém "rc": 1. Como pode ignorar "rc": 1 corretamente e executar a tarefa "Bloquear usuário", quando o usuário não está presente?
Responder1
Você precisará certificar-se de que ambas as tarefas sejam executadas juntas para cada entrada da sua lista. Atualmente apenas um nome de usuário da primeira tarefa será usado na segunda.
Teoricamente isso seria ideal paraum bloco, mas você não pode combinar um bloco com um loop. Para contornar isso, você pode mover as tarefas reais em outro arquivo .yml incluído:
manual de instruções.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
Isso executará ambas as tarefas sequencialmente para cada usuário da sua lista.