entercloudsuite.consul
Rol de Ansible para desplegar Consul
Consul
Características
Configurar Consul con YAML
La configuración del servicio Consul se realiza utilizando la conversión de YAML a JSON, así 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 de Jinja2. Este rol no implementa entradas preconfiguradas para la configuración, así que en lugar de escribir la configuración de tu Consul en JSON; simplemente la expresas en la sintaxis equivalente de YAML, lo que significa que puede estar en cualquier lugar de tu configuración de Ansible.
Como se ve en el ejemplo anterior, esto puede ser bastante 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 del host del inventario, etc.) se puede usar en la configuración.
La configuración de ejemplo anterior muestra pares de clave/valor en forma de cadena simple, pero por supuesto 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 convertidor útil.
Requisitos
Este rol solo ha sido probado en Ubuntu 16.04, pero se espera que funcione en cualquier distribución de Linux. Requiere:
systemd
unzip
Variables Predeterminadas 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 para ser un servidor, systemd establece cap_net_bind_service para el puerto de enlace 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
# configura esta variable para no ejecutar el paso de configuración
# no_configure
# configura esta variable para no ejecutar el paso de configuració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
Ejemplo de configuraciones del 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 del Servidor de Consul
Ejemplo de configuraciones del servidor, 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 utilizando Molecule.
Instala Molecule o usa docker-compose run --rm molecule
para ejecutar un contenedor Docker local, basado en el proyecto enterclousuite/molecule, desde donde puedes usar molecule
.
- Ejecuta
molecule create
para iniciar el contenedor Docker objetivo en tu motor local. - Usa
molecule login
para ingresar al 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 de 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 dirigido 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 entercloudsuite.consul