web-dev-qa-db-fra.com

comment définir la clé privée ssh pour les serveurs récupérés par l'inventaire dynamique dans les fichiers

J'ai rencontré un problème de configuration lors du codage de Ansible Playbook pour le fichier de clé privée SSH.

Comme nous le savons, nous pouvons définir une combinaison avec serveur hôte, clé privée ssh associée et ip dans le fichier hôtesible pour les serveurs d’inventaire statiques.

Mais je ne sais pas comment définir cela avec des serveurs d'inventaire dynamiques.

Ex:

---
- hosts: tag_Name_server1
  gather_facts: no
  roles:
    - role1

- hosts: tag_Name_server2
  gather_facts: no
  roles:
    - roles2

La commande ci-dessous est utilisée pour appeler ce playbook:

ansible-playbook test.yml -i ec2.py --private-key ~/.ssh/SSHKEY.pem

Ma question est:

  1. Comment puis-je définir ~/.ssh/SSHKEY.pem dans des fichiers ansible plutôt qu'en ligne de commande
  2. J'imagine qu'il pourrait y avoir un paramètre dans playbook tel que "rassembler_facts" pour définir quelle clé privée devrait être utilisée pour les hôtes ci-dessus, mais cela ne ressemble-t-il à aucun de ces paramètres?
  3. S'il n'existe aucun moyen de définir une clé privée dans les fichiers, que doit-on définir dans la ligne de commande si un fichier de clé différent sera utilisé pour différents serveurs récupérés dynamiques pour un livre de jeu?

Merci pour vos commentaires

50
Clark Zheng

TL; DR: spécifiez le fichier de clé dans le fichier de variable de groupe, car 'tag_Name_server1' est un groupe.


Remarque: Je suppose que vous utilisez le script d'inventaire externe EC2 . Si vous utilisez une autre approche d'inventaire dynamique, vous devrez peut-être modifier cette solution.

C’est un problème avec lequel je me bats, de temps en temps, et j’ai enfin trouvé une solution, grâce à la suggestion de Brian Coca ici . L'astuce consiste à utiliser les mécanismes de variable de groupe d'Ansible pour transmettre automatiquement le fichier de clé SSH correct pour la machine sur laquelle vous travaillez.

Le script d'inventaire EC2 configure automatiquement divers groupes que vous pouvez utiliser pour faire référence à des hôtes. Vous utilisez ceci dans votre playbook: dans la première pièce, vous dites à Ansible d'appliquer "role1" à l'ensemble du groupe "tag_Name_server1". Nous voulons que Ansible utilise une clé SSH spécifique pour tout hôte du groupe 'tag_Name_server1', à l'endroit où les fichiers de variable de groupe entrent en jeu.

En supposant que votre playbook se trouve dans le répertoire "my-playbooks", créez des fichiers pour chaque groupe dans le répertoire "group_vars":

my-playbooks
|-- test.yml
+-- group_vars
     |-- tag_Name_server1.yml
     +-- tag_Name_server2.yml

Désormais, chaque fois que vous vous référez à ces groupes dans un livre de lecture, Ansible vérifie les fichiers appropriés et charge les variables que vous avez définies ici.

Dans chaque fichier var du groupe, nous pouvons spécifier le fichier de clé à utiliser pour la connexion aux hôtes du groupe:

# tag_Name_server1.yml
# --------------------
# 
# Variables for EC2 instances named "server1"
---
ansible_ssh_private_key_file: /path/to/ssh/key/server1.pem

Maintenant, lorsque vous utilisez votre Playbook, il devrait automatiquement récupérer les bonnes clés!


Utilisation de vars d'environnement pour la portabilité

J'exécute souvent des playbooks sur plusieurs serveurs différents (local, serveur de build distant, etc.), alors j'aime bien paramétrer les choses. Plutôt que d'utiliser un chemin fixe, j'ai une variable d'environnement appelée SSH_KEYDIR qui pointe vers le répertoire dans lequel les clés SSH sont stockées.

