
Ich habe ein Ansible-Playbook:
---
- 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 }}"
Und das Playbook funktioniert korrekt, aber wenn in der Datei /etc/passwd kein Benutzer vorhanden ist, überspringt das Playbook die Aufgabe „Benutzer blockieren“, da „rc“: 1 erhalten wird. Wie kann „rc“: 1 korrekt ignoriert und die Aufgabe „Benutzer blockieren“ ausgeführt werden, wenn der Benutzer nicht vorhanden ist?
Antwort1
Sie müssen sicherstellen, dass beide Aufgaben für jeden Eintrag Ihrer Liste zusammen ausgeführt werden. Derzeit wird nur ein Benutzername aus der ersten Aufgabe in der zweiten verwendet.
Theoretisch wäre das ideal fürEin Block, aber Sie können einen Block nicht mit einer Schleife kombinieren. Um dies zu umgehen, können Sie die eigentlichen Aufgaben in eine andere .yml-Datei verschieben, die Sie einbinden:
Datei:
---
- 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
Dadurch werden beide Aufgaben nacheinander für jeden Benutzer in Ihrer Liste ausgeführt.