Ansibleのドキュメントによると、 Playbook は次のとおりです。
...既存のシステムとは異なり、非常に単純な構成管理およびマルチマシン展開システムの基盤であり、複雑なアプリケーションの展開に非常に適したシステムです。
また、同じドキュメントによると、 Roles は次のとおりです。
...既知のファイル構造に基づいて特定のvars_files、タスク、およびハンドラーを自動的にロードする方法。コンテンツをロール別にグループ化すると、ロールを他のユーザーと簡単に共有できます。
しかし、これらとそれらのさまざまなユースケースの違いは、私にはすぐにはわかりません。たとえば、/etc/ansible/hosts
ファイルを次のように設定すると:
[databases]
mydb01.example.org
mydb02.example.org
[mail_servers]
mymail01.example.org
mymail_dr.example.org
...では、この「[databases]
」エントリとは... arole?または、プレイブックのYAMLファイルの名前はどこですか?または、他の何か?!?
誰かがこれらの違いを説明できたら、私のAnsibleの理解は大いに向上するでしょう!
[databases]
および/etc/ansible/hosts
の同様のエントリansible.cfg
以外に、利用可能なPlaybook/RolesでAnsibleを追加/設定するにはどうすればよいですか?たとえば、ansible-playbook someplaybook.yaml
を実行すると、Ansibleはそのプレイブックの場所をどのように知るのですか?Playbook vs Role vs [databases]および/ etc/ansible/hostsの同様のエントリ
[databases]
は、ホストのグループの単一の名前です。単一の名前で複数のホストを参照できます。
役割は、特定の役割にサービスを提供するようにホストを構成する一連のタスクと追加ファイルです。
プレイブックは、ホストとロールの間のマッピングです。
documentation の例では、サンプルプロジェクトについて説明しています。次の2つが含まれます。
site.yml
、webservers.yml
、fooservers.yml
は脚本です。roles/common/
およびroles/webservers/
には、それに応じてcommon
およびwebservers
ロールの定義が含まれます。プレイブック(webservers.yml
)には次のようなものがあります。
---
- hosts: webservers <- this group of hosts defined in /etc/ansible/hosts, databases and mail_servers in example from your question
roles: <- this is list of roles to assign to these hosts
- common
- webservers
PlaybookがYAMLファイル内で定義されている場合、ロールはどこで定義されていますか?
それらはroles/*
ディレクトリ内で定義されます。ロールは主にYAMLファイルを使用して定義されますが、任意のタイプのリソース(files/
、templates/
)を含めることもできます。 documentation によると、ロール定義は次のように構成されます。
- Roles/x/tasks/main.ymlが存在する場合、そこにリストされているタスクはプレイに追加されます
- Roles/x/handlers/main.ymlが存在する場合、そこにリストされているハンドラーがプレイに追加されます
- Roles/x/vars/main.ymlが存在する場合、そこにリストされている変数がplayに追加されます
- Roles/x/meta/main.ymlが存在する場合、そこにリストされているロールの依存関係はロールのリストに追加されます(1.3以降)
- コピータスクは、roles/x/files /内のファイルを参照できます。比較的または絶対にパスする必要はありません。
- スクリプトタスクは、roles/x/files /内のスクリプトを参照できます。比較的または絶対にパスする必要はありません。
- テンプレートタスクは、比較的または絶対にパスすることなく、roles/x/templates /内のファイルを参照できます。
- 組み込みタスクは、roles/x/tasks /内のファイルを参照できます。比較的または絶対にパスする必要はありません。
最も重要なファイルはroles/x/tasks/main.yml
です。ここでは、ロールが実行されるときに実行されるタスクを定義します。
Ansibleサーバーにあるansible.cfg以外に、利用可能なPlaybook/RolesでAnsibleを追加/設定するにはどうすればよいですか?たとえば、ansible-playbook someplaybook.yamlを実行すると、AnsibleはそのPlaybookの場所をどのように知るのですか?
$ ansible-playbook someplaybook.yaml
現在のディレクトリ内でプレイブックを探します。
$ ansible-playbook somedir/somedir/someplaybook.yaml
somedir/somedir/
ディレクトリ内でプレイブックを探します。
プロジェクトをすべてのプレイブックとロールと共にサーバーに配置するのはあなたの責任です。 Ansibleはそれとは何の関係もありません。
Playbook vs Role vs [databases]および/ etc/ansible/hostsの同様のエントリ
ロールは、タスクを1つのコンテナにグループ化する方法です。 MySQLをセットアップする役割、Postfixをセットアップする役割などがあります。
プレイブックはwhatが起こっているwhereを定義しています。これは、ホスト(ホストグループ、以下を参照)とそれらのホストに適用されるロールを定義する場所です。
[databases]
およびインベントリ内の他のエントリはホストグループです。ホストグループは、プレイが実行されるホストのセットを定義します。
プレイは、プレイブック内の一連のタスクまたはロール(またはその両方)です。ほとんどの場合(および例)、プレイブックには1つのプレイのみが含まれます。ただし、好きなだけ持つことができます。つまり、ホストグループmail_servers
でpostfix
ロールを実行し、ホストグループmysql
でdatabases
ロールを実行するプレイブックを作成できることを意味します。
- hosts: mail_servers
roles:
- postfix
- hosts: databases
roles:
- mysql
PlaybookがYAMLファイル内で定義されている場合、ロールはどこで定義されていますか?
Ansibleでは、ほとんどすべてがYAMLで定義されており、ロールとプレイブックにカウントされます。
Ansibleサーバーにあるansible.cfg以外に、利用可能なPlaybook/RolesでAnsibleを追加/設定するにはどうすればよいですか?たとえば、ansible-playbook someplaybook.yamlを実行すると、AnsibleはそのPlaybookの場所をどのように知るのですか?
ansible-playbook
を呼び出すときに、プレイブックへのパスを指定する必要があります。したがって、ansible-playbook someplaybook.yaml
は、someplaybook.yaml
が現在のディレクトリにあることを期待します。ただし、完全なパスを提供できます:ansible-playbook /path/to/someplaybook.yaml
これは用語/意味論的な質問です。ベースラインの定義が存在する場合でも、主観的な場合があります。
私の見解は次のとおりです。
構成管理/展開システムには次のものがあります。
source data
-ターゲットホストの構成の作成に使用されるデータtarget data
-ターゲットホストを識別するために使用されるデータconfig changes
-source data
に基づいてターゲットホスト上でtarget data
を使用して適用するルール/アクションのリスト/セットsource data
-データを配置できるさまざまな場所-group_vars
、playbook
vars、role
varsなど。これらの場所は優先順位に影響します(同じ名前の変数が異なる場所で再定義されている場合、 ansible
/ansible-playbook
実行中の変数の値についての非常に具体的なルールtarget data
-インベントリです(そして、インベントリ内でインベントリ/ホストグループ変数を定義することも可能です!)config changes
-ansibleには4つの抽象化レベルがあります:role
s/task
s/tasklists(およびhandlers
などの特別なタスク)を適用して、それぞれ異なるホストグループで動作する可能性のあるプレイのリスト「ソフトウェア」の観点から-ロールは、再利用になるのに十分な汎用性が必要です。
また、一部の(かなり大きな)組織では、「ロール」はグループAによって出荷されますが、グループBによって維持されるプレイブックで使用されます。
上記のすべてで、同様の構成をグループ化して、role
にできます。関連するサブシステム/コンポーネントを1つのplaybook
にグループ化する。また、言及する価値がある、プレイブック内の1つのYAMLアイテム(hosts:
および_または[tasks
、pre_tasks
、post_tasks
、roles
を含む)はplay
と呼ばれます
はい、最初は混乱しています。
通常、source data
をロールのセマンティクスに接続します。そのため、ロールsetup_db
が関連するホストグループ(たとえばdb_hosts
)へのプレイで適用されることがわかりますが、play
はユニオンで実行できますいくつかのホストグループの。慣例と柔軟性の問題です。
これが混乱を助長したか、明確にしたかどうか、私に返信してください。ありがとう。
また、異なる役割に影響を与えることを目的としたメタファイルが使用されている場合、プレイブックは複数の役割を呼び出すことができることに注意してください。
プレイブックの例:dual_role-playbook.yml
- name: Some Action for two roles
hosts: localhost
vars_files:
- roles/dual_role/meta/main.yml
roles:
- dual_role/container-1
- dual_role/container-2
ロールフォルダーとファイルスキームは次のようになります。
dual_role-playbook.yml
-- roles
-- dual_role
-- meta/main.yml
-- container-1
-- tasks/main.yml
-- templates/template.j2
-- container-2
-- tasks/main.yml
-- templates/template.j2
簡単に言えば:
プレイブックはメインプログラムに似ており、ジョブを完了するための完全な指示が含まれています。ただし、大きなプロジェクトの場合、実際にすべての詳細を入れることは望ましくありません。だからあなたには役割が必要です。
ロールはサブルーチンであり、通常は1つの目標を達成します。データベースサーバーをセットアップします。 roles/
ディレクトリに配置するか、rolesfile.yml
でURIを指定してサードパーティのロールをダウンロードし、 ansible-galaxy でダウンロードしてください。
[database]
は、inventory fileで定義されたホストグループで、database
グループに属するホストをリストします。次のようなものを指定して、Webサーバーのグループを指定することもできます。
[web]
web1.example.com
web2.example.com
その後、グループweb
またはdatabase
をプレイブックまたはロールで使用して、適用するホストを指定できます。
また、コマンドansible
でグループを使用して、アドホックコマンドを実行することもできます。