web-dev-qa-db-ja.com

Ansible Playbookとロール

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の理解は大いに向上するでしょう!

  • Playbook vs Role vs [databases]および/etc/ansible/hostsの同様のエントリ
  • PlaybookがYAMLファイル内で定義されている場合、ロールはどこで定義されていますか?
  • Ansibleサーバーにあるansible.cfg以外に、利用可能なPlaybook/RolesでAnsibleを追加/設定するにはどうすればよいですか?たとえば、ansible-playbook someplaybook.yamlを実行すると、Ansibleはそのプレイブックの場所をどのように知るのですか?
84
smeeb

Playbook vs Role vs [databases]および/ etc/ansible/hostsの同様のエントリ

[databases]は、ホストのグループの単一の名前です。単一の名前で複数のホストを参照できます。

役割は、特定の役割にサービスを提供するようにホストを構成する一連のタスクと追加ファイルです。

プレイブックは、ホストとロールの間のマッピングです。

documentation の例では、サンプルプロジェクトについて説明しています。次の2つが含まれます。

  • プレイブック。 site.ymlwebservers.ymlfooservers.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はそれとは何の関係もありません。

89
Yaroslav Admin

Playbook vs Role vs [databases]および/ etc/ansible/hostsの同様のエントリ

ロールは、タスクを1つのコンテナにグループ化する方法です。 MySQLをセットアップする役割、Postfixをセットアップする役割などがあります。

プレイブックはwhatが起こっているwhereを定義しています。これは、ホスト(ホストグループ、以下を参照)とそれらのホストに適用されるロールを定義する場所です。

[databases]およびインベントリ内の他のエントリはホストグループです。ホストグループは、プレイが実行されるホストのセットを定義します。

プレイは、プレイブック内の一連のタスクまたはロール(またはその両方)です。ほとんどの場合(および例)、プレイブックには1つのプレイのみが含まれます。ただし、好きなだけ持つことができます。つまり、ホストグループmail_serverspostfixロールを実行し、ホストグループmysqldatabasesロールを実行するプレイブックを作成できることを意味します。

- 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

32
udondan

これは用語/意味論的な質問です。ベースラインの定義が存在する場合でも、主観的な場合があります。

私の見解は次のとおりです。

構成管理/展開システムには次のものがあります。

  1. source data-ターゲットホストの構成の作成に使用されるデータ
  2. target data-ターゲットホストを識別するために使用されるデータ
  3. config changes-source dataに基づいてターゲットホスト上でtarget dataを使用して適用するルール/アクションのリスト/セット

Ansibleの用語では:

  1. source data-データを配置できるさまざまな場所-group_varsplaybook vars、role varsなど。これらの場所は優先順位に影響します(同じ名前の変数が異なる場所で再定義されている場合、 ansible/ansible-playbook実行中の変数の値についての非常に具体的なルール
  2. target data-インベントリです(そして、インベントリ内でインベントリ/ホストグループ変数を定義することも可能です!)
  3. config changes-ansibleには4つの抽象化レベルがあります:
    1. タスク-シングルアクション
    2. タスクリスト-アクションのリスト
    3. role-同じ「サブジェクト」によってグループ化されたアクションのリスト(またはリストのリスト)。通常、すべてのターゲットは同じホスト/ホストグループで動作しています。
    4. プレイブック-複数のroles/tasks/tasklists(およびhandlersなどの特別なタスク)を適用して、それぞれ異なるホストグループで動作する可能性のあるプレイのリスト

「ソフトウェア」の観点から-ロールは、再利用になるのに十分な汎用性が必要です。

また、一部の(かなり大きな)組織では、「ロール」はグループAによって出荷されますが、グループBによって維持されるプレイブックで使用されます。

概要

上記のすべてで、同様の構成をグループ化して、roleにできます。関連するサブシステム/コンポーネントを1つのplaybookにグループ化する。また、言及する価値がある、プレイブック内の1つのYAMLアイテム(hosts:および_または[taskspre_taskspost_tasksrolesを含む)はplayと呼ばれます

さて、あなたの質問:

はい、最初は混乱しています。

通常、source dataをロールのセマンティクスに接続します。そのため、ロールsetup_dbが関連するホストグループ(たとえばdb_hosts)へのプレイで適用されることがわかりますが、playはユニオンで実行できますいくつかのホストグループの。慣例と柔軟性の問題です。

追伸.

これが混乱を助長したか、明確にしたかどうか、私に返信してください。ありがとう。

9
mvk_il

また、異なる役割に影響を与えることを目的としたメタファイルが使用されている場合、プレイブックは複数の役割を呼び出すことができることに注意してください。

プレイブックの例: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
0
Jose H. Rosa

簡単に言えば:

プレイブックはメインプログラムに似ており、ジョブを完了するための完全な指示が含まれています。ただし、大きなプロジェクトの場合、実際にすべての詳細を入れることは望ましくありません。だからあなたには役割が必要です。

ロールはサブルーチンであり、通常は1つの目標を達成します。データベースサーバーをセットアップします。 roles/ディレクトリに配置するか、rolesfile.ymlでURIを指定してサードパーティのロールをダウンロードし、 ansible-galaxy でダウンロードしてください。

[database]は、inventory fileで定義されたホストグループで、databaseグループに属するホストをリストします。次のようなものを指定して、Webサーバーのグループを指定することもできます。

[web]
web1.example.com
web2.example.com

その後、グループwebまたはdatabaseをプレイブックまたはロールで使用して、適用するホストを指定できます。

また、コマンドansibleでグループを使用して、アドホックコマンドを実行することもできます。

0
Ding-Yi Chen