Attention, cet article a plus d'une année d'ancienneté. Il est possible que les informations présentées ne soient plus à jour, spécialement dans le cadre d'un article technique.
Bonjour,
Aujourd’hui on va voir comment installer Ansible et Semaphore sur Ubuntu 16.04.
On verra également comment faire un reverse proxy Nginx + SSL pour l’interface Semaphore.
Je ferrais peut-être d’autres articles sur Ansible mais, peut-être pas sur Semaphore, l’application s’installant par défaut dans le /tmp/ (ouais, un répertoire volatile qui s’efface à chaque reboot), la documentation étant misérable (je reviendrais dessus) et le bordel ne tournant même pas sous forme de service …
Ansible est un utilitaire de gestion de configuration et d’automatisation de déploiement et Semaphore est une interface web pour gérer Ansible (pour faire court).
Installation de Ansible et Semaphore :
Installation du serveur Ansible :
Dans un premier temps, on va ajouter le dépôt de Ansible pour récupérer les paquets à jour :
apt-get install software-properties-common apt-add-repository ppa:ansible/ansible apt-get update
Ensuite, vous pourrez installer Ansible avec la commande suivante :
apt-get install ansible
Créez ensuite vos groupes d’hôtes dans Ansible en les répertoriant par rôles :
echo "" > /etc/ansible/hosts nano /etc/ansible/hosts
Par exemple, pour moi :
[ansible] ansible.1806.abyssproject.xyz [web] web-01.1806.abyssproject.xyz web-02.1806.abyssproject.xyz [db] db-01.1806.abyssproject.xyz
Configuration des clients :
Je vais configurer les clients pour que l’on puisse y accéder sans mot de passe avec un échange de clef ssh.
Sur tous les serveurs :
Installez sudo et créez un utilisateur nommé ansible :
apt-get install sudo adduser ansible mkdir /home/ansible/.ssh && chown ansible:ansible /home/ansible/.ssh
Sur le serveur ansible :
Connectez-vous avez l’utilisateur ansible et créez une clef SSH RSA de 4096 bits :
su ansible cd /home/ansible/ ssh-keygen -b 4096
Maintenant, déployez la sur tous vos serveurs :
cat .ssh/id_rsa.pub | ssh ansible@serveurdistant 'cat >> .ssh/authorized_keys'
Sur tous les serveurs :
Supprimez le mot de passe de l’utilisateur ansible
passwd -dl ansible
Éditez le fichier des sudoers :
visudo
Ajoutez la ligne suivante à la fin du fichier et sauvegardez :
ansible ALL=(ALL) NOPASSWD: ALL
Sur le serveur ansible :
Installez tous les dépendances nécessaires sur votre infrastructure avec la commande suivante qui utilisera toutes les entrées de votre fichier hosts :
ansible all -s -m raw -a "apt-get install -y python python-simplejson"
Maintenant, vous pourrez utiliser le module Shell par exemple pour lancer diverses commandes :
ansible all -s -m shell -a 'apt-get install haveged -y'
Installation de Semaphore :
Donc là, on va commencer par ce qui me dérange d’entrée de jeu chez Semaphore.
La documentation officielle vous fait utiliser une image docker de MySQL que vous ne mettrez surement jamais à jour par la suite.
C’est une connerie monumentale (l’expression est juste dans cette situation) car vous introduisez ce qui sera une faille de sécurité énorme dans votre infrastructure dès que le prochain CVE sur MySQL tombera.
Rien de grave, c’est juste le serveur qui est censé gérer TOUTE votre infrastructure …
DONC, le peu qu’il y’a a faire on va le faire à la main, comme des grands, surtout que ce n’est pas bien compliqué et comme ça vous pourrez mettre à jour le reste de votre serveur avec.
Retournez sur l’utilisateur root et installez MariaDB et GIT avec la commande suivante :
apt-get install mariadb-server git -y
Créez un utilisateur admin qui remplacera l’utilisateur root (qui demande maintenant une auth par plugin et non plus par mot de passe sur Ubuntu …) :
mysql -uroot CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost'; FLUSH PRIVILEGES;
Ensuite, téléchargez Semaphore et lancez l’installateur :
curl -L https://github.com/ansible-semaphore/semaphore/releases/download/v2.0.2/semaphore_linux_amd64 > /usr/bin/semaphore chmod +x /usr/bin/semaphore semaphore -setup
Suivez bien les étapes comme ci-dessous :
Hello! You will now be guided through a setup to:
1. Set up configuration for a MySQL/MariaDB database
2. Set up a path for your playbooks (auto-created)
3. Run database Migrations
4. Set up initial semaphore user & password> DB Hostname (default 127.0.0.1:3306): <- Enter
> DB User (default root): admin <- Admin
> DB Password: password <- Mot de passe MariaDB
> DB Name (default semaphore): <- Enter
> Playbook path: /home/ansible/ <- Répertoire home de l’utilisateur AnsibleGenerated configuration:
{
« mysql »: {
« host »: « 127.0.0.1:3306 »,
« user »: « admin »,
« pass »: « password »,
« name »: « semaphore »
},
« port »: « »,
« bugsnag_key »: « »,
« tmp_path »: « /home/ansible »,
« cookie_hash »: « t6PRn4/gaBgoxAYmh25Rif4Qg2B3j4dboT/yxIGJ3rE= »,
« cookie_encryption »: « i2LMSIEDAwJK2rNZdKGywQdKV64elIgU+hzrTiO/EHs= »
}> Is this correct? (yes/no): yes <- Yes
Running: mkdir -p /home/ansible..
Configuration written to /home/ansible/semaphore_config.json..
Pinging database..Running DB Migrations..
Creating migrations table
Executing migration v0.0.0 (at 2016-06-18 10:58:56.3581791 -0400 EDT)…
[11/11]
Executing migration v1.0.0 (at 2016-06-18 10:58:56.54882068 -0400 EDT)…
[7/7]
Executing migration v1.1.0 (at 2016-06-18 10:58:56.697986359 -0400 EDT)…
[1/1]
Executing migration v1.2.0 (at 2016-06-18 10:58:56.724855006 -0400 EDT)…
[1/1]
Executing migration v1.3.0 (at 2016-06-18 10:58:56.74131827 -0400 EDT)…
[3/3]
Executing migration v1.4.0 (at 2016-06-18 10:58:56.794569991 -0400 EDT)…
[2/2]
Executing migration v1.5.0 (at 2016-06-18 10:58:56.8286019 -0400 EDT)…
[1/1]
Executing migration v0.1.0 (at 2016-06-18 10:58:56.844417962 -0400 EDT)…
[6/6]
> Username: nicolas <- Nom d’utilisateur
> Email: nicolas@abyssproject.net <- Email
> Your name: nicolas <- Ton petit nom
> Password: password <- Un mot de passe badassYou are all setup nicolas!
Re-launch this program pointing to the configuration file./semaphore -config /home/ansible/semaphore_config.json
To run as daemon:
nohup ./semaphore -config /home/ansible/semaphore_config.json &
You can login with nicolas@abyssproject.net or nicolas.
Lancez la commande suivante pour lancer Semaphore :
nohup semaphore -config /home/ansible/semaphore_config.json &
Mise en place du reverse proxy Nginx :
Installez nginx avec la commande suivante :
apt-get install nginx -y
Virez toutes les configurations par défaut possibles :
rm /etc/nginx/sites-available/default && rm /etc/nginx/sites-enabled/default && rm /etc/nginx/conf.d/default
Créez votre vhost pour Semaphore :
nano /etc/nginx/sites-enabled/semaphore.vhost
Et remplissez-le avec ceci (en modifiant le server_name pour mettre votre domaine) :
server { listen 80; server_name ansible.1806.abyssproject.xyz; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:3000; } #Renouvellement automatique pour le certificat Let's Encrypt location /.well-known/acme-challenge { alias /var/www/.well-known/acme-challenge/; } }
Créez le dossier et redémarrez Nginx :
mkdir /var/www/ && mkdir /var/www/.well-know && service nginx restart
Mise en place du certificat Let’s Encrypt :
Maintenant, on va installer un certificat Let’s Encrypt qui marchera avec Nginx.
Lancez d’abord les commandes suivantes pour créer les paramètres DH et récupérer la configuration Nginx correcte :
cd /etc/ssl/certs && openssl dhparam -out dhparam.pem 4096 cd /etc/nginx/ rm nginx.conf wget https://abyssproject.net/wp-content/uploads/2016/01/nginx.conf_.txt mv nginx.conf_.txt nginx.conf service nginx reload
Ensuite, installez Let’s Encrypt avec les commandes suivantes :
cd /etc git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt ./letsencrypt-auto --help
Créez ensuite un fichier de configuration pour le renouvellement de votre certificat SSL, par exemple pour moi :
mkdir /etc/letsencrypt/configs && nano /etc/letsencrypt/configs/ansible.1806.abyssproject.xyz.conf
Ensuite, créez le fichier de configuration :
domains = ansible.1806.abyssproject.xyz rsa-key-size = 4096 server = https://acme-v01.api.letsencrypt.org/directory email = nicolas@abyssproject.net text = True authenticator = webroot webroot-path = /var/www/
Et lancez les commandes suivantes pour créer le certificat en adaptant à votre configuration, il suffira de relancer ces commandes pour renouveler le certificat :
cd /etc/letsencrypt ./letsencrypt-auto --config /etc/letsencrypt/configs/ansible.1806.abyssproject.xyz.conf certonly
Vous devriez avoir un message similaire si la création de certificat réussie :
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/ansible.1806.abyssproject.xyz/fullchain.pem. Your cert will expire on 2016-09-16. To obtain a new version of the certificate in the future, simply run Certbot again. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
Éditez votre vhost nginx pour rajouter les informations nécessaires :
server { listen 80; listen 443 ssl; ssl_protocols TLSV1 TLSv1.1 TLSv1.2; ssl_certificate /etc/letsencrypt/live/ansible.1806.abyssproject.xyz/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ansible.1806.abyssproject.xyz/privkey.pem; server_name ansible.1806.abyssproject.xyz; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:3000; } location /.well-known/acme-challenge { alias /var/www/.well-known/acme-challenge/; } }
Et voila :
Salut, maintenant que AWX (ansible workers) est sortie en Opensource; comptes tu remplacer sémaphore par celui-ci ?
Salut, je connais pas AWX mais j’ai vu que Tower était passer en OpenSource