Garantir que apenas uma lista específica de usuários exista com o Ansible

4

Usamos o Ansible para criar usuários com esta tarefa:

- name: Create adm users
  user:
    name: "{{ item.name }}"
    group: "{{ common_adm_group }}"
    createhome: yes
    password: "!!"
    update_password: always
    state: present
  with_items: "{{ common_adm_users }}"

E common_adm_users é assim:

  - name: user1
    comment: "First Last"
    ssh_key: "ssh-rsa AAAAB3Nza..."

Isso funciona bem para criar usuários, mas quando alguém deixa a equipe, apenas remover o usuário de common_adm_users não faz com que ele seja removido dos servidores quando reaplicarmos a função que inclui essa tarefa.

Qual é a prática recomendada para manter uma lista exata de usuários?

    
por Giovanni Tirloni 03.02.2017 / 01:55

3 respostas

3

Esta é uma resposta semelhante à do @Konstantin Suvorov, mas um pouco mais refinada, com algumas nuances claramente definidas e realmente testadas e em uso.

Usando o seguinte, você só precisa manter uma única lista de nomes de usuários que deseja acessar. Quaisquer adições ou remoções dessa lista serão refletidas no acesso ao host.

Dica útil opcional: na verdade, escolhemos usar nossos nomes de usuários do GitHub para essa lista, pois assim também podemos adicionar facilmente as chaves SSH. Veja o final para um exemplo.

Primeiro, em nosso group_vars , definimos nossa lista de desenvolvedores que desejamos ter acesso (observe que isso pode ser definido de várias maneiras, não apenas group_vars ):

developers:
  - user1
  - user2
  - etc...

Em segundo lugar, criamos um grupo para o qual atribuiremos nossos desenvolvedores a:

- name: Create "developers" group
  group:
    name: developers
    state: present

Em terceiro lugar, adicionamos nossos desenvolvedores a esse grupo. OBSERVE que os adicionamos por meio da propriedade groups e não group . Isso o adiciona como um grupo secundário e garante que eles apareçam em /etc/group . Isso é essencial porque, se você adicioná-los como um grupo principal, eles não aparecerão como membros desse grupo em /etc/group :

- name: Add user accounts
  user:
    name: "{{ item }}"
    shell: /bin/bash
    groups: [developers]
    state: present
  with_items: "{{ developers }}"

Em quarto lugar, obtemos todos os usuários que atualmente pertencem ao grupo de desenvolvedores no host ( Observe que isso depende da suposição principal / secundária mencionada na etapa anterior ):

- name: Determine existing users
  shell: 'grep developers /etc/group | cut -d: -f4 | tr "," "\n"'
  changed_when: false 
  register: existing_users

Quinto, determine quais desses usuários devem ser removidos (por exemplo, aqueles que não estão definidos em nossa lista developers group_vars):

- name: Determine removed users
  set_fact:
    removed_users: "{{ existing_users.stdout_lines | difference(developers) }}"

Em sexto e último lugar, remova-os:

- name: Delete removed user accounts
  user:
    name: "{{ item }}"
    state: absent
  with_items: "{{ removed_users }}"

Passo útil opcional - Se você adicionar usuários pelo nome de usuário do GitHub, você pode facilmente conceder-lhes acesso SSH a partir da chave pública que eles têm disponível no GitHub:

- name: Add public ssh keys of users
  authorized_key:
    user: "{{ item }}"
    exclusive: yes
    key: https://github.com/{{ item }}.keys
    state: present
  with_items: "{{ developers }}"
    
por 22.05.2018 / 10:48
2

Você precisa fazer algumas tarefas extras aqui.

Depois de adicionar todos os usuários necessários, pegue os usuários existentes, por exemplo:

- shell: 'grep {{ common_adm_group }} /etc/group | cut -d: -f4 | tr "," "\n"'
  changed_when: false # Make task green
  register: existing_users

e remova os antigos:

- user:
    name: "{{ item }}"
    state: absent
  with_items: "{{ existing_users.stdout_lines | difference(common_adm_users | map(attribute='name') | list) }}"

Observação: o código não é testado, pode conter erros de digitação etc.

    
por 03.02.2017 / 07:59
0

Você pode adicionar um campo à sua tarefa existente:

- name: Create adm users
  user:
    name: "{{ item.name }}"
    group: "{{ common_adm_group }}"
    createhome: yes
    password: "!!"
    update_password: always
    state: "{{ item.state | default('present') }}"
  with_items: "{{ common_adm_users }}"

E, em seguida, faça com que os dados para deixar membros da equipe sejam semelhantes:

- name: user1
    comment: "First Last"
    ssh_key: "ssh-rsa AAAAB3Nza..."
    state: "absent"
    
por 10.03.2017 / 18:51

Tags