consul
Ansible Роль для развертывания Consul
Consul
Особенности
Настройка Consul с помощью YAML
Конфигурация для сервиса 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 в JSON, вы просто выражаете ее в эквивалентном синтаксисе YAML, который может находиться в любой части вашей конфигурации Ansible.
Как видно из приведенного выше примера, это может быть довольно мощным, так как позволяет вам использовать другие доступные в Ansible фильтры для создания произвольных данных и их использования в конфигурации. Все, что вы можете выразить с помощью шаблонизации Ansible (включая получение данных/информации о хостах из инвентаря и т.д.), может быть использовано в конфигурации.
Приведенный выше пример конфигурации показывает простые парные ключи/значения, но вы, конечно, можете определить любой допустимый тип в YAML, такой как словари и списки.
Если вы не знаете, как выразить вашу JSON конфигурацию Consul в 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
# перезагружен
# перезапущен
# запущен
# остановлен
enable_on_boot: yes
# да
# нет
# настройте эту переменную, если не хотите выполнять шаг конфигурации
# 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
Примеры конфигураций агента, который присоединяется к серверу в 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
Примеры конфигураций сервера, хосты в 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: 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 на основе проекта enterclousuite/molecule, откуда вы сможете использовать molecule
.
- Запустите
molecule create
, чтобы запустить целевой контейнер Docker на вашем локальном движке. - Используйте
molecule login
, чтобы войти в запущенный контейнер. - Отредактируйте файлы роли.
- Добавьте другие необходимые роли (внешние) в файл molecule/default/requirements.yml.
- Отредактируйте molecule/default/playbook.yml.
- Определите инфрастуктурные тесты в папке molecule/default/tests с помощью проверщика goos.
- Когда будете готовы, используйте
molecule converge
, чтобы запустить Ansible Playbook иmolecule verify
, чтобы выполнить набор тестов. Обратите внимание, что процесс converge начинает выполнять проверку синтаксиса роли. Уничтожьте контейнер Docker с помощью командыmolecule destroy
.
Чтобы выполнить все шаги с помощью одной команды, запустите 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
ansible-galaxy install entercloudsuite/ansible-consul