Comment gérer un environnement multi-étapes avec Ansible

introduction







Ansible est un puissant systĂšme de gestion de configuration utilisĂ© pour configurer et gĂ©rer l'infrastructure et les applications dans divers environnements. Alors qu'Ansible fournit une syntaxe facile Ă  lire, des flux de travail flexibles et des outils puissants, la gestion d'un grand nombre d'hĂŽtes peut ĂȘtre difficile si elles diffĂšrent en fonction de l'environnement de dĂ©ploiement et des fonctionnalitĂ©s.







Dans ce didacticiel, nous discuterons de certaines stratégies d'utilisation d'Ansible pour travailler avec des environnements de déploiement en plusieurs étapes. En rÚgle générale, les exigences relatives aux différentes étapes conduisent à des quantités et à des configurations différentes des composants. Par exemple, les exigences de mémoire pour un serveur de développement peuvent différer de celles des environnements de préparation et de production, et il est important d'avoir un contrÎle explicite sur la façon dont les variables qui représentent ces exigences sont prioritaires. Dans cet article, nous discuterons de certaines des façons d'abstraire ces différences et de certaines des constructions fournies par Ansible pour encourager la réutilisation de la configuration.







Stratégies incomplÚtes de gestion d'environnements à plusieurs niveaux avec Ansible







Bien qu'il existe plusieurs façons de gĂ©rer les environnements dans Ansible, Ansible lui-mĂȘme n'offre pas une meilleure solution. Au contraire, il fournit de nombreuses constructions qui peuvent ĂȘtre utilisĂ©es pour manipuler des environnements et permet Ă  l'utilisateur de choisir.







L'approche, que nous dĂ©montrons dans ce guide est basĂ©e sur un groupe de variables Ansible et plusieurs registres ( Inventories ). Cependant, il existe plusieurs autres stratĂ©gies Ă  considĂ©rer. Nous examinerons certaines de ces idĂ©es ci-dessous et dĂ©couvrirons pourquoi elles peuvent ĂȘtre problĂ©matiques lorsqu'elles sont mises en Ɠuvre dans des environnements complexes.







Si vous souhaitez commencer avec la stratégie Ansible recommandée, passez à la section sur l'utilisation des groupes Ansible et de plusieurs registres.







S'appuyer uniquement sur des variables de groupe







, Ansible . , . Ansible . . . :







  • (, dev, stage, prod . .)
  • (-, . .)
  • (NYC, SFO . .)


. , - () ( ) - ( ).







, Ansible . , , , , Ansible .







Ansible . Ansible , , , . , .













Ansible , [groupname: children]



. . , .







. , environment



, dev



, stage



, prod



. , environment



dev



. , functions



, web



, database



loadbalancer



.







, . , , environments



functions



. .







, . , , :









, :







. . .
[function:children]
web
database
loadbalancer
region

[region:children]
nyc
sfo
environments

[environments:children]
dev
stage
prod
      
      





, , region



function



. , environments



, . , dev



, nyc



web



, , , dev



.







. , . Ansible , . .







Ansible-,







Ansible , , vars_files



include_vars



. Ansible plays , . vars_files



, include_vars



.







, group_vars



, .







, group_vars



:

group_vars/dev







---
env: dev
      
      





group_vars/stage







---
env: stage
      
      





group_vars/web







---
function: web
      
      





group_vars/database







---
function: database
      
      





vars



, . vars. group_vars



, include_vars



.yml.







, server_memory_size



vars



. , , , . , - :







vars/dev.yml







---
server_memory_size: 512mb
      
      





vars/prod.yml







---
server_memory_size: 4gb
      
      





vars/web.yml







---
server_memory_size: 1gb
      
      





vars/database.yml







---
server_memory_size: 2gb
      
      





playbook, vars



, group_vars



. , .







vars_files



:







example_play.yml







---
- name: variable precedence test
  hosts: all
  vars_files:
    - "vars/{{ env }}.yml"
    - "vars/{{ function }}.yml"
  tasks:
    - debug: var=server_memory_size
      
      





, server_memory_size



var/web.yml



var/database.yml



:







ansible-playbook -i inventory example_play.yml
      
      





Output. . .
TASK [debug] *******************************************************************
ok: [host1] => {
    "server_memory_size": "1gb"      # value from vars/web.yml
}
ok: [host2] => {
    "server_memory_size": "1gb"      # value from vars/web.yml
}
ok: [host3] => {
    "server_memory_size": "2gb"      # value from vars/database.yml
}
ok: [host4] => {
    "server_memory_size": "2gb"      # value from vars/database.yml
}
. . .
      
      





, :







example_play.yml







---
- name: variable precedence test
  hosts: all
  vars_files:
    - "vars/{{ function }}.yml"
    - "vars/{{ env }}.yml"
  tasks:
    - debug: var=server_memory_size
      
      





playbook , :







ansible-playbook -i inventory example_play.yml
      
      





