前書き
Ansibleは、さまざまな環境でインフラストラクチャとアプリケーションを構成および管理するために使用される強力な構成管理システムです。Ansibleは、読みやすい構文、柔軟なワークフロー、および強力なツールを提供しますが、展開環境や機能によって異なる場合、多数のホストの管理が困難になる可能性があります。
このチュートリアルでは、Ansibleを使用して多段階の展開環境で作業するためのいくつかの戦略について説明します。通常、さまざまな段階の要件により、コンポーネントの数量と構成が異なります。たとえば、開発サーバーのメモリ要件は、ステージング環境や本番環境のメモリ要件とは異なる場合があり、これらの要件を表す変数がどのように優先されるかを明示的に制御することが重要です。この記事では、これらの違いを抽象化するいくつかの方法と、構成の再利用を促進するためにAnsibleが提供するいくつかの構成について説明します。
Ansibleで多段階環境を管理するための不完全な戦略
Ansibleで環境を管理する方法はいくつかありますが、Ansible自体はより良いソリューションを提供していません。むしろ、環境を操作するために使用できる多くの構成を提供し、ユーザーが選択できるようにします。
このガイドで示すアプローチは、変数Ansibleのグループと複数のレジスタ(Inventories)に基づいています。ただし、検討する価値のある戦略は他にもいくつかあります。以下でこれらのアイデアのいくつかを見て、複雑な環境で実装したときに問題が発生する理由を見つけます。
推奨されるAnsible戦略を開始したい場合は、Ansibleグループと複数のレジストリの使用に関するセクションにスキップしてください。
グループ変数のみに依存する
, Ansible . , . Ansible . . . :
- (, dev, stage, prod . .)
- (-, . .)
- (NYC, SFO . .)
. , - () ( ) - ( ).
, Ansible . , , , , Ansible .
Ansible . Ansible , , , . , .
Ansible , [groupname: children]
. . , .
. , environment
, dev
, stage
, prod
. , environment
dev
. , functions
, web
, database
loadbalancer
.
, . , , environments
functions
. .
, . , , :
, :
. . . [function:children] web database loadbalancer region [region:children] nyc sfo environments [environments:children] dev stage prod
, , region
function
. , environments
, . , dev
, nyc
web
, , , dev
.
. , . Ansible , . .
Ansible-,
Ansible , , vars_files
include_vars
. Ansible plays , . vars_files
, include_vars
.
, group_vars
, .
, group_vars
:
group_vars/dev
--- env: dev
group_vars/stage
--- env: stage
group_vars/web
---
function: web
group_vars/database
---
function: database
vars
, . vars. group_vars
, include_vars
.yml.
, server_memory_size
vars
. , , , . , - :
vars/dev.yml
--- server_memory_size: 512mb
vars/prod.yml
--- server_memory_size: 4gb
vars/web.yml
--- server_memory_size: 1gb
vars/database.yml
--- server_memory_size: 2gb
playbook, vars
, group_vars
. , .
vars_files
:
example_play.yml
---
- name: variable precedence test
hosts: all
vars_files:
- "vars/{{ env }}.yml"
- "vars/{{ function }}.yml"
tasks:
- debug: var=server_memory_size
, server_memory_size
var/web.yml
var/database.yml
:
ansible-playbook -i inventory example_play.yml
Output. . . TASK [debug] ******************************************************************* ok: [host1] => { "server_memory_size": "1gb" # value from vars/web.yml } ok: [host2] => { "server_memory_size": "1gb" # value from vars/web.yml } ok: [host3] => { "server_memory_size": "2gb" # value from vars/database.yml } ok: [host4] => { "server_memory_size": "2gb" # value from vars/database.yml } . . .
, :
example_play.yml
---
- name: variable precedence test
hosts: all
vars_files:
- "vars/{{ function }}.yml"
- "vars/{{ env }}.yml"
tasks:
- debug: var=server_memory_size
playbook , :
ansible-playbook -i inventory example_play.yml
Copy
Output. . . TASK [debug] ******************************************************************* ok: [host1] => { "server_memory_size": "512mb" # value from vars/dev.yml } ok: [host2] => { "server_memory_size": "4gb" # value from vars/prod.yml } ok: [host3] => { "server_memory_size": "512mb" # value from vars/dev.yml } ok: [host4] => { "server_memory_size": "4gb" # value from vars/prod.yml } . . .
include_vars
, , :
--- - name: variable precedence test hosts: localhost tasks: - include_vars: file: "{{ item }}" with_items: - "vars/{{ function }}.yml" - "vars/{{ env }}.yml" - debug: var=server_memory_size
, Ansible , . , , .
, vars_files
include_vars
, , , . group_vars
, vars
. . , Ansible group_vars
.
, . playbook , . Playbook . , ansible
-, .
Ansible:
, . Ansible , .
— , . , , . group_vars
.
:
. ├── ansible.cfg ├── environments/ # Parent directory for our environment-specific directories │ │ │ ├── dev/ # Contains all files specific to the dev environment │ │ ├── group_vars/ # dev specific group_vars files │ │ │ ├── all │ │ │ ├── db │ │ │ └── web │ │ └── hosts # Contains only the hosts in the dev environment │ │ │ ├── prod/ # Contains all files specific to the prod environment │ │ ├── group_vars/ # prod specific group_vars files │ │ │ ├── all │ │ │ ├── db │ │ │ └── web │ │ └── hosts # Contains only the hosts in the prod environment │ │ │ └── stage/ # Contains all files specific to the stage environment │ ├── group_vars/ # stage specific group_vars files │ │ ├── all │ │ ├── db │ │ └── web │ └── hosts # Contains only the hosts in the stage environment │ ├── playbook.yml │ └── . . .
, . (hosts
) group_vars
.
. web
db
. . , , , . group_vars
.
. , , . -, . .
, , — . . — Ansible . all
group_vars
all
.
, , . , . .
- . (environments
). :
cd environments
touch 000_cross_env_vars
group_vars
, all
all
. :
cd dev/group_vars mv all env_specific mkdir all mv env_specific all/
, :
cd all/ ln -s ../../../000_cross_env_vars .
, :
. ├── ansible.cfg ├── environments/ │ │ │ ├── 000_cross_env_vars │ │ │ ├── dev/ │ │ ├── group_vars/ │ │ │ ├── all/ │ │ │ ├── 000_cross_env_vars -> ../../../000_cross_env_vars │ │ │ │ └── env_specific │ │ │ ├── db │ │ │ └── web │ │ └── hosts │ │ │ ├── prod/ │ │ ├── group_vars/ │ │ │ ├── all/ │ │ │ │ ├── 000_cross_env_vars -> ../../../000_cross_env_vars │ │ │ │ └── env_specific │ │ │ ├── db │ │ │ └── web │ │ └── hosts │ │ │ └── stage/ │ ├── group_vars/ │ │ ├── all/ │ │ │ ├── 000_cross_env_vars -> ../../../000_cross_env_vars │ │ │ └── env_specific │ │ ├── db │ │ └── web │ └── hosts │ ├── playbook.yml │ └── . . .
, 000_cross_env_vars
, .
ansible.cfg
. .
-, ansible
ansible-playbook
. :
ansible -i environments/dev -m ping
, :
ansible -m ping
-, . . , , -i
.
, ansible.cfg
. /etc/ansible/ansible.cfg
.
. ansible.cfg
. /etc/ansibile/ansible.cfg
, . /etc/ansible/ansible.cfg
/etc/ansible
, .
nano ansible.cfg
, . , hosts:
[defaults] inventory = ./environments/dev
-i
. - -i
, .
この記事では、Ansibleが複数の環境でホストを管理するために提供する柔軟性について説明しました。これにより、ホストが複数のグループのメンバーである場合、ユーザーはさまざまな戦略を適用してさまざまな優先度を処理できますが、あいまいさや公式ガイダンスの欠如が問題になる可能性があります。他のテクノロジーと同様に、組織に最適なのは、ユースケースと要件の複雑さによって異なります。自分に合った戦略を見つける最良の方法は、実験することです。以下のコメントで、ユースケースとアプローチを共有してください。