Ces scripts fonctionnent sous Python3 et nécessitent la librairie requests > 2.4, json et yaml
Le script a besoin d'un fichier secret.py, à placer à côté de tower.py.
Voici la syntaxe attendue :
# secret.py:
username = 'cpatry'
secret = 'p4ssw0rd$'
ssh_key_unlock = 'my_very_strong_ssh_key_passphrase'
./tower.py
usage: tower.py [-h] [--verbosity {INFO,ERROR,DEBUG}]
tower.py addHost fqdn inventory_name
tower.py massImportHost txtfile (file syntax: fqdn;inventory_name)
tower.py massImportInventory txtfile (file syntax: inventory_name;organisation)
tower.py deleteHost fqdn
tower.py massDeleteHost txtfile (file syntax: fqdn)
tower.py massChangeHostStatus txtfile (file syntax: fqdn;enabled[true/false])
tower.py addGroup [--force-create] group_name inventory_name
tower.py deleteGroup group_name inventory_name
tower.py addInventory [--org [ORGANIZATION_NAME]] [--force-create] inventory_name
tower.py deleteInventory inventory_name
tower.py deleteJobTemplate job_template_name
tower.py associate fqdn group_name inventory_name
tower.py associateVariable [type {hosts,groups}] name key value inventory_name
tower.py associateChildren group_parent_name group_child_name inventory_name
tower.py massAssociate txtfile (file syntax: fqdn;group_name;inventory_name)
tower.py disassociate fqdn group_name inventory_name
tower.py hostGroups fqdn
tower.py groupMembers [--export] group_name inventory_name
tower.py groupListMembers [--inverse] inventory_name group_list [group_list ...]
tower.py groupVars group_name inventory_name
tower.py hostVars [--nested] fqdn
tower.py lastExecutionStatus id (of the JobTemplate)
tower.py lastExecutionChange id (of the JobTemplate)
tower.py getHostsFromInventory inventory_name
tower.py getAllGroupVars
tower.py getAllHostVars
tower.py getLonelyHosts
tower.py getLonelyGroups
tower.py getTemplatesWithSurvey
tower.py getTemplatesNotUsingDefault
tower.py getProjectsWithOldBranch
tower.py displayJobTemplatesCredentials
tower.py launchJob [--remote_username REMOTE_USERNAME]
[--remote_password REMOTE_PASSWORD]
[--tags TAGS] [--inventory INVENTORY]
[--limit LIMIT] [--si_version SI_VERSION]
[--job_type JOB_TYPE] [--disable_cooldown]
[--return_id]
jsonfile
tower.py stopJob job_id
tower.py importAnsibleInventory [--export]
[--org [ORGANIZATION_NAME]]
[--groupvars [GROUP_VAR_DIRECTORY_PATH]]
[--hostvars [HOST_VAR_DIRECTORY_PATH]]
file inventory
tower.py exportAnsibleInventory --bash jsonfile inventory_name
tower.py importJobTemplates jsonfile
tower.py exportAllJobTemplates jsonfile
tower.py importAll --delete jsonfile {credentials,projects}
tower.py exportAll jsonfile {credentials,projects,disabledHosts}
curl https://gitlab/api/v4/projects/3/repository/branches?per_page=100
cat branches.json | jq -r .[].name > branchList
La fonctionnalité launchJob permet d'exécuter un job template sur l'interface Ansible Tower. Elle fonctionne à l'aide de fichiers json, qui sont déposés dans le dossier yaml_launch. J'en ai déjà créé plusieurs. Bien sur le but c'est que chacun fasse les siens et les partage !
Prenons par exemple le fichier autolib-ehp.yaml :
job_template_id:
- 607
survey:
run_default_migrations: 'no'
report: 'Non'
validation: 'Non'
microlise_environment: 'eh1'
Il contient l'id du job template "EHP - Autolib", ainsi que les réponses au survey (qui sont obligatoires).
Pour exécuter le job, il suffit de lancer la commande suivante (sans le .yaml) :
tower.py launchJob autolib-ehp
Vous pouvez exécuter simultanément plusieurs jobs en les listant comme ceci :
job_template_id:
- 607
- 431
- 720
Voir par exemple le fichier d'exemple dirtyharry-ehp.yaml.
Si vous souhaitez modifier la limite d'un job, vous pouvez utiliser le paramètre --limit. Attention, ce paramètre fonctionnera uniquement si le job template demande la limite au moment de l'exécution, autrement vous n'avez pas le droit de la modifier.
La plupart des paramètres usuels peuvent être modifiés, à partir du moment ou le job template le permet. C’est par exemple le cas pour :
- si_version
- tags
- inventory
- job_type
Vous pouvez indiquer ces paramètres en les ajoutant à la variable survey, comme dans le fichier d’exemple autolib-ehp.yaml. Vous pouvez aussi les mettre directement dans la ligne de commande, comme dans l’exemple suivant :
tower.py launchJob psql-database --limit server01 --inventory 1
Enfin, par défaut, tower.py ne lancera pas plus de 3 jobs simultanéments. Il effectuera une courte pause tous les 3 jos templates. Si vous souhaitez désactiver ce comportement, utiliser l’argument --disable_cooldown.
Pour migrer les données vers AWX, procédez dans l'ordre suivant :
- Création manuelle des organisations
- Import automatique des inventaires
- Créer le type credential PHPIpam
- Import automatique des credentials après sed sur l'id phpipam credential_type + id organization: -> Système :
jq '. | map(select(.id == (14, 15, 16, 22, 26, 28, 35, 37, 41, 55, 65, 66, 69, 70, 72, 79, 81, 94, 95, 103, 109, 115, 116, 121, 122, 124, 125, 126, 127, 134, 135)))' credentials > credentials.json
-> Chaque user recréera ses credentials
- Import automatique des projets après sed sur l'id de l'organisation + l'id des credentials
- Correction des credentials SCM + ajout system creds
- Import automatique des hosts et groupes via inventory script :
#!/bin/bash
if [ "$1" == "--list" ] ; then
cat << "EOF"
{
JSONFILE EXPORTED
}
EOF
elif [ "$1" == "--host" ]; then
echo '{"_meta": {"hostvars": {}}}'
else
echo "{ }"
fi
./tower.py exportAnsibleInventory inventories/EHP-AWS "EHP - AWS" --bash
- Import automatique des Job Templates après sed des ids d'inventaire, de credentials et de projects
- Suppression des source_inventory, dans la base, puis via l'interface :
UPDATE main_group SET has_inventory_sources = 'f' where has_inventory_sources = 't';
UPDATE main_host SET has_inventory_sources = 'f' where has_inventory_sources = 't';
TRUNCATE TABLE main_group_inventory_sources;
TRUNCATE TABLE main_host_inventory_sources;
- Remise en place des lonelyGroups
- Désactivation des serveurs anciennement désactivés
./tower.py exportAll disabledHosts disabledHosts && jq -r .[].name disabledHosts > disabledHosts.list
Variable syntax : key: value (ex: key1: value, key2: value, etc...)