Como posso alterar o shell de um usuário via ansible?

Como posso alterar o shell de um usuário via ansible?

Eu tenho um manual 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 }}"

E o playbook funciona corretamente, mas quando um usuário não está presente no arquivo /etc/passwd, o playbook pula a tarefa "Bloquear usuário", pois obtém "rc": 1. Como pode ignorar "rc": 1 corretamente e executar a tarefa "Bloquear usuário", quando o usuário não está presente?

Responder1

Você precisará certificar-se de que ambas as tarefas sejam executadas juntas para cada entrada da sua lista. Atualmente apenas um nome de usuário da primeira tarefa será usado na segunda.

Teoricamente isso seria ideal paraum bloco, mas você não pode combinar um bloco com um loop. Para contornar isso, você pode mover as tarefas reais em outro arquivo .yml incluído:

manual de instruções.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

Isso executará ambas as tarefas sequencialmente para cada usuário da sua lista.

informação relacionada