Ansibleで多段階環境を管理する方法

前書き







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が複数の環境でホストを管理するために提供する柔軟性について説明しました。これにより、ホストが複数のグループのメンバーである場合、ユーザーはさまざまな戦略を適用してさまざまな優先度を処理できますが、あいまいさや公式ガイダンスの欠如が問題になる可能性があります。他のテクノロジーと同様に、組織に最適なのは、ユースケースと要件の複雑さによって異なります。自分に合った戦略を見つける最良の方法は、実験することです。以下のコメントで、ユースケースとアプローチを共有してください。








All Articles