Introdução
Ansible Ă© um sistema de gerenciamento de configuração poderoso usado para configurar e gerenciar infraestrutura e aplicativos em uma variedade de ambientes. Embora o Ansible forneça uma sintaxe fĂĄcil de ler, fluxos de trabalho flexĂveis e ferramentas poderosas, gerenciar um grande nĂșmero de hosts pode ser desafiador se eles diferirem dependendo do ambiente de implantação e da funcionalidade.
Neste tutorial, discutiremos algumas estratĂ©gias para usar o Ansible para trabalhar com ambientes de implantação de vĂĄrios estĂĄgios. Normalmente, os requisitos para diferentes estĂĄgios levam a diferentes quantidades e diferentes configuraçÔes de componentes. Por exemplo, os requisitos de memĂłria para um servidor de desenvolvimento podem ser diferentes daqueles para ambientes de teste e produção, e Ă© importante ter controle explĂcito sobre como as variĂĄveis ââque representam esses requisitos tĂȘm precedĂȘncia. Neste artigo, discutiremos algumas das maneiras de abstrair essas diferenças e algumas das construçÔes que o Ansible fornece para incentivar a reutilização da configuração.
Estratégias incompletas para gerenciar ambientes de vårios estågios com Ansible
Embora existam vårias maneiras de gerenciar ambientes no Ansible, o próprio Ansible não oferece uma solução melhor. Em vez disso, ele fornece muitas construçÔes que podem ser usadas para manipular ambientes e permite que o usuårio escolha.
A abordagem, que demonstramos neste guia, Ă© baseada em um grupo de variĂĄveis Ansible e registros mĂșltiplos ( InventĂĄrios ). No entanto, existem vĂĄrias outras estratĂ©gias que vale a pena considerar. Veremos algumas dessas ideias abaixo e descobriremos por que podem ser problemĂĄticas quando implementadas em ambientes complexos.
Se vocĂȘ gostaria de começar com a estratĂ©gia Ansible recomendada, pule para a seção sobre o uso de grupos Ansible e registros mĂșltiplos.
Baseando-se apenas nas variĂĄveis ââdo grupo
, 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
, .
Neste artigo, exploramos a flexibilidade que o Ansible oferece para gerenciar seus hosts em vĂĄrios ambientes. Isso permite que os usuĂĄrios apliquem muitas estratĂ©gias diferentes para lidar com a prioridade variĂĄvel quando o host Ă© membro de vĂĄrios grupos, mas a ambigĂŒidade e a falta de orientação oficial podem ser um problema para vocĂȘ. Como acontece com qualquer tecnologia, o melhor ajuste para sua organização dependerĂĄ de seus casos de uso e da complexidade de seus requisitos. A melhor maneira de encontrar a estratĂ©gia certa para vocĂȘ Ă© experimentando. Compartilhe seu caso de uso e abordagem nos comentĂĄrios abaixo.