Ansible: récupérer les clés SSH depuis BitBucket
Rédigé par uTux Aucun commentaireJe m'attaque aux API REST et en particulier celle de BitBucket pour y récupérer mes clés SSH que je déploie ensuite sur mes serveurs, le tout avec Ansible. Voilà un petit bout de code sur lequel j'ai passé une bonne soirée car autant c'est facile d'interroger l'API, autant ça l'est un peu moins de faire rentrer les bons champs dans des variables ;)
Pré requis:
- Sur votre compte BitBucket
- Settings > App passwords
- Créez un password avec l'autorisation Account / read.
Allons-y (à mettre dans votre tasks/main.yml par exemple):
---
- name: GET authorized_keys from REST API
uri:
url: "{{ authorized_keys.api_url }}"
method: "{{ authorized_keys.api_method }}"
user: "{{ authorized_keys.api_user }}"
password: "{{ authorized_keys.api_password }}"
force_basic_auth: "{{ authorized_keys.api_force_basic }}"
register: authorized_keys__json_response
delegate_to: localhost
run_once: True
# Delegate to localhost and run 1 time because
# we don't need to query the API from each remote host
- name: Set Keys as a Var
set_fact:
authorized_keys__keys: "{{ authorized_keys__json_response.json | json_query('values[*].key') }}"
delegate_to: localhost
run_once: True
# Extract the fields 'key' in a variable
- name: Concatenate Keys
set_fact:
authorized_keys__keys_concatenate: "{{ authorized_keys__keys | join('\n') }}"
delegate_to: localhost
run_once: True
# Ansible authorized_keys module with 'exclusive' option requires all keys in one batch
# separated by a newline \n
La variable authorized_keys__keys contient la liste des clés publiques. La variable authorized_keys__keys_concatenate n'est pas une liste mais un champ contenant toutes les clés séparées par un retour à la ligne et elle est utile si vous souhaitez utiliser le module authorized_keys avec exclusive: yes car ce dernier ne marche pas bien avec une liste, il faut donc lui fournir 1 seul "batch".
Complétez ensuite vos variables, par exemple:
# group_vars/all/vars.yml
authorized_keys:
api_user: john
api_url: "https://api.bitbucket.org/2.0/users/john/ssh-keys"
api_method: GET
api_force_basic: yes
api_password: password créé dans l'interface bitbucket
Bien sûr en vrai on mettra le password dans un vault ;)
Et voilà, vous pouvez utiliser authorized_keys__keys ou authorized_keys__keys_concatenate pour la suite!