Ansible authentication

Het uitvoeren van een task op de ‘remote host’ wordt bij voorkeur gedaan door gebruik te maken van een gebruikers-account die niet root is. De optie ‘-K’ is voor het vragen van het zogenaamde ‘privilege escalation password’, hetzelfde als je ‘sudo’ gebruikt.

Het beste is dus om een ansible playbook te maken voor het aanmaken van een ‘ansible-user’ en dan gelijk rsa-key-pair authentication instellen zodat op een veilige manier ingelogd gaat worden op de remote hosts.

Vóórdat we met een rsa-keypair in kunnen loggen moeten we dus een aantal dingen aanpassen op de remote host. Daarom loggen we eerst in met een username/password. Om ansible te vertellen om geen gebruik te maken een key, plaats de volgende regel in ansible.cfg:

host_key_checking = False

In de ‘inventory‘ file controleren we nu de gebruiker waarmee ansible gaat inloggen, bijvoorbeeld voor een tst-groep:

[tst]
tst-server01 ansible_host=10.0.0.1 ansible_user=root

Nu kunnen we de SSH-verbinding testen met de ping-module en de ‘-k’ optie die om een SSH-wachtwoord vraagt:

ansible -m ping tst -k

Het resultaat zal er zo uitzien:

tst-server01 | SUCCESS => {
 "changed": false, 
 "ping": "pong"
}

De variables zetten we in de group_vars/tst, in een productie-omgeving zal je dit in een ansible-vault plaatsen! Nu noemen we deze ‘ansibleuser‘,  ‘ansiblepassword‘ en mijn publieke sleutel in ‘ansiblekey‘. Het bestand group_vars/tst heeft dan de volgende toevoeging:

ansiblekey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpS5eO/MuSvnvY....
ansibleuser: ansible
ansiblepassword: ansible

Aangezien we graag met rollen werken maken we de volgende directory:

mkdir -p roles/user/tasks

en maken daarin een yaml-file:

vi roles/user/tasks/main.yml

Een wachtwoord voor de gebruiker die we gaan toevoegen aan de nodes, maakt gebruik van encryptie en we hebben dus een ansible-commando nodig om het wachtwoord te versleutelen. Het script wordt dan alsvolgt:

---
- name: Create an Ansible login user
  user:
   name: {{ ansibleuser }}
   password: "{{ ansiblepassword | password_hash('sha512') }}"
   state: present
   shell: /bin/bash
   createhome: yes 

- name: make directory
  become: yes
  file:
    path: "/home/{{ ansibleuser }}/.ssh"
    state: directory

- name: create empty file
  become: yes
  file:
    path: "/home/{{ ansibleuser }}/.ssh/authorized_keys"
    state: touch

- name: put my public key
  become: yes
  lineinfile:
    path: "/home/{{ ansibleuser }}/.ssh/authorized_keys"
    line: "{{ ansiblekey }}"

Vervolgens kunnen we de regel in ansible.cfg aanpassen zodat vanaf nu gebruik gemaakt wordt van de key-pair. De regel met ‘host_key_checking‘ kan verwijderd worden.

De inventory file passen we ook aan om de nieuwe user-account ‘ansible’ te gebruiken.

[tst] 
tst-server01 ansible_host=10.0.0.1 ansible_user=ansible

Vanaf nu worden de ansible-playbooks uitgevoerd met het ansible account.