Copy







Output. . .
TASK [debug] *******************************************************************
ok: [host1] => {
    "server_memory_size": "512mb"      # value from vars/dev.yml
}
ok: [host2] => {
    "server_memory_size": "4gb"        # value from vars/prod.yml
}
ok: [host3] => {
    "server_memory_size": "512mb"      # value from vars/dev.yml
}
ok: [host4] => {
    "server_memory_size": "4gb"        # value from vars/prod.yml
}
. . .
      
      





include_vars



, , :







---
- name: variable precedence test
  hosts: localhost
  tasks:
    - include_vars:
        file: "{{ item }}"
      with_items:
        - "vars/{{ function }}.yml"
        - "vars/{{ env }}.yml"
    - debug: var=server_memory_size
      
      





, Ansible , . , , .







, vars_files



include_vars



, , , . group_vars



, vars



. . , Ansible group_vars



.







, . playbook , . Playbook . , ansible



-, .







Ansible:







, . Ansible , .







— , . , , . group_vars



.







:







.
├── ansible.cfg
├── environments/         # Parent directory for our environment-specific directories
│   │
│   ├── dev/              # Contains all files specific to the dev environment
│   │   ├── group_vars/   # dev specific group_vars files
│   │   │   ├── all
│   │   │   ├── db
│   │   │   └── web
│   │   └── hosts         # Contains only the hosts in the dev environment
│   │
│   ├── prod/             # Contains all files specific to the prod environment
│   │   ├── group_vars/   # prod specific group_vars files
│   │   │   ├── all
│   │   │   ├── db
│   │   │   └── web
│   │   └── hosts         # Contains only the hosts in the prod environment
│   │
│   └── stage/            # Contains all files specific to the stage environment
│       ├── group_vars/   # stage specific group_vars files
│       │   ├── all
│       │   ├── db
│       │   └── web
│       └── hosts         # Contains only the hosts in the stage environment
│
├── playbook.yml
│
└── . . .
      
      





, . (hosts



) group_vars



.







. web



db



. . , , , . group_vars



.







. , , . -, . .













, , — . . — Ansible . all



group_vars



all



.







, , . , . .







- . (environments



). :







cd environments
touch 000_cross_env_vars
      
      





group_vars



, all



all



. :







cd dev/group_vars
mv all env_specific
mkdir all
mv env_specific all/
      
      





, :







cd all/
ln -s ../../../000_cross_env_vars .
      
      





, :







.
├── ansible.cfg
├── environments/
│   │
│   ├── 000_cross_env_vars
│   │
│   ├── dev/
│   │   ├── group_vars/
│   │   │   ├── all/
│       │   │   ├── 000_cross_env_vars -> ../../../000_cross_env_vars
│   │   │   │   └── env_specific
│   │   │   ├── db
│   │   │   └── web
│   │   └── hosts
│   │
│   ├── prod/
│   │   ├── group_vars/
│   │   │   ├── all/
│   │   │   │   ├── 000_cross_env_vars -> ../../../000_cross_env_vars
│   │   │   │   └── env_specific
│   │   │   ├── db
│   │   │   └── web
│   │   └── hosts
│   │
│   └── stage/
│       ├── group_vars/
│       │   ├── all/
│       │   │   ├── 000_cross_env_vars -> ../../../000_cross_env_vars
│       │   │   └── env_specific
│       │   ├── db
│       │   └── web
│       └── hosts
│
├── playbook.yml
│
└── . . .
      
      





, 000_cross_env_vars



, .













ansible.cfg



. .







-, ansible



ansible-playbook



. :







ansible -i environments/dev -m ping
      
      





, :







ansible -m ping
      
      





-, . . , , -i



.







, ansible.cfg



. /etc/ansible/ansible.cfg



.







. ansible.cfg



. /etc/ansibile/ansible.cfg



, . /etc/ansible/ansible.cfg



/etc/ansible



, .







nano ansible.cfg
      
      





, . , hosts:







[defaults]
inventory = ./environments/dev
      
      





-i



. - -i



, .













Dans cet article, nous avons explorĂ© la flexibilitĂ© qu'offre Ansible pour gĂ©rer vos hĂŽtes dans plusieurs environnements. Cela permet aux utilisateurs d'appliquer de nombreuses stratĂ©gies diffĂ©rentes pour gĂ©rer la prioritĂ© variable lorsque l'hĂŽte est membre de plusieurs groupes, mais l'ambiguĂŻtĂ© et le manque de conseils officiels peuvent ĂȘtre un problĂšme pour vous. Comme pour toute technologie, la meilleure solution pour votre organisation dĂ©pendra de vos cas d'utilisation et de la complexitĂ© de vos exigences. La meilleure façon de trouver une stratĂ©gie qui vous convient est d'expĂ©rimenter. Partagez votre cas d'utilisation et votre approche dans les commentaires ci-dessous.








All Articles