entercloudsuite.consul

Rol de Ansible para desplegar Consul

Consul

Consul

Estado de la Compilación Galaxy

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.

  1. Ejecuta molecule create para iniciar el contenedor Docker objetivo en tu motor local.
  2. Usa molecule login para ingresar al 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 de 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 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
Acerca del proyecto

Role for deploying Consul

Instalar
ansible-galaxy install entercloudsuite.consul
Licencia
mit
Descargas
7.5k
Propietario