Introducción
Ansible es un potente sistema de gestión de la configuración que se utiliza para configurar y gestionar la infraestructura y las aplicaciones en una variedad de entornos. Si bien Ansible proporciona una sintaxis fácil de leer, flujos de trabajo flexibles y herramientas poderosas, administrar una gran cantidad de hosts puede ser un desafío si difieren según el entorno de implementación y la funcionalidad.
En este tutorial, discutiremos algunas estrategias para usar Ansible para trabajar con entornos de implementación de múltiples etapas. Normalmente, los requisitos para las diferentes etapas dan lugar a diferentes cantidades y diferentes configuraciones de componentes. Por ejemplo, los requisitos de memoria para un servidor de desarrollo pueden diferir de los de los entornos de ensayo y producción, y es importante tener un control explícito sobre cómo las variables que representan esos requisitos tienen prioridad. En este artículo, discutiremos algunas de las formas de abstraer estas diferencias y algunas de las construcciones que Ansible proporciona para fomentar la reutilización de la configuración.
Estrategias incompletas para gestionar entornos de varias etapas con Ansible
Si bien hay varias formas de administrar entornos en Ansible, Ansible en sí no ofrece una mejor solución. Más bien, proporciona muchas construcciones que se pueden utilizar para manipular entornos y permite que el usuario elija.
El enfoque, que demostramos en esta guía, se basa en un grupo de variables Ansible y múltiples registros ( Inventarios ). Sin embargo, hay varias otras estrategias que vale la pena considerar. Veremos algunas de estas ideas a continuación y descubriremos por qué pueden ser problemáticas cuando se implementan en entornos complejos.
Si desea comenzar con la estrategia Ansible recomendada, vaya a la sección sobre el uso de grupos Ansible y múltiples registros.
Depender únicamente de variables de 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
, .
En este artículo, exploramos la flexibilidad que Ansible brinda para administrar sus hosts en múltiples entornos. Esto permite a los usuarios aplicar muchas estrategias diferentes para manejar la prioridad variable cuando el anfitrión es miembro de varios grupos, pero la ambigüedad y la falta de orientación oficial pueden ser un problema para usted. Como ocurre con cualquier tecnología, la mejor opción para su organización dependerá de sus casos de uso y de la complejidad de sus requisitos. La mejor manera de encontrar una estrategia adecuada para usted es experimentar. Comparta su caso de uso y enfoque en los comentarios a continuación.