104

私のユースケースは次のとおりです。

テンプレート ファイルがあり、そのテンプレートから 2 つの異なるファイルを作成したいと考えています。変数は、ファイルごとに異なる変数セットで埋められます。

たとえば、次の行を含むファイルをテンプレート化するとします。

mkdir -p {{myTemplateVariable}}

この変数を「File1」と「File2」で埋める適切な方法を見つけたいと思います。何かのようなもの :

- name: template test 1
  template: 
        src=myTemplateFile
        dest=result1


- name: template test 2
  template: 
        src=myTemplateFile
        dest=result2

ここで、最初のテンプレートでは使用する変数が a = "File1" であり、2 番目のテンプレートでは b = "File2" であると指定できます。

4

8 に答える 8

67

Ansible 2.x の場合:

- name: template test
  template: 
    src: myTemplateFile
    dest: result1
  vars:
    myTemplateVariable: File1

- name: template test
  template: 
    src: myTemplateFile
    dest: result2
  vars:
    myTemplateVariable: File2

Ansible 1.x の場合:

残念ながら、templateモジュールは、テンプレート内で使用できる変数の受け渡しをサポートしていません。機能要求がありましたが、拒否されました。

2 つの回避策が考えられます。

1.含める

このincludeステートメントは、変数の受け渡しをサポートしています。したがってtemplate、追加のファイル内にタスクを配置し、適切なパラメーターを使用して 2 回含めることができます。

my_include.yml:

- name: template test
  template: 
        src=myTemplateFile
        dest=destination

main.yml:

- include: my_include.yml destination=result1 myTemplateVariable=File1

- include: my_include.yml destination=result2 myTemplateVariable=File2

2. myTemplateVariable を再定義する

templateもう 1 つの方法は、すべてのタスクの直前に myTemplateVariable を単純に再定義することです。

- set_fact:
     myTemplateVariable: File1

- name: template test 1
  template: 
        src=myTemplateFile
        dest=result1

- set_fact:
     myTemplateVariable: File2

- name: template test 2
  template: 
        src=myTemplateFile
        dest=result2
于 2015-06-30T19:32:07.787 に答える
23

This is a solution/hack I'm using:

tasks/main.yml:

- name: parametrized template - a
  template:
    src: test.j2
    dest: /tmp/templateA
  with_items: var_a

- name: parametrized template - b
  template:
    src: test.j2
    dest: /tmp/templateB
  with_items: var_b

vars/main.yml

var_a:
  - 'this is var_a'
var_b:
  - 'this is var_b'

templates/test.j2:

{{ item }}

After running this, you get this is var_a in /tmp/templateA and this is var_b in /tmp/templateB.

Basically you abuse with_items to render the template with each item in the one-item list. This works because you can control what the list is when using with_items.

The downside of this is that you have to use item as the variable name in you template.

If you want to pass more than one variable this way, you can dicts as your list items like this:

var_a:
  -
    var_1: 'this is var_a1'
    var_2: 'this is var_a2'
var_b:
  -
    var_1: 'this is var_b1'
    var_2: 'this is var_b2'

and then refer to them in your template like this:

{{ item.var_1 }}
{{ item.var_2 }}
于 2015-09-27T08:23:44.387 に答える
8

私はこのようにしました。

tasks/main.yml 内

- name: template test
  template: 
        src=myTemplateFile.j2
        dest={{item}}
   with_dict: some_dict

および vars/main.yml で

some_dict:
  /path/to/dest1:
    var1: 1
    var2: 2
  /path/to/dest2:
    var1: 3
    var2: 4

および templates/myTemplateFile.j2 内

some_var = {{ item.value.var1 }}
some_other_var = {{ item.value.var2 }}

これで問題が解決することを願っています。

于 2015-09-28T17:37:10.270 に答える