19 votes

Est-il possible d'utiliser la fonction exclusive authorized_key d'Ansible avec plusieurs clés ?

Je suis assez nouveau dans l'utilisation d'Ansible et j'ai lu aquí et google et je n'ai pas encore trouvé de réponse.

Mon scénario est le suivant : j'ai un utilisateur sur un serveur mais 2 ou 3 clés publiques différentes qui doivent être placées dans le fichier authorized_keys.

Je peux avec succès supprimer toutes les clés, ou ajouter toutes les clés avec ce script :

---
  - hosts: all

 tasks:
  - name: update SSH keys
    authorized_key:
     user: <user>
     key: "{{ lookup('file', item) }}"
     state: present
     #exclusive: yes
    with_fileglob:
      - ../files/pub_keys/*.pub

Avec le present flag il lit et ajoute toutes les clés. Avec le drapeau absent il supprime toutes les clés énumérées.

Le problème est que j'ai une ancienne clé qui est seulement sur le serveur et je veux la supprimer/écraser et pour les déploiements futurs écraser toutes les clés non autorisées qui pourraient être sur le serveur et pas dans mon playbook.

Avec le exclusive flag, il ne prend que la dernière clé et l'ajoute. Ce serait fantastique s'il bouclait et ajoutait toutes les clés de manière récurrente. S'il y a un moyen de faire cela dans Ansible, je ne l'ai pas trouvé.

Existe-t-il un moyen de boucler sur les fichiers de pubs et d'utiliser la fonction exclusive en même temps ?

21voto

Konstantin Suvorov Points 34119

Y a-t-il un moyen de boucler sur les fichiers de pub et d'utiliser l'option exclusive en même temps ?

Non. Il y a une note sur les boucles et les exclusifs dans le manuel de l'utilisateur. docs :

exclusif : Si l'on veut supprimer toutes les autres clés non spécifiées du fichier authorized_keys. Plusieurs clés peuvent être spécifiées dans une seule valeur de chaîne de clés en les séparant par des nouvelles lignes. Cette option ne tient pas compte des boucles, donc si vous utilisez with_ , ce sera exclusif par itération de la boucle, si vous voulez plusieurs clés dans le fichier, vous devez les passer toutes à key dans un seul lot comme mentionné ci-dessus.

Vous devez donc joindre toutes vos clés et les envoyer en une seule fois.
Quelque chose comme ça :

- name: update SSH keys
  authorized_key:
    user: <user>
    key: "{{ lookup('pipe','cat ../files/pub_keys/*.pub') }}"
    state: present
    exclusive: yes

Vérifiez ce code avant de l'exécuter en production !

10voto

morxa Points 1484

Si vous voulez éviter le pipe (par exemple, parce que le chemin d'accès n'est pas relatif au rôle), vous pouvez également utiliser une combinaison des éléments suivants file y fileglob les consultations :

- name: update SSH keys
  authorized_key:
    user: <user>
    key:  "{% for key in lookup('fileglob', 'pub_keys/*.pub').split(',') %}{{ lookup('file', key) ~ '\n'}}{% endfor %}"
    state: present
    exclusive: yes

5voto

czerasz Points 2135

Si vous gardez vos utilisateurs dans une variable, vous pouvez utiliser ceci :

---

- hosts: all
  vars_files:
    - roles/users/vars/main.yml
  tasks:
    - name: Allow other users to login to the account
      authorized_key:
        user: user_name
        exclusive: yes
        key: "{{ developers|map(attribute='publish_ssh_key')|join('\n') }}"

En roles/users/vars/main.yml ressemble à ça :

---

developers:
  - name: user1
    publish_ssh_key: ssh-rsa AAAA...
  - name: user2
    publish_ssh_key: ssh-rsa AAAA...

0voto

DrGecko Points 92

Comme je l'ai écrit sur cette autre réponse ( Ansible - gestion de plusieurs clés SSH pour plusieurs utilisateurs et rôles ) c'est la façon dont j'ai résolu ce problème pour mon cas d'utilisation. Peut-être est-elle utile ici ?

Je passe un tableau de noms de fichiers dans une variable à mon user-account rôle. Le rôle récupère ensuite le contenu de chacun de ces fichiers, les additionne dans une chaîne de caractères séparée par des nouvelles lignes, puis définit finalement cette valeur comme étant la clé ssh du nouvel utilisateur.

.

Le fichier du playbook :

- hosts: aws-node1
  roles:
    - { role: user-account, username: 'developer1', ssh_public_keyfiles: ['peter-sshkey.pub', 'paul-sshkey.pub'] }

.

La définition du rôle pour user-account :

- name: add user
  user:
    name: "{{username}}"

- name: lookup ssh pubkeys from keyfiles and create ssh_pubkeys_list
  set_fact:
    ssh_pubkeys_list: "{{ lookup('file', item) }}"
  with_items:
    "{{ssh_public_keyfiles}}"
  register: ssh_pubkeys_results_list

- name: iterate over ssh_pubkeys_list and join into a string
  set_fact:
    ssh_pubkeys_string: "{{ ssh_pubkeys_results_list.results | map(attribute='ansible_facts.ssh_pubkeys_list') | list | join('\n') }}"

- name: update SSH authorized_keys for user {{ username }} with contents of ssh_pubkeys_string
  authorized_key:
    user: "{{ username }}"
    key: "{{ ssh_pubkeys_string }}"
    state: present
    exclusive: yes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X