ansible host toevoegen

  Ansible

In het vorige Ansible setup heb ik beschreven hoe je eenvoudig een ansible config neer zet op een host. nu wil je alleen nog clients toevoegen zoals beschreven in het Setup document kan je dat met de hand doen maar ook dit wil je het liefst automatiseren. maar hoe doe je dat als er nog geen ansible op je machines staat. je kan natuurlijk alles in je default image zetten maar dan heb je de bestaande user er nog niet gedaan, ik heb hier voor een simple playbook gemaakt. er zijn natuurlijk wel een paar voorwaarden. maar het meeste is default.

Als ik een machine installeer maak ik altijd mijn eigen user vanuit de installer deze user heeft een password en sudo rechten en al mijn systemen hebben de sshd actief. ik kan dus al remote inloggen op zo’n machine.

het playbook wat ik gebruik heeft het volgende nodig op de ansible server onder de user heb je een ssh key aangemaakt deze staat gewoon op de default locatie ~/.ssh/id_rsa.pub

---
- name: Create initial user/group and dist keys
  hosts: "{{ SERVER }}" 
  become: true    
  become_method: sudo    
  become_user: root
  vars: 
    RSR: ansible
    RUID: 9999
    RGRP: ansible
    RGID: 9999
  tasks:

   - name: "Create group {{ RGRP }}  for ansible tasks" 
     group:
       name: "{{ RGRP }}" 
       gid: "{{ RGID}}" 
       state: present

   - name: "Create user {{ RSR }} for ansible tasks" 
     user: 
       name: "{{ RSR }}"
       uid: "{{ RUID }}"
       password: ! 
       comment: "automation user"
       group: "{{ RGRP }}"
       home: "/home/{{ RSR }}"
       state: present

   - name: Set authorized key taken from file 
     authorized_key:
       user: "{{ RSR }}"
       state: present
       key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

   - name: "sudo without password for {{ RSR }} user" 
     copy:
       content: '{{ RSR }} ALL=(ALL:ALL) NOPASSWD:ALL'
       dest: "/etc/sudoers.d/{{ RSR }}_nopasswd"
       mode: 0440

je kan het bovenstaande playbook uiteraard uitbreiden met nog allerlei hardening opties. bv door de sshd config aan te passen maar dit is de basis.
zoals we in het vorige article konden lezen was de host kevin nog niet geconfigueerd.

$ ansible kelvin -m ping
kelvin | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ansible@kelvin: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}

De host Kelvin kunnen we dus nog steeds niet bereiken. als we nu create-initial-user-raw.yml met een aantal extra opties uitvoeren. we moeten een user opgeven die al eerder aangemaakt hadden tijdend de installatie dat doen met -u optie dan willen we dat het password van deze user opgeven moet worden daar zorgt –ask-pass voor, om sudo password op te geven voegen we de -K toe. en dan geven we met -e de variable SERVER mee en die vullen we met de host kelvin. uiteraard moet de host wil bekend zijn in de ansible host file. als we het playbook uitvoeren zal er 2 keer om een password gevraagd worden. 1 om middels ssh in te loggen en de ander om sudo password.

$ ansible-playbook -u USER --ask-pass -K create-initial-user.yml -e SERVER=kelvin
SSH password: 
BECOME password[defaults to SSH password]: 

PLAY [Create initial user/group and dist keys] **********************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************
ok: [kelvin]

TASK [Create group ansible for ansible tasks] ************************************************************************************************************************************
changed: [kelvin]

TASK [Create user ansible for ansible tasks] *************************************************************************************************************************************
changed: [kelvin]

TASK [Set authorized key taken from file] ***************************************************************************************************************************************
changed: [kelvin]

TASK [sudo without password for ansible user] ************************************************************************************************************************************
changed: [kelvin]

PLAY RECAP **********************************************************************************************************************************************************************
kelvin                     : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Als we nu de ping module nog een keer uitvoeren op kelvin krijgen we het antwoord wat we verwachten.

$ ansible kelvin -m ping
kelvin | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    }, 
    "changed": false, 
    "ping": "pong"
}

Dit playbook is getest op ubuntu 18.04 en hoger en rhel7 en hoger.