crearea unui utilizator și a unei chei sshkey cu modulul ansible user (Administrarea sistemului, Ansible Playbook)

Alireza Nasri a intrebat.

Vreau să creez niște utilizatori locali și la distanță și să generez o pereche de chei ssh pentru utilizatorii respectivi și să le transfer pe serverul de la distanță, dar se pare că utilizatorul local – ansible – care rulează ansible-playbook nu are acces la /home/USERNAME/.ssh/id_rsa.pub.

TASK [copy ssh key to destination users] ***************************************************************************************************
task path: /home/ansible/project1/setup-user.yaml:21
Read vars_file 'vars/users.yaml'
Read vars_file 'vars/groups.yaml'
[WARNING]: Unable to find '/home/zahr1/.ssh/id_rsa.pub' in expected paths (use -vvvvv to see paths)
File lookup using None as file
fatal: [localhost]: FAILED! => {
    "msg": "An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError'>, original message: could not locate file in lookup: /home/zahr1/.ssh/id_rsa.pub"
}
[WARNING]: Unable to find '/home/zahr1/.ssh/id_rsa.pub' in expected paths (use -vvvvv to see paths)
File lookup using None as file
fatal: [ansible1]: FAILED! => {
    "msg": "An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError'>, original message: could not locate file in lookup: /home/zahr1/.ssh/id_rsa.pub"
}

Aș aprecia dacă mi-ați comunica soluția.

2 răspunsuri
Michael Hampton

Puteți copia cheia publică direct în playbook-ul dvs. De exemplu:

- name: Set authorized key
  ansible.posix.authorized_key:
    user: zahr1
    state: present
    key: "ssh-ed25519 AAAAA.....0 [email protected]"

De asemenea, puteți specifica mai multe chei.

- name: Set authorized key
  ansible.posix.authorized_key:
    user: zahr1
    state: present
    key: "{{ item }}"
  loop:
    - "ssh-ed25519 AAAAA.....1 [email protected]"
    - "ssh-rsa AAAAA.....2 [email protected]"
    - "ssh-dsa AAAAA.....3 [email protected]"

Rețineți că ansible.posix.authorized_key este pentru Ansible 2.10 și versiunile ulterioare (a se vedea pagina sa documentația deoarece trebuie să fie instalat separat cu ansible-galaxy). Versiunile mai vechi ale Ansible vor utiliza opțiunea acum depășită authorized_key.

Comentarii

  • Mulțumesc, dar am nevoie să fac procedura în mod automat, copierea manuală a cheii din fișier nu este ceea ce îmi doresc. –  > Por Alireza Nasri.
  • @AlirezaNasri Ați spus că Ansible nu are acces pentru a face acest lucru. –  > Por Michael Hampton.
Peter de Zwart

Ansible authorized_key pare să nu folosească become_user, deci nu are acces la folderul .ssh al utilizatorului. soluție: copiați fișierul <user>/.ssh/id_rsa.pub într-un dosar /tmp locație (ca root/become_user) și apoi folosiți authorized_keys pentru a căuta în dosarul /tmp. mai jos comenzi adhoc pentru a face treaba. Într-un playboook adăugați o sarcină cu modulul de copiere.(prima export PASS=mysecret cu excepția cazului în care doriți să înlocuiți -e parametru suplimentar cu -k și introduceți de 5 ori parola)

creați mai întâi noul utilizator pe gazda de control ansible și generați noi chei ssh

ansible localhost -m user -a "name=${a_new_user} generate_ssh_key=true"  
-b -e "ansible_become_pass=${PASS}"

creați acest utilizator și pe toate gazdele

ansible all -m user -a "name=${a_new_user}" -b -e  
"ansible_become_pass=${PASS}"

copiați cheia publică abia creată într-o locație care este accesibilă prin comanda authorized_key

sudo cp -p /home/${a_new_user}/.ssh/id_rsa.pub /tmp/

acum authorized_key poate adăuga cheia publică pe toate gazdele în fișierul authorized_key , dar acum caută în dosarul /tmp

ansible all -m authorized_key -a "user=${a_new_user} 
key={{ lookup('file', '/tmp/id_rsa.pub') }}" -b 
-e "ansible_user_passwd=${PASS}"

asigurați-vă că utilizatorul nou adăugat poate face sudo fără parolă

ansible all -m lineinfile -a "path=/etc/sudoers state=present 
line='${a_new_user} ALL=(ALL) NOPASSWD: ALL' 
validate='/usr/sbin/visudo -cf %s'" -b 
-e "ansible_become_pass=${PASS}"