automium.consul
Rol de Ansible para desplegar Consul
Consul
Características
Configurar Consul con YAML
La configuración del servicio Consul se realiza mediante la conversión de YAML a JSON, por lo que puedes expresar tu(s) configuración(es) de Consul de la siguiente manera:
consul_master_token: miToken
consul_server: true
consul_configs:
main:
acl_datacenter: pantheon
acl_master_token: "{{ consul_master_token | to_uuid }}"
bootstrap: true
bind_addr: 0.0.0.0
client_addr: 0.0.0.0
datacenter: pantheon
data_dir: "{{ consul_data_dir }}"
log_level: INFO
node_name: master
server: "{{ consul_server }}"
ui: true
Esto se hace utilizando filtros Jinja2. Este rol no implementa entradas preconfiguradas para la configuración, así que en lugar de escribir la configuración de Consul en JSON; simplemente la expresas en la sintaxis equivalente de YAML, lo que significa que puede estar en cualquier parte de tu configuración de Ansible.
Como se ve en el ejemplo anterior, esto puede ser muy poderoso, ya que te permite aprovechar otros filtros disponibles en Ansible para construir datos arbitrarios y usarlos en la configuración. Cualquier cosa que puedas expresar con la plantilla de Ansible (incluyendo la obtención de datos/información de host del inventario, etc.) puede ser utilizada en la configuración.
El ejemplo de configuración anterior muestra pares clave/valor de cadena simples, pero también puedes definir cualquier tipo válido en YAML, como diccionarios y listas.
Si no sabes cómo expresar la configuración JSON de tu Consul como YAML, consulta aquí para un conversor útil.
Requisitos
Este rol solo ha sido probado en Ubuntu 16.04, pero debería funcionar en cualquier distribución de Linux. Requiere:
systemd
unzip
Variables por Defecto del Rol
---
consul_packer_provision: false
consul_group_name: consul
consul_group_gid: 3000
consul_user_name: consul
consul_user_uid: 3000
consul_user_home: /opt/consul
consul_config_dir: "{{ consul_user_home }}/conf.d"
consul_data_dir: "{{ consul_user_home }}/data"
consul_version: 1.6.3
# si consul está configurado como servidor, systemd establece cap_net_bind_service para el puerto 53
consul_cap_net_bind_service: "{{ consul_configs.main.server | default('false') }}"
consul_server: false
consul_uri: "https://releases.hashicorp.com/consul/{{ consul_version }}/consul_{{ consul_version }}_linux_amd64.zip"
consul_config_src: main.json.j2
consul_config_validate: "{{ consul_user_home }}/bin/consul validate -config-format=json %s"
consul_extra_args: []
consul_service_file:
src: consul.service.j2
dest: /etc/systemd/system/consul.service
consul_service_status: started
# recargado
# reiniciado
# iniciado
# detenido
enable_on_boot: yes
# sí
# no
# configurar esta variable para no ejecutar el paso de configuración
# no_configure
# configurar esta variable para no ejecutar el paso de instalación
# no_install
consul_config:
datacenter: dc-1
data_dir: "{{ consul_data_dir }}"
log_level: INFO
node_name: node-1
server: "{{ consul_server }}"
Ejemplo de Playbook
Configuración básica del rol
- hosts: consul_servers
vars:
consul_master_token: miToken
consul_server: true
consul_config:
acl_datacenter: pantheon
acl_master_token: "{{ consul_master_token | to_uuid }}"
bootstrap: true
bind_addr: 0.0.0.0
client_addr: 0.0.0.0
datacenter: pantheon
data_dir: "{{ consul_data_dir }}"
log_level: INFO
node_name: master
server: "{{ consul_server }}"
ui: true
roles:
- entercloudsuite.consul
No configurar, solo instalar
---
- name: ejecutar el rol principal
hosts: all
roles:
- role: entercloudsuite.consul
configure: false
install: true
consul_service_status: "stopped"
consul_master_token: miToken
consul_server: true
consul_configs:
main:
acl_datacenter: pantheon
acl_master_token: "{{ consul_master_token | to_uuid }}"
bootstrap: true
bind_addr: 0.0.0.0
client_addr: 0.0.0.0
datacenter: pantheon
data_dir: "{{ consul_data_dir }}"
log_level: INFO
node_name: master
server: "{{ consul_server }}"
ui: true
No instalar, solo configurar
---
- name: ejecutar el rol principal
hosts: all
roles:
- role: entercloudsuite.consul
configure: true
install: false
consul_service_status: "started"
consul_master_token: miToken
consul_server: true
consul_configs:
main:
acl_datacenter: pantheon
acl_master_token: "{{ consul_master_token | to_uuid }}"
bootstrap: true
bind_addr: 0.0.0.0
client_addr: 0.0.0.0
datacenter: pantheon
data_dir: "{{ consul_data_dir }}"
log_level: INFO
node_name: master
server: "{{ consul_server }}"
ui: true
Configuraciones del Agente de Consul
Ejemplos de configuraciones de agente, se une al servidor en groups['server']
- role: ansible-consul
configure: true
install: true
consul_service_status: "started"
consul_version: 1.6.3
consul_configs:
main:
bind_addr: "{{ ansible_default_ipv4['address'] }}"
client_addr: 0.0.0.0
node_name: "{{ ansible_hostname }}"
data_dir: "{{ consul_data_dir }}"
datacenter: "pantheon"
enable_syslog: true
server: false
ui: true
enable_script_checks: true
rejoin_after_leave: true
retry_join: "{{ groups['server'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list }}"
Ejemplo de servidor de Consul
Ejemplos de configuraciones de servidor, los hosts en groups['server'] crean un nuevo clúster de Consul.
- role: ansible-consul
configure: true
install: true
consul_service_status: "started"
consul_version: 1.6.3
consul_configs:
main:
bind_addr: "{{ ansible_default_ipv4['address'] }}"
client_addr: 0.0.0.0
node_name: "{{ ansible_hostname }}"
data_dir: "{{ consul_data_dir }}"
datacenter: "pantheon"
enable_syslog: true
server: true
ui: true
enable_script_checks: true
rejoin_after_leave: true
retry_join: "{{ groups['server'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list }}"
ports:
dns: 53
dns_config:
udp_answer_limit: 64
bootstrap_expect: "{{ groups['server'] | length | int }}"
recursors:
- 1.1.1.1
- 8.8.8.8
Pruebas
Las pruebas se realizan usando Molecule.
Instala Molecule o utiliza docker-compose run --rm molecule
para ejecutar un contenedor Docker local, basado en el proyecto entercloudsuite/molecule, desde donde puedes usar molecule
.
- Ejecuta
molecule create
para iniciar el contenedor Docker objetivo en tu motor local. - Usa
molecule login
para iniciar sesión en el contenedor en ejecución. - Edita los archivos del rol.
- Agrega otros roles requeridos (externos) en el archivo molecule/default/requirements.yml.
- Edita el molecule/default/playbook.yml.
- Define pruebas de infraestructura en la carpeta molecule/default/tests usando el verificador goos.
- Cuando estés listo, usa
molecule converge
para ejecutar el Playbook de Ansible ymolecule verify
para ejecutar la suite de pruebas. Ten en cuenta que el proceso de convergencia comienza realizando una verificación de sintaxis del rol. Destruye el contenedor Docker con el comandomolecule destroy
.
Para ejecutar todos los pasos con un solo comando, ejecuta molecule test
.
Para ejecutar el rol orientado a una VM, usa el archivo playbook_deploy.yml, por ejemplo, con el siguiente comando: ansible-playbook ansible-docker/molecule/default/playbook_deploy.yml -i VM_IP_OR_FQDN, -u ubuntu --private-key private.pem
Licencia
MIT
Información del Autor
Creado por:
- Calum MacRae
- Jacopo Secchiero
- Attilio Greco
ansible-galaxy install automium.consul