Tools/Ansible/Use Cases

De MonPtitSite
Sauter à la navigation Sauter à la recherche
Accueil SysAdmin Hobbies                  


Ansible - Cas d'usage

Include des variables depuis un fichier Ansible Vault

Ex, le fichier de variables dépend de l’environnement (prod,dev, qual etc ...)

---
# ./configure_app_servers.yml

- name: configure app servers
  hosts: app_servers
  pre_tasks:
    - name: include env vars
      include_vars: "{{ env }}.yml"
      tags: ["always"]

    - name: include vault for env
      include_vars: "{{ env }}.vault.yml"
      tags: ["always"]
  roles:
    ...

Vous pouvez régler env en passant l'option --extra-vars à ansible-playbook :

$ ansible-playbook configure_app_servers.yml --extra-vars "env=prod"


Exemples de fichier de param :


---
# ./vars/prod.yml

domain: example.com
rails_env: production
https: true

Le fichier prod.vault.yml peut ressembler à ceci (en texte brut) :

$ANSIBLE_VAULT;1.1;AES256
3462353065386462383165626...
...

Mais à ceci si on utilise la commande ansible-vault view ./vars/prod.vault.yml:


---
# ./vars/prod.vault.yml

database_password: "94BqEabtebgzbQItkqPEVMyqjKbp57Gc"
api_key: "xVQKRARKgcwDktPCJjYRFiqmHGsvNFd9"

Inclure des "tasks"

gestion de boucles

Cette technique est utile chaque fois que vous devez exécuter plusieurs tâches pour chaque élément d'une boucle.


exemple :

---
# ./greet_tasks.yml

- name: set greeting fact
  set_fact: 
    greeting: "Greeting {{ index }}: Hello, {{ name }}!"

- name: print greeting fact
  debug: var=greeting

Vous pouvez exécuter ces tâches dans une bloucle comme ceci :

# ./greet.yml

- name: greet people
  hosts: "*"
  tasks:
    - include_tasks: greet_tasks.yml
      loop:
        - World
        - Percy
      loop_control:
        loop_var: name
        index_var: index


Ce qui donne à l'exécution du playbook :


TASK [set greeting fact]
ok: [123.123.123.123]

TASK [print greeting fact]
ok: [123.123.123.123] => {
    "greeting": "Greeting 0: Hello, World!"
}

TASK [set greeting fact]
ok: [123.123.123.123]

TASK [print greeting fact]
ok: [123.123.123.123] => {
    "greeting": "Greeting 1: Hello, Percy!"
}

Inclure des "tasks" à partir de fichier dynamiques

L'inclusion de tâches avec un nom de fichier dynamique est le plus souvent utilisée pour faire varier les tâches en fonction du système d'exploitation de l'hôte distant.

Prenons l'exemple suivant :

# ./roles/redis/tasks/main.yml

- name: install redis on Debian based distros 
  apt:
    name: redis-server
    state: present
    update_cache: true
  become: true
  when: ansible_os_family == 'Debian'

- name: ensure epel-release repo is installed on RHEL based distros
  yum:
    name: epel-release
    state: present
    update_cache: true
  become: true
  when: ansible_os_family == 'RedHat'

- name: install redis on RHEL based distros
  yum:
    name: redis
    state: present
    update_cache: true
  become: true
  when: ansible_os_family == 'RedHat'


Il peut être avantageusement factorisé en 3 tâches distinctes de la façon suivante :


---
# ./roles/redis/tasks/setup-Debian.yml

- name: install redis on Debian based distros 
  apt:
    name: redis-server
    state: present
    update_cache: true
  become: true
  when: ansible_os_family == 'Debian'
---
# ./roles/redis/tasks/setup-RedHat.yml

- name: ensure epel-release repo is installed on RHEL based distros
  yum:
    name: epel-release
    state: present
    update_cache: true
  become: true
  when: ansible_os_family == 'RedHat'

- name: install redis on RHEL based distros
  yum:
    name: redis
    state: present
    update_cache: true
  become: true
  when: ansible_os_family == 'RedHat'


# ./roles/redis/tasks/main.yml

- include_tasks: "setup-{{ ansible_os_family }}.yml"