automium.consul
ConsulをデプロイするためのAnsibleロール
Consul
[](https://travis-ci.org/entercloudsuite/ansible-consul) [](https://galaxy.ansible.com/automium/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の設定をJSONで書く代わりに、YAMLの同等構文で表現することができます。
上記の例のように、他の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_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: mainロールを実行
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: mainロールを実行
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エージェントの設定
エージェントの例示的設定。サーバーにグループ['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']で新しい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コンテナを起動し、使えるようにします。
molecule create
を実行してターゲットのDockerコンテナをローカルエンジン上で起動します。molecule login
を使用して実行中のコンテナにログインします。- ロールファイルを編集します。
- molecule/default/requirements.ymlファイルに他の必要なロール(外部)を追加します。
- molecule/default/playbook.ymlを編集します。
- molecule/default/testsフォルダーの下にインフラテストを定義します。
- 準備が整ったら、
molecule converge
を使用してAnsibleプレイブックを実行し、molecule verify
を使用してテストスイートを実行します。 コンバージョンプロセスはロールの構文チェックを開始します。 Dockerコンテナをmolecule destroy
コマンドで削除します。
すべてのステップを1つのコマンドで実行するには、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