Как можно изменить оболочку для пользователя с помощью 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 }}"

И playbook работает правильно, но когда пользователь отсутствует в файле / etc / passwd, playbook пропускает задачу «Заблокировать пользователя», потому что получает «rc»: 1. Как правильно игнорировать «rc»: 1 и запускать задачу «Заблокировать пользователя», когда пользователя нет?

0
задан 31 January 2020 в 15:25
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

Это запустит обе задачи последовательно для каждого пользователя в вашем списке.

0
ответ дан 26 February 2020 в 00:43

Теги

Похожие вопросы