如何通过 ansible 更改用户的 shell?

如何通过 ansible 更改用户的 shell?

我有一些 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

这将为列表中的每个用户按顺序运行两个任务。

相关内容