Ansibleプレイブックとロール


97

Ansibleドキュメントによると、脚本は 次のとおりです。

...既存の既存のシステムとは異なり、非常にシンプルな構成管理とマルチマシン展開システムの基盤であり、複雑なアプリケーションの展開に非常に適しています。

また、同じドキュメントによると、役割 は次のとおりです。

...既知のファイル構造に基づいて特定のvars_files、タスク、およびハンドラーを自動的にロードする方法。コンテンツを役割ごとにグループ化すると、役割を他のユーザーと簡単に共有することもできます。

ただし、これらと異なる使用例の違いはすぐにはわかりません。たとえば、/etc/ansible/hostsファイルを次のように構成するとします。

[databases]
mydb01.example.org
mydb02.example.org

[mail_servers]
mymail01.example.org
mymail_dr.example.org

...次に、この「[databases]」エントリは何ですか... 役割?または、どこかにプレイブックYAMLファイルの名前がありますか?または、他の何か?!?

これらの違いを誰かに説明していただければ、Ansibleに対する私の理解が大幅に高まるでしょう。

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

1
ロールは、機能を一般化された「ライブラリ」に入れ、必要に応じて任意のプレイブックで使用できるようにすることで、プレイブックのコードを再利用可能にする方法です。
ファンヒメネス

tasks何かをします。playbooksタスクを整理して起動します。roles特定の機能を実行する一連のタスク、ハンドラーなどを整理します。playbookを起動するために必要なものがありますrolerolesandのコレクションを何と呼びplaybooksますか?たとえば、サイトのすべてのホストの構成を管理しているとしましょう。
fbicknel

回答:


110

Playbook vs Role vs [データベース]および/ etc / ansible / hostsの同様のエントリ

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

役割は、特定の役割を提供するようにホストを構成するためのタスクと追加ファイルのセットです。

Playbookは、ホストと役割の間のマッピングです。

ドキュメントの例は、プロジェクトの例を説明しています。次の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/)のリソースを含めることもできます。ドキュメントによると、ロール定義は次のように構成されています。

  • roles / x / tasks / main.ymlが存在する場合、そこにリストされているタスクがプレイに追加されます
  • roles / x / handlers / main.ymlが存在する場合、そこにリストされているハンドラーがプレイに追加されます
  • roles / x / vars / main.ymlが存在する場合、そこにリストされている変数がプレイに追加されます
  • 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以外に、利用可能なPlaybooks / RolesでAnsibleを追加/構成するにはどうすればよいですか?たとえば、ansible-playbook someplaybook.yamlを実行すると、AnsibleはそのPlaybookの場所をどのようにして知るのですか?

$ ansible-playbook someplaybook.yaml

現在のディレクトリ内でプレイブックを探します。

$ ansible-playbook somedir/somedir/someplaybook.yaml

somedir/somedir/ディレクトリ内でプレイブックを探します。

すべてのプレイブックとロールを含むプロジェクトをサーバーに配置するのはユーザーの責任です。Ansibleはそれとは何の関係もありません。


@Yaroslav管理者(+1)に感謝-簡単なフォローアップの質問:ロールはディレクトリ内で定義されていると述べていますが、実際には何がロールを設定していますか?つまり、webservers.ymlプレイブックは[webservers]ホストをcommonand webserversロールにマップします。しかし、正確には何がcommon役割に含まれていますか?それをディレクトリで定義する方法はないので、通常、それらの「ロールディレクトリ」内にYAMLファイルがありますか?再度、感謝します!
smeeb 2015

@smeebはい、あなたは正しい役割はそのディレクトリ内のファイルによって定義されます。それらは主にYAMLですが、他のタイプのファイルを含めることもできます。詳細については、更新された回答を参照してください。
Yaroslav管理者

36

Playbook vs Role vs [データベース]および/ etc / ansible / hostsの同様のエントリ

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

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

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

プレイとは、プレイブック内のタスクまたは役割(またはその両方)のセットです。ほとんどの場合(および例)、プレイブックには1つのプレイのみが含まれます。しかし、あなたは好きなだけいくつでも持つことができます。つまり、あなたが役割を実行する脚本持っている可能性がpostfixホストグループにmail_serversと役割mysqlホストグループにはdatabases

- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql

PlaybookがYAMLファイル内で定義されている場合、役割はどこに定義されていますか?

AnsibleではほとんどすべてがYAMLで定義されており、役割とプレイブックに数えられます。

Ansibleサーバーにあるansible.cfg以外に、利用可能なPlaybooks / RolesでAnsibleを追加/構成するにはどうすればよいですか?たとえば、ansible-playbook someplaybook.yamlを実行すると、AnsibleはそのPlaybookの場所をどのようにして知るのですか?

AFAIKでは、を呼び出すときに、プレイブックへのパスを指定する必要がありますansible-playbook。したがって、現在のディレクトリにあることansible-playbook someplaybook.yamlを期待someplaybook.yamlします。ただし、完全なパスを指定できます。ansible-playbook /path/to/someplaybook.yaml


13

それは用語/意味の質問です。ベースラインの定義があっても、それは主観的である可能性があります。

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

構成管理/導入システムには次のものが含まれます。

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

Ansible用語で:

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

「ソフトウェア」の観点から-役割は再利用するのに十分一般的でなければならない

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

概要

上記すべてにより、同様の構成をにグループ化できますrole。関連するサブシステム/コンポーネントを1つにグループ化しますplaybook。また、言及する価値、ハンドブック1つのYAML項目は(を含むhosts:いずれかまたはtaskspre_taskspost_tasksrolesAと呼ばれます)play

今あなたの質問のために:

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

通常は、source data自分の役割のセマンティクスに接続します。そのため、その役割setup_dbが劇中で関連するホストグループに適用されていることがわかります(例:)がdb_hostsplayことがわかりますが、は複数のホストグループの和集合で実行できます。それは慣習と柔軟性の問題です。

PS

これが混乱に加わったのか、それとも明確にされたかを書き留めてください。ありがとう。


1

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

プレイブックの例: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

簡単に言えば:

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

ロールはサブルーチンであり、通常、データベースサーバーのセットアップなど、1つの目標を達成します。あなたはそれを置くことができroles/、ディレクトリ、または中のURIを提供することにより、サードパーティの役割をダウンロードrolesfile.ymlして聞いてansible-銀河をあなたのためにそれらをダウンロードします。

[database]で定義されたホストグループであるインベントリファイルリストのホストに属していることをdatabaseグループ。次のように指定して、ウェブサーバーのグループを指定することもできます

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.