web-dev-qa-db-ja.com

ansible-変数内の変数

Ansible 1.9.2バージョン。

Dos Ansibleは、変数の評価中に変数内の変数展開をサポートします。

Artifactoryから3つのZipファイルをダウンロードするタスクがあります。

ロール内で3つの個別のタスクを作成する代わりに、プレイブックでansibleのループを使用しました。 Ansibleロールのdefault/main.ymlには、ロールに定義/使用可能なすべての必要な変数があります。つまり、jmeterplugins_extras_artifactory_urlおよびその他の(標準/ webdriver)はperf_tests役割。

---
#- Download and install JMeterPlugins
# Use get_url when Ansible is 2.0+ is available on the machine (otherwise, we can't use get_url) thus, using wget.
- name: Download JMeterPlugins-*
  command: wget {{ jmeterplugins_{{ item.plugin }}_artifactory_url }}  
    chdir="{{ common_download_dir }}"
    creates="{{ common_download_dir }}/{{ jmeterplugins_{{ item.plugin }}_file }}"
  with_items:
    - { plugin: 'extras' }
    - { plugin: 'standard' }  
    - { plugin: 'webdriver' }   

しかし、上記のコードでは、エラーが発生します(以下に示すように):

15:58:57 TASK: [perf_tests | Download JMeterPlugins-*] ********************************* 
15:58:57 <jmeter01.super.fast.jenkins> ESTABLISH CONNECTION FOR USER: cmuser on PORT 22 TO jmeter01.super.fast.jenkins
15:58:57 fatal: [jmeter01.super.fast.jenkins] => Failed to template wget {{ jmeterplugins_{{ item.plugin }}_artifactory_url }} chdir="{{ common_download_dir }}" creates="{{ common_download_dir }}/{{ jmeterplugins_{{ item.plugin }}_file }}": template error while templating string: expected token 'variable_end', got '{'
15:58:57 
15:58:57 FATAL: all hosts have already failed -- aborting
15:58:57 
15:58:57 PLAY RECAP ******************************************************************** 
15:58:57            to retry, use: --limit @/home/cmuser/perf_tests.retry
15:58:57 
15:58:57 jmeter01.super.fast.jenkins : ok=23   changed=6    unreachable=1    failed=0   

変数に別の変数が含まれている場合(特にループを使用している場合)、ansibleは変数の展開/評価をサポートしません。

Jmeterplugins_extras、jmeterplugins_standard、jmeterplugins_webdriverのZipファイルを個別にダウンロードするために、単純なループタスクを3つの異なる名前のタスクに拡張したくないだけです。エラーはJinjaに関連しているようです。

Varの値gigaを別の変数で使用するにはどうすればよいですか(つまり、vargigaが含まれる場合、変数「special_giga_variable」の値を取得する必要があります({{special _ {{var}} _ variable}})? varはdefaults/main.ymlで次のように定義されています:

var:ギガ

12
Arun Sangal

いいえ、そうではありません。ただし、3つの異なるタスクに拡張する必要があるわけではありません。実際にできることは、「辞書」を展開して次のように表示することです。

_with_items:
 - {"url": "https://xxxxx", "file": "/tmp/xxxxx" }
 - {"url": "https://yyyyy", "file": "/tmp/yyyyy" }
 - {"url": "https://zzzzz", "file": "/tmp/zzzzz" }
_

次に、タスクで異なるパラメーターを呼び出します:_{{ item.url }} and {{ item.file }}_

代替オプション:

  1. {{ jmeterplugins_url | my_custom_filter(item.plugin) }}に従って変数を展開する独自のフィルターを作成します

  2. 入力に基づいてファイルにURLを取得するすべての機能をカプセル化するカスタムモジュールを作成します。

  3. 変数のリストを反復処理し、正しい結果を生成するカスタム_lookup_plugin_を記述します。

  4. commandモジュールを使用しているので、bashを利用してURLを連結し、同じコマンドでファイル化できます(これがおそらく最も厄介な解決策です)

4
Vor

します。

使用できます

set_fact:
  variable: '{{ vars['my_' + variablename + '_variable'] }}'

これまでのこのアプローチの唯一の欠点は、別の変数の値を取得する変数を動的に展開しないことです。例:

roles/xxx/defaults/main.yml

var1: foo
var2: '{{ var1 }}'

残念ながら、var2で解決された値を使用しようとすると、これは機能しません。したがって、

- debug: msg='{{ vars["var2"] }}'

fooの代わりに{{ var1 }}を出力します。

回避策:

Vars宣言では、var2: {{ var1 }}を使用する代わりに、var2: '{{ vars["var1"] }}'を使用します。そのように、それは動作します。

16
karolyi