entercloudsuite.consul
Ansible 角色用于部署 Consul
Consul
功能
使用 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 过滤器实现的。这个角色没有预配置的配置项,所以你可以把 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 示例配置,它会以组 ['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 示例
服务器示例配置,组中的主机 ['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
。
- 运行
molecule create
启动目标 Docker 容器。 - 使用
molecule login
登录到运行的容器。 - 编辑角色文件。
- 在 molecule/default/requirements.yml 文件中添加其他所需的角色(外部依赖)。
- 编辑 molecule/default/playbook.yml。
- 在 molecule/default/tests 文件夹下使用 goos 验证器定义基础设施测试。
- 准备好后,使用
molecule converge
执行 Ansible 剧本,并使用molecule verify
执行测试套件。 请注意,converge 过程会开始对角色进行语法检查。 使用命令molecule destroy
销毁 Docker 容器。
要通过一个命令运行所有步骤,运行 molecule test
。
要运行针对 VM 的角色,可以使用 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