Je développe un playbook Ansible depuis quelques semaines, par conséquent, mon expérience avec une telle technologie est relativement courte. Une partie de ma stratégie consiste à utiliser un ansible_ssh_user
Personnalisé pour provisionner les hôtes tout au long de l'inventaire, mais cet utilisateur aura besoin de sa propre paire de clés SSH, ce qui impliquerait une sorte de plan pour conserver/stocker sa clé privée correspondante. Sur un environnement de production, ce playbook serait cloné/tiré et exécuté à l'intérieur d'un certain nœud du playbook dont le rôle est de provisionner le reste de l'infrastructure.
Au début, je pensais simplement mettre cette clé privée dans le référentiel git de playbook, mais j'y réfléchis néanmoins, principalement pour des raisons de sécurité quelque peu évidentes et de bon sens, d'où la raison pour laquelle je dois vous consulter cette question.
Avec cet ensemble sur la table, voici les questions de suivi:
C'est une mauvaise idée de stocker tout type de secret en clair dans le contrôle de révision, clés privées SSH incluses. Utilisez plutôt ansible-vault pour stocker la clé privée.
ansible-vault
peut fonctionner sur n'importe quel type de fichier. Cryptez simplement le fichier avec
ansible-vault encrypt /path/to/local/private_key
puis installez la clé:
- name: Install a private SSH key
vars:
source_key: /path/to/local/private_key
dest_key: /path/to/remote/private_key
tasks:
- name: Ensure .ssh directory exists.
file:
dest: "{{ dest_key | dirname }}"
mode: 0700
owner: user
state: directory
- name: Install ssh key
copy:
src: "{{ source_key }}"
dest: "{{ dest_key }}"
mode: 0600
owner: user
Les versions antérieures de ansible-vault ne fonctionnaient que sur les variables définies dans les fichiers var, vous deviez donc faire quelque chose comme ceci:
ssh_key: |
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
key_file: /home/user/.ssh/id_rsa
Chiffrer avec ansible-vault:
ansible-vault encrypt /path/to/var_file
Et installez la clé:
- name: Ensure .ssh directory exists.
file:
dest: "{{ key_file | dirname }}"
mode: 0700
owner: user
state: directory
- name: Install ssh key
copy:
content: "{{ ssh_key }}"
dest: "{{ key_file }}"
mode: 0600
owner: user
Merci à tous ceux ci-dessous qui ont amélioré la réponse avec leurs commentaires.
Puisque vous provisionnez à partir de zéro, vous devez générer la paire de clés privée/publique sur le noeud playbook puis distribuer la clé publique via le authorized_keys
module. Cela éliminerait la nécessité de stocker un secret n'importe où sauf sur l'hôte où il est nécessaire. Voici un playbook pour y parvenir, qui serait exécuté sur le noeud playbook:
---
- hosts: 127.0.0.1
Sudo: yes
gather_facts: no
tasks:
- name: create ansible_ssh_user locally
user: name=ansible_ssh_user generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa
- name: copy the generated public key to an accessible location for the next play
Shell: cp ~ansible_ssh_user/.ssh/id_rsa.pub /tmp/ansible_ssh_user.pub
- hosts: all
Sudo: yes
gather_facts: no
tasks:
- name: create ansible_ssh_user
user: name=ansible_ssh_user groups=group1,group2
- name: Add RSA public key to the remote Host
authorized_key: user=ansible_ssh_user key="{{ lookup('file', '/tmp/ansible_ssh_user.pub') }}"
- hosts: 127.0.0.1
Sudo: yes
gather_facts: no
tasks:
- name: remove public key from /tmp
Shell: rm /tmp/ansible_ssh_user.pub
...