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 terhandles
etemplates
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.