Dans ce cas, mes fichiers de groupe de vars ressemblent à ceci:

# tag_Name_server1.yml
# --------------------
# 
# Variables for EC2 instances named "server1"
---
ansible_ssh_private_key_file: "{{ lookup('env','SSH_KEYDIR') }}/server1.pem"

Améliorations supplémentaires

Il y a probablement de nombreuses façons d'améliorer cette situation. D'une part, vous devez toujours spécifier manuellement la clé à utiliser pour chaque groupe. Étant donné que le script d'inventaire EC2 inclut des informations détaillées sur la paire de clés utilisée pour chaque serveur, il existe probablement un moyen d'obtenir le nom de la clé directement à partir du script lui-même. Dans ce cas, vous pouvez fournir le répertoire dans lequel se trouvent les clés (comme ci-dessus) et le faire choisir les bonnes clés en fonction des données d'inventaire.

48
Tiro

La meilleure solution que je puisse trouver pour résoudre ce problème consiste à spécifier le fichier de clé privée dans ansible.cfg (je le conserve généralement dans le même dossier qu'un playbook):

[defaults]
inventory=ec2.py
vault_password_file = ~/.vault_pass.txt
Host_key_checking = False
private_key_file = /Users/eric/.ssh/secret_key_rsa

Cependant, il définit toujours la clé privée globalement pour tous les hôtes de playbook.

Remarque: Vous devez spécifier le chemin d'accès complet au fichier de clé - ~ utilisateur/.ssh/some_key_rsa ignoré de manière silencieuse.

23
tchu

Vous pouvez simplement définir la clé à utiliser directement lors de l'exécution de la commande:

ansible-playbook \
        \ # Super verbose output incl. SSH-Details:
    -vvvv \
        \ # The Server to target: (Keep the trailing comma!)
    -i "000.000.0.000," \
        \ # Define the key to use:
    --private-key=~/.ssh/id_rsa_ansible \
        \ # The `env` var is needed if `python` is not available:
    -e 'ansible_python_interpreter=/usr/bin/python3' \ # Needed if `python` is not available
        \ # Dry–Run:
    --check \
    deploy.yml

Copier coller:

ansible-playbook -vvvv --private-key=/Users/you/.ssh/your_key deploy.yml
13
kaiser

J'utilise la configuration suivante:

#site.yml:
- name: Example play
  hosts: all
  remote_user: ansible
  become: yes
  become_method: Sudo
  vars:
    ansible_ssh_private_key_file: "/home/ansible/.ssh/id_rsa"
4
Kenuat

J'ai eu un problème similaire et je l'ai résolu avec un correctif pour ec2.py et en ajoutant des paramètres de configuration à ec2.ini. Le correctif prend la valeur ec2_key_name, le préfixe avec ssh_key_path, ajoute ssh_key_suffix à la fin et écrit ansible_ssh_private_key_file comme valeur.

Les variables suivantes doivent être ajoutées à ec2.ini dans une nouvelle section 'ssh' (facultatif si les valeurs par défaut correspondent à votre environnement):

[ssh]
# Set the path and suffix for the ssh keys
ssh_key_path = ~/.ssh
ssh_key_suffix = .pem

Voici le patch pour ec2.py:

204a205,206
>     'ssh_key_path': '~/.ssh',
>     'ssh_key_suffix': '.pem',
422a425,428
>         # SSH key setup
>         self.ssh_key_path = os.path.expanduser(config.get('ssh', 'ssh_key_path'))
>         self.ssh_key_suffix = config.get('ssh', 'ssh_key_suffix')
> 
1490a1497
>         instance_vars["ansible_ssh_private_key_file"] = os.path.join(self.ssh_key_path, instance_vars["ec2_key_name"] + self.ssh_key_suffix)
3
Daz