Installation d'AWX sous Debian (sans container :D )

Install AWX Debian

En parcourant les dépôts Salsa (l’instance Gitlab du projet Debian), je suis tombé sur un portage d’AWX (le projet upstream de RedHat Tower) sous Debian. Depuis le temps que je cherchais un version « non containerisée » tournant sous Debian (et pas sous CentOS comme le projet AWX RPM par exemple).

Et voilà qu’un dev Debian nommé Kapouer a exaucé mes voeux ! Je lui ai envoyé un petit message pour savoir s’il pourrait me mettre le pied à l’étrier pour que je puisse faire l’installation à la maison. Il a eu la gentillesse de passer sur le chan IRC #debian-france pour m’expliquer comment faire, et remettre en ligne le paquet #kivabien pour ne pas que j’aie à compiler ce dernier moi-même (je suis un gros noob dans l’utilisation d’outils comme sbuild). Et deux heures plus tard, tadam ! Mon instance AWX est installée.

Afin que d’autres puissent profiter du travail et des explications de Kapouer, voici un howto qui reprend les étapes de l’installation. Enjoy !

Qu’est qu’AWX ?

« Ansible Tower est une API, un service Web et une console Web conçue pour rendre Ansible plus facilement utilisable par les équipes informatiques. C’est une console centrale de gestion des tâches d’automatisation. Tower est un produit commercial pris en charge par Red Hat, Inc.
Il en existe une version gratuite, servant de version bêta pour sa grande sœur Tower, qui s’appelle AWX. Cette version est aussi utilisable par les entreprises, mais n’est pas garantie. »
Source : Wikipedia

Installation paquets

Nous installons les paquets nécessaires

sudo aptitude install postgresql nginx apt-transport-https gnupg2

Dépôt AWX

Nous importons la clé du dépôt

wget -qO - https://people.debian.org/~kapouer/apt/kapouer.asc  |  sudo apt-key add -

Nous ajoutons le dépôt AWX

echo "deb https://people.debian.org/~kapouer/apt/awx/ buster contrib" | sudo tee -a etc/apt/sources.list.d/awx.list

À titre d’information, les dépendances d’AWX

apt depends awx
awx
  Dépend: libc6 (>= 2.28)
  Dépend: libcap2 (>= 1:2.10)
  Dépend: libgcc1 (>= 1:3.0)
  Dépend: libldap-2.4-2 (>= 2.4.11)
  Dépend: libpcre3
  Dépend: libpq5 (>= 10~~)
  Dépend: libpython3.7 (>= 3.7.0)
  Dépend: libssl1.1 (>= 1.1.0)
  Dépend: libstdc++6 (>= 4.1.1)
  Dépend: libxml2 (>= 2.7.4)
  Dépend: libxmlsec1 (>= 1.2.27)
  Dépend: libxmlsec1-openssl (>= 1.2.27)
  Dépend: libxslt1.1 (>= 1.1.25)
  Dépend: libyaml-0-2
  Dépend: zlib1g (>= 1:1.2.0)
  Dépend: adduser
  Dépend: git
  Dépend: swig
  Dépend: pwgen
  Dépend: python
  Dépend: redis
  Dépend: sudo
    sudo-ldap

Nous rafraîchissons le contenu des dépôts et installons AWX

sudo aptitude update && sudo aptitude install awx

Création base de données

Nous créons l’utilisateur et la base de données Postgresql

sudo -u postgres createuser -S awx
sudo -u postgres createdb -O awx awx

Nous copions les fichiers de base de données et d’ID cluster

sudo cp -v /etc/awx/conf.d/database.py.sample /etc/awx/conf.d/database.py
sudo cp -v /etc/awx/conf.d/cluster_id.py.sample /etc/awx/conf.d/cluster_id.py

Nous créons les schémas de la base de données

sudo -u awx awx-manage migrate

Si vous avez ce message d’erreur

ModuleNotFoundError: No module named 'distutils.dir_util'

Il faut installer python3-distutils

sudo aptitude install python3-distutils

L’opération de peuplement de la base a cette forme

