У меня есть доступная игра:
---
- 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 }}"
И playbook работает правильно, но когда пользователь отсутствует в файле / etc / passwd, playbook пропускает задачу «Заблокировать пользователя», потому что получает «rc»: 1. Как можно правильно игнорировать «rc»: 1 и запускать задача «Заблокировать пользователя», когда пользователя нет?
Вам нужно будет убедиться, что обе задачи выполняются вместе для каждой записи вашего списка. В настоящее время только одно имя пользователя из первой задачи будет использоваться во второй.
Теоретически это было бы идеально для Блок, но нельзя комбинировать блок с циклом. Чтобы обойти это, вы можете переместить фактические задачи в другой файл .yml, который вы включаете:
playbook.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
Это запустит обе задачи последовательно для каждого пользователя в вашем списке.