我有一些 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”: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 }}"
设置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
这将为列表中的每个用户按顺序运行两个任务。