
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 }}"
그리고 플레이북은 올바르게 작동하지만 /etc/passwd 파일에 사용자가 없으면 플레이북은 "rc"를 가져오기 때문에 "Block user" 작업을 건너뜁니다. 1. "rc": 1을 올바르게 무시하고 실행할 수 있는 방법 사용자가 없을 때 "사용자 차단" 작업을 수행하시겠습니까?
답변1
목록의 모든 항목에 대해 두 작업이 함께 실행되는지 확인해야 합니다. 현재는 첫 번째 작업의 사용자 이름 하나만 두 번째 작업에서 사용됩니다.
이론적으로 이것은 다음과 같은 경우에 이상적입니다.블록, 그러나 블록을 루프와 결합할 수는 없습니다. 이 문제를 해결하려면 포함된 다른 .yml 파일에서 실제 작업을 이동할 수 있습니다.
플레이북.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
그러면 목록의 각 사용자에 대해 두 작업이 순차적으로 실행됩니다.