Operations to perform:
  Apply all migrations: auth, conf, contenttypes, main, oauth2_provider, sessions, sites, social_django, sso, taggit
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying taggit.0001_initial... OK
  Applying taggit.0002_auto_20150616_2121... OK
  Applying auth.0001_initial... OK
  Applying main.0001_initial... OK
  Applying main.0002_squashed_v300_release... OK
  Applying main.0003_squashed_v300_v303_updates... OK
  Applying main.0004_squashed_v310_release... OK
  Applying conf.0001_initial... OK
  Applying conf.0002_v310_copy_tower_settings... OK
  Applying main.0005_squashed_v310_v313_updates... OK
  Applying main.0006_v320_release... OK
  Applying main.0007_v320_data_migrations... OK
  Applying main.0008_v320_drop_v1_credential_fields... OK
  Applying main.0009_v322_add_setting_field_for_activity_stream... OK
  Applying main.0010_v322_add_ovirt4_tower_inventory... OK
  Applying main.0011_v322_encrypt_survey_passwords... OK
  Applying main.0012_v322_update_cred_types... OK
  Applying main.0013_v330_multi_credential... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying conf.0003_v310_JSONField_changes... OK
  Applying conf.0004_v320_reencrypt... OK
  Applying conf.0005_v330_rename_two_session_settings... OK
  Applying conf.0006_v331_ldap_group_type... OK
  Applying conf.0007_v380_rename_more_settings... OK
  Applying sessions.0001_initial... OK
  Applying main.0014_v330_saved_launchtime_configs... OK
  Applying main.0015_v330_blank_start_args... OK
  Applying main.0016_v330_non_blank_workflow... OK
  Applying main.0017_v330_move_deprecated_stdout... OK
  Applying main.0018_v330_add_additional_stdout_events... OK
  Applying main.0019_v330_custom_virtualenv... OK
  Applying main.0020_v330_instancegroup_policies... OK
  Applying main.0021_v330_declare_new_rbac_roles... OK
  Applying main.0022_v330_create_new_rbac_roles... OK
  Applying main.0023_v330_inventory_multicred... OK
  Applying main.0024_v330_create_user_session_membership... OK
  Applying main.0025_v330_add_oauth_activity_stream_registrar... OK
  Applying oauth2_provider.0001_initial... OK
  Applying main.0026_v330_delete_authtoken... OK
  Applying main.0027_v330_emitted_events... OK
  Applying main.0028_v330_add_tower_verify... OK
  Applying main.0030_v330_modify_application... OK
  Applying main.0031_v330_encrypt_oauth2_secret... OK
  Applying main.0032_v330_polymorphic_delete... OK
  Applying main.0033_v330_oauth_help_text... OK
  Applying main.0034_v330_delete_user_role... OK
  Applying main.0035_v330_more_oauth2_help_text... OK
  Applying main.0036_v330_credtype_remove_become_methods... OK
  Applying main.0037_v330_remove_legacy_fact_cleanup... OK
  Applying main.0038_v330_add_deleted_activitystream_actor... OK
  Applying main.0039_v330_custom_venv_help_text... OK
  Applying main.0040_v330_unifiedjob_controller_node... OK
  Applying main.0041_v330_update_oauth_refreshtoken... OK
  Applying main.0042_v330_org_member_role_deparent... OK
  Applying main.0043_v330_oauth2accesstoken_modified... OK
  Applying main.0044_v330_add_inventory_update_inventory... OK
  Applying main.0045_v330_instance_managed_by_policy... OK
  Applying main.0046_v330_remove_client_credentials_grant... OK
  Applying main.0047_v330_activitystream_instance... OK
  Applying main.0048_v330_django_created_modified_by_model_name... OK
  Applying main.0049_v330_validate_instance_capacity_adjustment... OK
  Applying main.0050_v340_drop_celery_tables... OK
  Applying main.0051_v340_job_slicing... OK
  Applying main.0052_v340_remove_project_scm_delete_on_next_update... OK
  Applying main.0053_v340_workflow_inventory... OK
  Applying main.0054_v340_workflow_convergence... OK
  Applying main.0055_v340_add_grafana_notification... OK
  Applying main.0056_v350_custom_venv_history... OK
  Applying main.0057_v350_remove_become_method_type... OK
  Applying main.0058_v350_remove_limit_limit... OK
  Applying main.0059_v350_remove_adhoc_limit... OK
  Applying main.0060_v350_update_schedule_uniqueness_constraint... OK
  Applying main.0061_v350_track_native_credentialtype_source... OK
  Applying main.0062_v350_new_playbook_stats... OK
  Applying main.0063_v350_org_host_limits... OK
  Applying main.0064_v350_analytics_state... OK
  Applying main.0065_v350_index_job_status... OK
  Applying main.0066_v350_inventorysource_custom_virtualenv... OK
  Applying main.0067_v350_credential_plugins... OK
  Applying main.0068_v350_index_event_created... OK
  Applying main.0069_v350_generate_unique_install_uuid... OK
  Applying main.0070_v350_gce_instance_id... OK
  Applying main.0071_v350_remove_system_tracking... OK
  Applying main.0072_v350_deprecate_fields... OK
  Applying main.0073_v360_create_instance_group_m2m... OK
  Applying main.0074_v360_migrate_instance_group_relations... OK
  Applying main.0075_v360_remove_old_instance_group_relations... OK
  Applying main.0076_v360_add_new_instance_group_relations... OK
  Applying main.0077_v360_add_default_orderings... OK
  Applying main.0078_v360_clear_sessions_tokens_jt... OK
  Applying main.0079_v360_rm_implicit_oauth2_apps... OK
  Applying main.0080_v360_replace_job_origin... OK
  Applying main.0081_v360_notify_on_start... OK
  Applying main.0082_v360_webhook_http_method... OK
  Applying main.0083_v360_job_branch_override... OK
  Applying main.0084_v360_token_description... OK
  Applying main.0085_v360_add_notificationtemplate_messages... OK
  Applying main.0086_v360_workflow_approval... OK
  Applying main.0087_v360_update_credential_injector_help_text... OK
  Applying main.0088_v360_dashboard_optimizations... OK
  Applying main.0089_v360_new_job_event_types... OK
  Applying main.0090_v360_WFJT_prompts... OK
  Applying main.0091_v360_approval_node_notifications... OK
  Applying main.0092_v360_webhook_mixin... OK
  Applying main.0093_v360_personal_access_tokens... OK
  Applying main.0094_v360_webhook_mixin2... OK
  Applying main.0095_v360_increase_instance_version_length... OK
  Applying main.0096_v360_container_groups... OK
  Applying main.0097_v360_workflowapproval_approved_or_denied_by... OK
  Applying main.0098_v360_rename_cyberark_aim_credential_type... OK
  Applying main.0099_v361_license_cleanup... OK
  Applying main.0100_v370_projectupdate_job_tags... OK
  Applying main.0101_v370_generate_new_uuids_for_iso_nodes... OK
  Applying main.0102_v370_unifiedjob_canceled... OK
  Applying main.0103_v370_remove_computed_fields... OK
  Applying main.0104_v370_cleanup_old_scan_jts... OK
  Applying main.0105_v370_remove_jobevent_parent_and_hosts... OK
  Applying main.0106_v370_remove_inventory_groups_with_active_failures... OK
  Applying main.0107_v370_workflow_convergence_api_toggle... OK
  Applying main.0108_v370_unifiedjob_dependencies_processed... OK
  Applying main.0109_v370_job_template_organization_field... OK
  Applying main.0110_v370_instance_ip_address... OK
  Applying main.0111_v370_delete_channelgroup... OK
  Applying main.0112_v370_workflow_node_identifier... OK
  Applying main.0113_v370_event_bigint... OK
  Applying main.0114_v370_remove_deprecated_manual_inventory_sources... OK
  Applying main.0115_v370_schedule_set_null... OK
  Applying main.0116_v400_remove_hipchat_notifications... OK
  Applying main.0117_v400_remove_cloudforms_inventory... OK
  Applying main.0118_add_remote_archive_scm_type... OK
  Applying main.0119_inventory_plugins... OK
  Applying main.0120_galaxy_credentials... OK
  Applying main.0121_delete_toweranalyticsstate... OK
  Applying oauth2_provider.0002_08_updates... OK
  Applying oauth2_provider.0003_auto_20160316_1503... OK
  Applying oauth2_provider.0004_auto_20160525_1623... OK
  Applying oauth2_provider.0005_auto_20170514_1141... OK
  Applying oauth2_provider.0006_auto_20171214_2232... OK
  Applying sites.0001_initial... OK
  Applying sites.0002_alter_domain_unique... OK
  Applying social_django.0001_initial... OK
  Applying social_django.0002_add_related_name... OK
  Applying social_django.0003_alter_email_max_length... OK
  Applying social_django.0004_auto_20160423_0400... OK
  Applying social_django.0005_auto_20160727_2333... OK
  Applying social_django.0006_partial... OK
  Applying social_django.0007_code_timestamp... OK
  Applying social_django.0008_partial_timestamp... OK
  Applying sso.0001_initial... OK
  Applying sso.0002_expand_provider_options... OK
  Applying taggit.0003_taggeditem_add_unique_index... OK

