Ansibleロールのデフォルトと変数の違いは何ですか?


151

新しいAnsibleロールを作成すると、テンプレートはvarsdefaults空のmain.ymlファイルを含むディレクトリの両方を作成します。私の役割を定義するとき、これらのいずれかに変数定義を配置でき、それらは私のタスクで使用可能になります。

定義をすることの違いは何だdefaultsとはvars?何defaultsを入れるべきか、何を入れるべきvarsか?同じデータに両方を使用することは理にかなっていますか?

両者の優先順位や優先順位に違いがあることは承知していますが、どこに行けばよいのかを知りたいのですが。

私の役割がターゲットシステム上のディレクトリのリストを作成するとします。作成するデフォルトディレクトリのリストを提供しますが、ロールを使用するときにユーザーがそれらを上書きできるようにしたいと思います。

これは次のようになります。

---
- directories:
  - foo
  - bar
  - baz

私はどちらかにこれを置くことができるdefaults/main.ymlかでvars/main.ymlはなく、それはどこに行くべき- 、実行の観点から、それはどんな違いをしないでしょうか?

回答:


113

変数の優先順位に関するAnsibleのドキュメントは、このniceleyを要約しています:

同じ名前の複数の変数が異なる場所で定義されている場合、それらは特定の順序で勝ちます。

  • 余分な変数(コマンドラインでは-e)は常に勝つ
  • 次に、インベントリで定義された接続変数(ansible_ssh_userなど)が表示されます
  • 次に、「その他すべて」(コマンドラインスイッチ、vars in play、included vars、role varsなど)
  • 次に、インベントリで定義された残りの変数が表示されます
  • 次に、システムについて発見された事実
  • 次に「ロールデフォルト」。これは最も「デフォルト」であり、すべての優先順位を失います。

たとえば、一連のWebホストにTomcatをインストールするために使用する「tomcat」ロールがあるとしますが、いくつかのホストで異なるバージョンのtomcatが必要な場合や、他のケースでは異なるユーザーとして実行する必要がある場合などです。defaults/main.ymlファイルは次のようになります。このようなもの:

tomcat_version: 7.0.56
tomcat_user: tomcat

これらは単なるデフォルト値であるため、これらの変数が問題のホストに対して他の場所で定義されていない場合に使用されます。これらの変数に別の値を指定するには、extra-vars、インベントリファイルのファクトなどを使用してこれらをオーバーライドできます。

編集:上記のリストはAnsible 1.x用であることに注意してください。Ansible 2.xではリストが拡張されています。いつものように、Ansible Documentationは2.xの変数の優先順位の詳細な説明を提供しています。


4
ありがとう、それは素晴らしいページです-私が探していたものです。私はもっとたくさん入れする内容の詳細に入るdefaultsと何でvarsさらにダウン。
nwinkler 2015年

42
強調する価値があります:役割変数には悪の優先順位があります。私の経験では、それらはプレイ変数よりも高く、これは本当に迷惑です。
tedder42 2015年

5年後、しかし...私はこのように考える傾向があります。ロールのデフォルトは、ロールのユーザーがどこかで変数をオーバーライドすることを期待しているものです。役割変数、OTOHを使用すると、タスク内の情報をハードコーディングすることを回避できますが、おそらくテストのためにオーバーライドされ、役割の保守担当者によって変更されるだけです。例として、初期の管理者ユーザー名はデフォルトですが、依存関係のバージョンは変数にあります。
ntwrkguru

41

で定義されvarているロール変数は非常に優先順位が高く、コマンドライン、特定のタスク、またはブロックで渡すことによってのみ上書きできます。したがって、ほとんどすべての変数はで定義する必要がありますdefaults

記事「変数の優先順位-役割の変数を配置する場所」では、作成者が何を配置するかについての1つの例をvars示しています。システム固有の定数はあまり変化しません。あなたが持っていることができるようにvars/debian.ymlvars/centos.yml同じ変数名が異なる値とし、それらは条件付きで含まれています。


3

私見それは非現実的かつ賢明ではないという設定のAnsibleの場所など、優先度の高いVARS役割は。の構成vars/main.ymlとはdefaults/main.yml低いとおそらく同じ優先順位でなければなりません。

この種の行動が必要な場合の実例はありますか?

これを望まない例があります。

ここでのポイントは、の構成をdefaults/main.yml動的にすることはできないということです。vars/main.yml缶の構成。したがって、たとえば、geerlingguy.postgresqlに示すように、特定のOSとバージョンの構成を動的に含めることができます。

しかし、優先順位が非常に奇妙であり、Ansibleで非実用的であるため、geerlingguyは、variables.ymlに見られるように、疑似変数を導入する必要があります。

- name: Define postgresql_packages.
  set_fact:
    postgresql_packages: "{{ __postgresql_packages | list }}"
  when: postgresql_packages is not defined

これは、優先順位が実用的でないことを示す具体的な実例です。

ここでもう1つのポイントは、ロールを構成可能にすることです。役割は外部で、他の誰かが管理できます。一般的なルールとして、ロールの設定に高い優先順位を付けたくない場合があります。


これはコメントではなく、回答である必要があります。
ntwrkguru

3

基本的に、「ロールのデフォルト」(ロール内のデフォルトのフォルダー)に入るものは、最も柔軟で、簡単に上書きできます。ロールのvarsディレクトリにあるものはすべて、ネームスペース内のその変数の以前のバージョンをオーバーライドします。ここで従うべき考え方は、範囲を明確にするほど、コマンドラインでの優先順位が高くなるということです-e余分な変数が常に優先されます。ホスト変数またはインベントリ変数、あるいはその両方は、ロールのデフォルトに勝つことができますが、varsディレクトリやinclude_varsタスクのような明示的なインクルードはできません。 文書


-4

変数とデフォルトは密接に関係しています。ここに例があります

-name: install package
 yum: name=xyz{{package_version}} state=present

デフォルトのファイルでは次のようになります:

package_version: 123

ansibleが行うことは、それはの値を取得package_versionしてパッケージ名の横に配置することです。

-name: install package
 yum: name=xyz123 state=present

このようにインストールされxyz123、インストールされませんxyz123.4、xyzの優れたリポジトリに。

最後にそれを行います yum install -y xyz123

したがって、基本的にデフォルトは存在する値です。変数に特定の値を設定しない場合、そのスペースを空のままにすることはできません。


質問に対応していないため、反対票を投じました。明らかに定義されdefaultsていないときに使用されvarsますが、答えは説明しません。なぜ値を一方または他方として定義するの、これはOPが要求したものです。以下の説明と比較してください。
トーマスヒルシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.