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:
Merci pour vos commentaires
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.
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.
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
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"
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)