automium.consul

Rol de Ansible para desplegar Consul

Consul

Consul

Estado de Construcción Galaxy

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.

  1. Ejecuta molecule create para iniciar el contenedor Docker objetivo en tu motor local.
  2. Usa molecule login para iniciar sesión en el contenedor en ejecución.
  3. Edita los archivos del rol.
  4. Agrega otros roles requeridos (externos) en el archivo molecule/default/requirements.yml.
  5. Edita el molecule/default/playbook.yml.
  6. Define pruebas de infraestructura en la carpeta molecule/default/tests usando el verificador goos.
  7. Cuando estés listo, usa molecule converge para ejecutar el Playbook de Ansible y molecule 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 comando molecule 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
Acerca del proyecto

Role for deploying Consul

Instalar
ansible-galaxy install automium.consul
Licencia
mit
Descargas
1.4k
Propietario
Portable services for scalable and resilient infrastructures