web-dev-qa-db-fra.com

Est-il possible de définir des variables globales playbook dans Ansible?

J'ai un grand livre de lecture Ansible où les images Docker sont construites lors de son exécution. J'utilise un nombre croissant comme balise pour les version. Actuellement, je dois spécifier ceci dans chaque section hosts:.

Je sais qu'il existe des variables globales, mais d'après ce que j'ai trouvé en recherchant des "variables globales" "ansibles", elles doivent être définies en dehors du livre de jeu. Est-il possible de définir des variables globales qui sont globales pour le playbook?

38
rabejens

Si la balise/version que vous utilisez est applicable à tous les hôtes, utiliser group_vars/all est une option viable. 

Si les numéros de révision sont spécifiques à chaque hôte, les entrées d’un fichier Host_vars/Host_name pourraient être meilleures. 

Si vous voulez lire et initialiser var, puis l'incrémenter après chaque lecture, il devient un peu plus difficile de conserver ces informations sur toutes les lectures (ou chaque hôte, comme vous le dites) dans le livre de lecture. Par exemple, si vous souhaitez déployer N instances de docker, vous pouvez utiliser une magie d'inventaire dynamique comme celle-ci:

- hosts: localhost
  tasks:
  - add_Host: name=docker_{{item}} groups="dockers,other" tag={{item}}
    with_sequence: start={{ext_def_start}} count={{ext_def_num}}


- hosts: docker_*
  tasks:
  - debug: var=tag
15
Petro026

Ansible a un groupe par défaut all qui, curieusement, contient tous les hôtes du fichier d'inventaire.

En tant que tel, vous pouvez faire comme avec n'importe quel groupe d'hôtes et fournir group_vars pour le groupe d'hôtes.

Comme indiqué dans le lien précédent, ceux-ci peuvent être définis directement dans le fichier d'inventaire ou peuvent être contenus dans un fichier séparé nommé d'après le groupe dans un répertoire group_vars au même niveau de répertoire que le fichier d'inventaire.

Un exemple de structure de répertoire pourrait alors ressembler à quelque chose comme:

-ansible
 |--inventory
 |  |--group_vars
 |  |  |--all
 |  |  |--dev
 |  |  |--test
 |  |  |--prod
 |  |  |--webservers
 |  |  |--databases
 |  |--dev
 |  |--test
 |  |--prod
 |--roles
  ...

Votre fichier d'inventaire dev peut alors ressembler à quelque chose comme:

[dev:children]
webservers
databases

[webservers]
web1.dev
web2.dev

[databases]
database-master.dev
database-slave.dev

Tous ces hôtes vont maintenant choisir n'importe quelle configuration spécifique à l'hôte (qui peut être définie en ligne ou, comme avec group_vars, peut être placée dans un dossier Host_vars), ainsi qu'une configuration pour les groupes spécifiques dans lesquels ils se trouvent, tels que webservers et ensuite. Ils héritent également de groupes tels que dev mais aussi, par défaut, all.

Ceci peut ensuite être utilisé pour configurer les choses de manière plus grossière que par hôte.

Des éléments tels que les serveurs NTP peuvent vouloir être définis en tout, alors que les serveurs DNS peuvent être définis au niveau de l'environnement (si votre réseau est segmenté en dev, en test et en production, ils peuvent nécessiter un paramètre de serveur DNS différent dans /etc/resolv.conf ) alors que différents types de serveurs peuvent avoir différentes configurations, telles que des listes de paquets à installer. Enfin, il se peut que certaines choses doivent être spécifiques à l'hôte, telles que la définition de l'ID du serveur MySQL dans un groupe de réplication.

Si, au lieu de cela, vous voulez uniquement définir les paramètres globaux de playbook plutôt que dans l'inventaire (et que d'autres playbooks pourraient y accéder), vous avez simplement besoin d'un bloc vars dans votre définition de play comme ceci:

- hosts: webservers
  vars:
    http_port: 80
  tasks:
    - name: Task1 to be ran against all the webservers
      ...

Comme mentionné précédemment, vous pouvez toujours utiliser le groupe all ici aussi:

- hosts: all
  vars:
    ntp_pool:
      - ntp1.domain
      - ntp2.domain
  tasks:
    - name: Task1 to be ran against all the servers
      ...

En général, cependant, je recommanderais vivement d’utiliser des rôles pour structurer les tâches exécutées sur certains hôtes, puis d’utiliser l’inventaire pour expliquer quels serveurs sont de quel type, puis d’utiliser un répertoire group_vars au niveau de l’inventaire pour contenir toutes les variables de ces groupes. hôtes Faire les choses de cette façon vous aidera à garder les choses dans des endroits sensibles et vous permettra de réutiliser facilement votre base de code.

15
ydaetskcoR

Oui, les vars globaux sont possibles comme ça,

exemple de livret d'installation de splunk

splunk/
   setup_splunk_playbook.yaml
   roles/base
           /tasks/main.yaml
           /tasks/install.yaml
         search_head
           /tasks/configure.yaml
         indexer
           /tasks/configure.yaml
         some_other_role
           /tasks/some_task.yaml
   hosts
   config.yaml

Placez vos vars dans config.yaml

chat splunk/config.yaml

--- 
# global Splunk variables
splunk_version: 7.0.0

dans votre livre de jeu, incluez les rôles

cat setup_splunk_playbook.yaml

- hosts: "search_heads"  
  become_user: root
  become: true
  gather_facts: true

  roles:
    - base
    - search_head

dans votre rôle, incluez le Global Vars dans une tâche

rôles de chat/base/tasks/main.yaml

---
# install Splunk Base

- name: include vars
  include_vars: "{{ playbook_dir }}/config.yaml"

- include: install.yaml

vars sont accessibles dans les tâches maintenant,

rôles de chat/base/tasks/install.yaml

- name: echo version
  debug: splunk version is {{ splunk_version }}
0
perfecto25

Je sais que cela pourrait ne pas répondre exactement à la requête de OP, mais pour les personnes cherchant sur Google pour définir des variables globales (listes/tableaux) afin qu'elles ne soient pas obligées de les définir dans chaque tâche, cela pourrait être assez pratique.

Son étonnamment simple, disons que vous avez une liste de domaines que vous devez passer, j'ai nommé la variable goofy juste pour signifier qu'il pourrait être n'importe quoi.

- hosts: [yourhostlistgoeshere]
  remote_user: root
  vars:
    domainslisto:
       - site1.com
       - website2.xyz

....



  tasks:
    - name: copy vhosts
      template: src=virtualhost.conf dest=/etc/Apache2/sites-available/{{ item }}.conf
      with_items: "{{ domainslisto }}"

    - name: a2ensite {{ item }}
      command: a2ensite {{ item }}
      with_items: "{{ domainslisto }}"
0
Mohd Abdul Mujib