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.