automium.consul

用于部署 Consul 的 Ansible 角色

Consul

Consul

构建状态 Galaxy

特性

使用 YAML 配置 Consul

Consul 服务的配置通过将 YAML 转换为 JSON 来完成,因此您可以这样表达您的 Consul 配置:

consul_master_token: myToken
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

这通过 Jinja2 过滤器实现。该角色没有预配置的配置条目,因此您无需使用 JSON 编写 Consul 的配置;只需以 YAML 的等效语法表达它,这意味着它可以位于您 Ansible 配置的任何位置。
如上例所示,这可以非常强大,因为它允许您利用 Ansible 中可用的其他过滤器来构建任意数据并将其用于配置。您可以通过 Ansible 的模板功能表达的任何内容(包括从清单中获取数据/主机信息等)都可以在配置中使用。

上述示例配置显示了简单的字符串键/值对,但您当然可以在 YAML 中定义任何有效类型,例如字典和列表。
如果您不知道如何将 Consul 的 JSON 配置转换为 YAML,请查看 这里的便捷转换器

要求

此角色仅在 Ubuntu 16.04 上进行了测试,但应该能够在任何 Linux 发行版上运行。
它需要:

  • systemd
  • unzip

默认角色变量

---
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
# 如果配置 Consul 为服务器,systemd 设置 cap_net_bind_service 以绑定端口 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
# reloaded
# restarted
# started
# stopped

enable_on_boot: yes
# yes
# no

# 配置此变量以不运行配置步骤
# no_configure

# 配置此变量以不运行配置步骤
# no_install

consul_config:
  datacenter: dc-1
  data_dir: "{{ consul_data_dir }}"
  log_level: INFO
  node_name: node-1
  server: "{{ consul_server }}"

示例剧本

基本角色配置

- hosts: consul_servers
  vars:
    consul_master_token: myToken
    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

不配置只安装

---
- name: 运行主角色
  hosts: all
  roles:
    - role: entercloudsuite.consul
      configure: false
      install: true
      consul_service_status: "stopped"
      consul_master_token: myToken
      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

不安装只配置

---
- name: 运行主角色
  hosts: all
  roles:
    - role: entercloudsuite.consul
      configure: true
      install: false
      consul_service_status: "started"
      consul_master_token: myToken
      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

Consul Agent 配置

Agent 示例配置,它会在 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 }}"

Consul Server 示例

服务器示例配置,属于 groups['server'] 的主机创建一个新的 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

测试

测试使用 Molecule 执行。

安装 Molecule 或使用 docker-compose run --rm molecule 在本地 Docker 容器中运行,基于 entercloudsuite/molecule 项目,您可以从中使用 molecule

  1. 运行 molecule create 以启动目标 Docker 容器。
  2. 使用 molecule login 登录到运行中的容器。
  3. 编辑角色文件。
  4. 在 molecule/default/requirements.yml 文件中添加其他必需的角色(外部)。
  5. 编辑 molecule/default/playbook.yml。
  6. 在 molecule/default/tests 目录下定义基础设施测试,并使用 goos 验证器。
  7. 准备好后,使用 molecule converge 运行 Ansible Playbook,使用 molecule verify 执行测试套件。注意,converge 过程首先执行角色的语法检查。 使用命令 molecule destroy 销毁 Docker 容器。

要通过一个命令运行所有步骤,请运行 molecule test

为了使角色针对虚拟机运行,可以使用 playbook_deploy.yml 文件,例如使用以下命令:ansible-playbook ansible-docker/molecule/default/playbook_deploy.yml -i VM_IP_OR_FQDN, -u ubuntu --private-key private.pem

许可

MIT

作者信息

创建者:

  • Calum MacRae
  • Jacopo Secchiero
  • Attilio Greco
关于项目

Role for deploying Consul

安装
ansible-galaxy install automium.consul
许可证
mit
下载
1.4k
拥有者
Portable services for scalable and resilient infrastructures