Como gerenciar um ambiente de vĂĄrios estĂĄgios com Ansible

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.








All Articles