Deploy de public keys con Ansible

Hola!

Quienes usamos o empezamos a usar Ansible nos preguntamos cómo instalar la clave pública en los hosts (que pueden ser muchos) que queremos manejar a través de Ansible... usando Ansible mismo :)

La respuesta la encontré a través de un playbook que luce de la siguiente manera:

$ cat deploy_ssh_key.yml  
1:  ---  
2:  - hosts: all  
3:   gather_facts: false  
4:   vars_files:  
5:    - external_vars.yml  
6:   tasks:  
7:   - name: Create direcotry  
8:    file:  
9:     path: "/home/usuario-remoto/.ssh"  
10:     state: directory  
11:   - name: Create empty file  
12:    file:  
13:     path: "/home/usuario-remoto/.ssh/authorized_keys"  
14:     state: touch  
15:   - name: Put pubkey  
16:    lineinfile:  
17:     path: "/home/usuario-remoto/.ssh/authorized_keys"  
18:     line: "{{ pub_key }}"  

El archivo external_vars.yml contiene la clave pública:

 $ cat external_vars.yml  
 ---  
 pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCnTvKiRzIU0Jqz3kpf97wVJdT4LwHZuu6Nr/GFFOtq0QeWP5Eu6JmWkvwuNoghdXu/lxHf//07djGUfxnt9BDdQmDMsGx3qEFzAQAlrlq2P6lygSksy8MROQsHCDzT0hX7pntiwigDE7rUuGt3h3T+IFuvjfZqMx2wiX4dFLUC9+HcdtUuzMHjMs1zevP2nmpOWAP7LkcwlkdJZIpkOqujshJFymuXylWvT8vV5RbqwB7ZaR1m+rpCYt1MQFgHgI/42jXeywbORA3Nm6pjVCccNjJ5DpbhiEZA/O/SJH/zlFPuoPaTai5sH8MLuU8h11C4U9UPY08/XhAkIDebVri1 ansible@verovan.com.ar  
 ...

El comando de Ansible se ejecuta de la siguiente manera:

 $ ansible-playbook -u usuario-remoto deploy_ssh_key.yml --ask-pass -c paramiko  

(-c paramiko lo usé debido a un issue reportado en https://github.com/ansible/ansible/issues/3564)

Para verificar que está todo en orden y que la clave fue instalada correctamente:

 $ ansible all -u usuario-remoto --private-key-file=/ruta/a/la/clave-privada -m ping 

El módulo lineinfile lo usé para apendar la clave pública en el archivo authorized_keys (ver https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html)

Espero que les resulte de utilidad!

NOTAS ADICIONALES

Si se deploya las keys en CentOS 6, es necesario cambiar los permisos tanto del fichero authorized_keys como del directorio .ssh. El playbook quedaría de esta manera:

 ---  
 - hosts: curso  
  gather_facts: true  
  vars_files:  
   - external_vars.yml  
  tasks:  
  - name: make direcotry  
   
   file:  
    path: "/home/usuario-remoto/.ssh"  
    state: directory  
   
  - name: create empty file  
   file:  
    path: "/home/usuario-remoto/.ssh/authorized_keys"  
    state: touch  
   
  - name: put pubkey  
   lineinfile:  
    path: "/home/usuario-remoto/.ssh/authorized_keys"  
    line: "{{ pub_key }}"  
   
  - name: change permissions file  
   file:  
    path: "/home/usuario-remoto/.ssh/authorized_keys"  
    mode: 0600  
   when: ansible_distribution == "CentOS"   
   
  - name: change permissions dir  
   file:  
    path: "/home/usuario-remoto/.ssh"  
    mode: 0700  
   when: ansible_distribution == "CentOS"  

Comentarios

Entradas más populares de este blog

Zabbix en dos días (día 1)

OpenVPN para todos :D

Sincronizar con rsync