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.