tp3_provisionner_roles
.Dans notre infra virtuelle, nous avons trois machines dans deux groupes. Quand notre lab d’infra grossit il devient laborieux de créer les machines et affecter les ip à la main. En particulier détruire le lab et le reconstruire est pénible. Nous allons pour cela introduire un playbook de provisionning qui va créer les conteneurs lxd en définissant leur ip à partir de l’inventaire.
[all:vars]
ansible_user=<votre_user>
[appservers]
app1 ansible_host=10.x.y.121 container_image=ubuntu_ansible node_state=started
app2 ansible_host=10.x.y.122 container_image=ubuntu_ansible node_state=started
[dbservers]
db1 ansible_host=10.x.y.131 container_image=ubuntu_ansible node_state=started
Remplacez x
et y
dans l’adresse IP par celle fournies par votre réseau virtuel lxd (faites lxc list
et copier simplement les deux chiffres du milieu des adresses IP)
Ajoutez un playbook provision_lxd_infra.yml
dans un dossier provisionners
contenant:
- hosts: localhost
connection: local
tasks:
- name: Setup linux containers for the infrastructure simulation
lxd_container:
name: "{{ item }}"
state: "{{ hostvars[item]['node_state'] }}"
source:
type: image
alias: "{{ hostvars[item]['container_image'] }}"
profiles: ["default"]
config:
security.nesting: 'true'
security.privileged: 'false'
devices:
# configure network interface
eth0:
type: nic
nictype: bridged
parent: lxdbr0
# get ip address from inventory
ipv4.address: "{{ hostvars[item].ansible_host }}"
# Comment following line if you installed lxd using apt
url: unix:/var/snap/lxd/common/lxd/unix.socket
wait_for_ipv4_addresses: true
timeout: 600
register: containers
loop: "{{ groups['all'] }}"
# Uncomment following if you want to populate hosts file pour container local hostnames
# AND launch playbook with --ask-become-pass option
# - name: Config /etc/hosts file accordingly
# become: yes
# lineinfile:
# path: /etc/hosts
# regexp: ".*{{ item }}$"
# line: "{{ hostvars[item].ansible_host }} {{ item }}"
# state: "present"
# loop: "{{ groups['all'] }}"
Etudions le playbook (explication démo).
Lancez le playbook avec sudo
car lxd
se contrôle en root sur localhost: sudo ansible-playbook provision_lxd_infra
(c’est le seul cas exceptionnel ou ansible-playbook doit être lancé avec sudo, pour les autre playbooks ce n’est pas le cas)
Lancez lxc list
pour afficher les nouvelles machines de notre infra et vérifier que le serveur de base de données a bien été créé.
roles
dans lequel seront rangés tous les rôles (c’est une convention Ansible à respecter).flaskapp
dans roles
.flaskapp
├── defaults
│ └── main.yml
├── handlers
│ └── main.yml
├── tasks
│ ├── deploy_app_tasks.yml
│ └── main.yml
└── templates
├── app.service.j2
└── nginx.conf.j2
defaults/main.yml
permet de définir des valeurs par défaut pour les variables du rôle. Mettez à l’intérieur une application par défaut :flask_apps:
- name: defaultflask
domain: defaultflask.test
repository: https://github.com/e-lie/flask_hello_ansible.git
version: master
user: defaultflask
Ces valeurs seront écrasées par celles fournies dans le dossier group_vars
(la liste de deux applications du TP2). Elle est présente pour que le rôle fonctionne même en l’absence de variable (valeurs de fallback).
Copiez les tâches (juste la liste de tirets sans l’intitulé de section tasks:
) contenues dans le playbook appservers
dans le fichier tasks/main.yml
.
De la même façon, copiez le handler dans handlers/main.yml
sans l’intitulé handlers:
.
Copiez également le fichier deploy_flask_tasks.yml
dans le dossier tasks
.
Déplacez vos deux fichiers de template dans le dossier templates
du rôle (et non celui à la racine que vous pouvez supprimer).
Pour appeler notre nouveau rôle, supprimez les sections tasks:
et handlers:
du playbook appservers.yml
et ajoutez à la place:
roles:
- flaskapp
appservers.yml
et debuggez le résultat le cas échéant.tp3_correction
avec git checkout tp3_correction
.Il contient également les corrigés du TP2 et TP4 dans d’autres branches.
Essayez différents exemples de projets de Geerlingguy accessibles sur GitHub à l’adresse https://github.com/geerlingguy/ansible-for-devops.