Назад | Перейти на главную страницу

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

И playbook работает правильно, но когда пользователь отсутствует в файле / etc / passwd, playbook пропускает задачу «Заблокировать пользователя», потому что получает «rc»: 1. Как можно правильно игнорировать «rc»: 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

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