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.