2016-04-29 5 views
2

インベントリホストまたはグループに関連付けられていないが、プレーブックが実行されているサーバー層に関連付けられていない可能性のあるインベントリ変数を作成することはできますか?私はAPTを使用してlibffi-devパッケージをインストールするAnsibleの役割を持っていますが、各サーバー層に異なるバージョンのパッケージをインストールしたいと思うかもしれません。私はその目的のために変数 "libffi-dev_ver"を作成しました。私はまた、各階層に対応する在庫ファイル "開発"、 "ステージング"、 "生産"を持っています。私の主なsite.ymlの脚本から呼び出され危険なティア固有の在庫変数を設定するにはどうすればいいですか?

私の役割の主なタスクは、バージョン変数は前役​​割を実行するために存在することを確認します

# roles/misc_libs/tasks/main.yml 
- include: check_vars.yml tags=misc_libs 
- include: misc_libs.yml tags=misc_libs 

check_vars.ymlチェックをパッケージのバージョンの変数が存在することを確認するために、 :

# roles/misc_libs_tasks/check_vars.yml 
- name: check that required role variables are set 
    fail: msg="{{ item }} is not defined" 
    when: not {{ item }} 
    with_items: 
    - libffi-dev_ver 

役割が実際にパッケージをインストールするには、その変数を使用していますmisc_libs:

# roles/misc_libs/tasks/misc_libs.yml 
- name: install libffi-dev 
    apt: > 
    pkg=libffi-dev={{ libffi-dev_ver }} 
    update_cache=yes 
    cache_valid_time=3600 
    become: True 

私の開発インベントリファイルは、次のようになります

# development 
[webservers] 
web01.example.com ansible_ssh_host=<ip_address> 

[dev:children] 
webservers 

[webservers:vars] 
libffi-dev_ver="3.1-2+b2" 

私は、このコマンドを実行すると:

fatal: [web01.example.com] => error while evaluating conditional: not libffi-dev_ver 

宣言するための正しい方法は何ですか:

ansible-playbook -i development site.yml -l webservers 

を私はこのAnsibleのエラーを取得しますこのような変数のバージョンをAnabilitiesに入れますか?変数の値は、インベントリファイルがサーバー層固有であるため、インベントリファイルに格納されることを示すサーバー層によって異なります。しかし、すべての在庫変数は、ホストまたはグループに関連付けられている必要があります。私はそれをしましたが、役割はまだ変数を参照していません。私はサーバー層を検出する役割にタスクを追加し、それに応じて変数を設定するための「条件付き」条件を使用しますが、そのソリューションは醜いようです。なぜなら、複数のパッケージをロールにインストールすると、それぞれに3つの条件パッケージバージョン変数。私はAnipalのドキュメンテーションを見て、多階層のプレイブックを設定するためのブログ記事を多数読んだが、私はこの特定の状況については言及していない。このような階層固有の変数を宣言する正しい方法は何ですか?

+0

私はあなたが達成しようとしているものは得られません。なぜ: #役割/ misc_libs /タスク/ misc_libs.yml - 名前:libffi-devのインストール 傾向:> PKG = libffi-devを= {{libffi-dev_ver}} update_cache = yesの cache_valid_time = 3600 次のようになります:True :libffi-dev_verが定義されています が不十分ですか? –

答えて

3

私が宣言した変数 'libffi-dev_ver'は実際にPython 2.xの命名規則に従わなければならないJinja2 identifierです。 ' - '(ダッシュ)は、これらの規則に従って無効な文字です。私はそれを '_'(アンダースコア)に変更すると、もはやエラーが発生しなくなりました。

また、check_vars.ymlプレイブックは実際には不要です。定義されていない変数を含むステップが失敗する可能性のあるコンフィグレーション変数error_on_undefined_varsがあります。デフォルトではtrueなので、check_vars.ymlを実行する必要はありません。すべての変数がすでにチェックされているからです。

サーバティア固有の変数を宣言する場所は、インベントリファイル内のそのティアの名前が付けられたグループと同じ名前のgroup_varsディレクトリ内のファイルにあるようです。だから私の場合、私の '開発'インベントリファイルには 'dev'子グループが含まれています。このグループには、libffi-devパッケージをインストールするWebサーバーが含まれています。したがって、私はファイル 'group_vars/dev'を作成し、misc_libs.ymlプレイブックで参照できる 'libffi_dev_ver'というファイルに変数を宣言しました。

0

達成しようとしているものが得られません。理由:

# roles/misc_libs/tasks/misc_libs.yml 
- name: install libffi-dev 
    apt: > 
    pkg=libffi-dev={{ libffi-dev_ver }} 
    update_cache=yes 
    cache_valid_time=3600 
    become: True 
    when: libffi-dev_ver is defined 

+0

私はそれを行うことができますが、それは私の質問には関係ありません。あなたが提案していることをしても、それは見つからない。私はコード内のどこかでwith_itemsディレクティブを使っていくつかのパッケージをインストールしているのに、特別なcheck_vars.ymlを持っています。それはそのようにきれいです。 – William

+0

実際にはcheck_varsの構文がわかっていれば、それを行うには「eval」と同等の道徳的なものが必要だろうと思います - jinja2が持っているかどうか、私は知りません。 –

関連する問題