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

j'ai rencontré un problème de configuration lors du codage d'un playbook possible pour un fichier de clés privées ssh.

comme nous le savons, nous pouvons définir la combinaison avec serveur hôte, ip et clé privée SSH connexe dans un fichier d'hôtes possible pour les serveurs statiques d'inventaire.

mais je ne sais pas comment le définir 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 définir ~/.SSH / SSHKEY.pem dans ansible fichiers plutôt qu'en ligne de commande
  2. je suppose qu'il pourrait y avoir un paramètre dans le playbook comme "gather_facts" pour définir quelle clé privée devrait être utilisée pour les hôtes ci-dessus, mais il ne semble pas y avoir de tel paramètre?
  3. S'il n'y a aucun moyen de définir la clé privée dans les fichiers, ce qui devrait être défini en ligne de commande si un fichier de clé différent sera utilisé pour différents serveurs dynamiques récupérés pour un playbook?

Merci pour vos commentaires

39
demandé sur Clark Zheng 2015-11-19 08:02:08

5 réponses

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


Note: je suppose que vous utilisez le EC2 externe de l'inventaire script. Si vous utilisez une autre approche d'inventaire dynamique, vous pourriez avoir besoin de modifier cette solution.

C'est un problème avec lequel j'ai dû lutter, encore et encore, pendant des mois, et j'ai finalement trouvé une solution, grâce à la suggestion de Brian Coca ici. L'astuce consiste à utiliser les mécanismes de variables de groupe D'Ansible pour transmettre automatiquement le bon fichier de clés SSH pour la machine avec laquelle vous travaillez.

le script d'inventaire EC2 configure automatiquement divers groupes que vous pouvez utiliser pour vous référer aux hôtes. Vous l'utilisez dans votre playbook: dans la première lecture, vous dites à Ansible d'appliquer 'role1' à l'ensemble du groupe 'tag_Name_server1'. Nous voulons indiquer à Ansible d'utiliser une clé SSH spécifique pour n'importe quel hôte 'tag_Name_server1' groupe, qui est l'endroit où les fichiers variables de groupe entrent.

en supposant que votre playbook est situé 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

maintenant, à chaque fois que vous vous référez à ces groupes dans un playbook, Ansible vérifiera les fichiers appropriés, et chargera toutes les variables que vous avez définies là.

à l'intérieur de chaque fichier var de groupe, Nous pouvons spécifier le fichier clé à utiliser pour se connecter aux hôtes dans le groupe:

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

maintenant, quand vous lancez votre playbook, il devrait automatiquement ramasser les bonnes clés!


Using environment var for portability

j'exécute souvent des playbooks sur de nombreux serveurs différents (local, remote build server, etc.), donc je tiens à les 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 où les clés SSH sont stocker.

dans ce cas, les fichiers Vars de mon groupe ressemblent à ceci, à la place:

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

Autres Améliorations

il y a probablement un tas de façons ingénieuses de l'améliorer. Pour une chose, vous devez encore spécifier manuellement quelle clé utiliser pour chaque groupe. Puisque le script D'inventaire EC2 inclut des détails sur le clavier utilisé pour chaque serveur, il y a probablement un moyen d'obtenir le nom de la clé directement à partir du script lui-même. Dans ce case, vous pouvez fournir le répertoire dans lequel les clés sont situées (comme ci-dessus), et lui faire choisir les clés correctes basées sur les données d'inventaire.

38
répondu Tiro 2016-09-27 22:16:34

la meilleure solution que je puisse trouver pour ce problème est de spécifier le fichier de clés privées dans ansible.(cfg, j'ai l'habitude de le garder dans le même dossier que 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 fixe encore la clé privée globalement pour tous les hôtes dans playbook.

Note: vous devez spécifier le chemin complet du fichier clé - ~user/.SSH / some_key_rsa silencieusement ignoré.

17
répondu tchu 2015-12-17 10:54:12

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
7
répondu kaiser 2017-08-20 14:41:26

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"
2
répondu Kenuat 2017-05-18 10:52:04

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

les variables suivantes doivent être ajoutées à ec2.ini dans une nouvelle section 'ssh' (optionnel 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)
2
répondu Daz 2017-10-02 13:38:17