¿Cómo se puede cambiar el shell de un usuario a través de ansible?

¿Cómo se puede cambiar el shell de un usuario a través de ansible?

Tengo un libro de jugadas 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 }}"

Y el playbook funciona correctamente, pero cuando un usuario no está presente en el archivo /etc/passwd, el playbook omite la tarea "Bloquear usuario", porque obtiene "rc": 1. ¿Cómo se puede ignorar "rc": 1 correctamente y ejecutarlo? ¿La tarea "Bloquear usuario", cuando el usuario no está presente?

Respuesta1

Deberá asegurarse de que ambas tareas se ejecuten juntas para cada entrada de su lista. Actualmente, en la segunda solo se utilizará un nombre de usuario de la primera tarea.

Teóricamente esto sería ideal paraun bloque, pero no puedes combinar un bloque con un bucle. Para solucionar este problema, puede mover las tareas reales a otro archivo .yml que incluya:

libro de jugadas.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

Esto ejecutará ambas tareas secuencialmente para cada usuario de su lista.

información relacionada