Nous créons le super utilisateur

sudo -u awx awx-manage createsuperuser

Nous répondons aux questions

Username (leave blank to use 'awx'): 
Email address: name@domain.tld
Password: 
Password (again): 
Superuser created successfully.

Nous provisionnons l’instance

sudo -u awx awx-manage provision_instance --hostname=myhost
sudo -u awx awx-manage register_queue --queuename=tower --hostnames=myhost

Configuration du proxy Web

Nous copions l’exemple

sudo cp -v /usr/share/doc/awx/nginx-awx.conf /etc/nginx/sites-available/

Nous adaptons la configuration.

Nous créons un lien symbolique dans sites-enable

cd /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/nginx-awx.conf

Nous redémarrons nginx et les services AWX

sudo systemctl restart nginx.service
sudo systemctl restart awx-cbreceiver.service
sudo systemctl restart awx-daphne.service
sudo systemctl restart awx-dispatcher.service  awx-web.service

Si tout s’est bien passé, vous devez pouvoir vous connecter sur l’instance depuis votre navigateur.

Edit : correction ortographe + manquait un aptitude update avant install paquet awx.

1 J'aime

Étant donné qu’en tant que « nouveau » sur ce forum, je n’avais droit qu’à deux liens dans mon message, j’ajoute les liens ici :

1 J'aime

Hello c’est moi kapouer:
j’ai laissé un bug dans debian/postinst de la version 15.0.1 du paquet awx:
py3compile /var/lib/awx
durant l’installation, au lieu de /var/lib/awx/venv.
C’est ennuyeux car cela « compile » tous les fichiers de type python.
Je corrigerai ça dans une version 15.0.1-1 ou bien dès que j’ai une version awx 19 qui fonctionne.

2 J'aimes

Merci encore pour ton travail et ton aide :slight_smile: