Por: @mariliars
Publicado em: 2019-02-15

Criação de grupos e usuários no Ansible e autenticação via chave ssh

Este post apresenta um passo a passa para a criação de grupos e usuário via Ansible e como setar uma chave ssh para autenticação. Além disso demais objetivos incluem entender o arquivo /etc/sudoers e fazer pequenas modificações.

Antes disso, é necessário entender a organização da estrutura do projeto de provisionamento do servidor via Ansible da iTFLEX. Os diretórios estão organizados da seguinte forma:

  • playbooks: é a base do projeto. Contém a descrição do host, importa as tasks e as variáveis.
  • **roles: **contém as tasks e variáveis específicas do recurso. Além disso pode ter handlese templates de configuração e arquivos utilizados no provisionamento.
  • **vars: **contém variáveis compartilhadas pelos recursos.

Para executar o playbook é necessário alterar a seguinte configuração no arquivo Vagrantfile. Após alterar basta rodar o comando vagrant provison.

# Vagrantfile 

ansible.playbook = "playbooks/nome_playbook.yml"

Criação de grupos

Para criar grupos iremos adicionar o nome dos grupos no arquivo de variáveis vars/auth.yml, importá-los no playbook e chamá-los na task de criação roles/auth/tasks/main.yml, como mostram os exemplos abaixo. Note que nossa task é listada em roles no arquivo playbooks/auth.yml.

Os grupos são criados no utilizando o módulo group. Basta percorrer nossa lista de grupos e informar o nome ao módulo em name. Após rodar o provisionamento é possível visualizar os grupos em /etc/group.  Utilize o comando lid -g group_name para visualizar os usuários do grupo. Neste momento ainda não haverá nem um usuário associado aos grupos criados.

# vars/auth.yml

---
roles_groups:
  - group01
  - group02

# playbooks/auth.yml

---
- hosts: all
  become_user: root
  become: yes
  roles:
    - auth

  vars_files:
    - ../vars/auth.yml


# roles/auth/tasks/main.yml

---
- name: Create user groups
  group:
    name: "{{ item }}"
  with_items: "{{ roles_groups }}"

Criação de usuários

Para criar usuários iremos adicionar o nome dos usuários no arquivo de variáveis e chamá-los na task de criação, como mostram os exemplos abaixo. Note que o arquivo de variáveis já foi importado na etapa de criação de grupos .

Os usuários são criados utilizando o módulo user. Basta percorrer a lista de usuários, informar o nome do usuário em name e os grupos que ele pertence em groups.  Após rodar o provisionamento é possível visualizar os usuários em /etc/passwd.Utilize o comando lid -n user_name para listar os grupos do usuário.

# vars/auth.yml
users:
  - user01
  - user02


# roles/auth/tasks/main.yml
- name: "Create user accounts and add users to groups"
  user:
    name: "{{ item }}"
    groups: "group01,group02"
  with_items: "{{ users }}"

Adicionar chave ssh para os usuários

Nesta etapa iremos adicionar a chave pública do usuário em roles/auth/tasks/files/user_name.key.pub.  Em seguida atribuímos a chave ao usuário por meio do módulo authorized_key. Basta adicionar o nome do usuário e informar o diretório em que a chave está localizada. A leitura do arquivo é feita através do lookup.

# roles/auth/tasks/main.yml
- name: "Add ssh keys"
  authorized_key:
    user: "{{ item }}"
    key: "{{ lookup('file', '../files/'+ item + '.key.pub') }}"
  with_items: "{{ users }}"

Editar /etc/sudoers e atribuir permissões

Para editar permissões no etc/sudoers foi implementada a task abaixo. Essa task atribui permissão ALL para os grupos cadastrados acima. Para validar a sintaxe do arquivo utilizou-se o visudo validate: "/usr/sbin/visudo -cf %s".

# roles/auth/tasks/main.yml
- name: "Update /etc/sudoers"
  lineinfile:
    dest: "/etc/sudoers"
    state: "present"
    regexp: "^%{{ item }}"
    line: "%{{ item }} ALL=(ALL) NOPASSWD: ALL"
    validate: "/usr/sbin/visudo -cf %s"
  with_items: "{{ roles_groups }}"

Para adicionar uma permissão específica no etc/sudoers basta utilizar o Cmnd_Alias atribuir um nome para o alias e informar a permissão. Após isso, podemos atribuir a permissão ao grupo da seguinte forma:

Cmnd_Alias UPDATE = /usr/bin/yum
%group01 ALL=(ALL) NOPASSWD: UPDATE

Obs: A implementação da edição do /etc/sudoers, acima é apenas um exemplo, ou seja, pode ser implementada da forma que mais se adequar à sua necessidade. Para saber outras maneiras de implementar consulte a documentação de contextos do Ansible.

Referências