다른 변수 세트로 템플릿 모듈을 사용하는 방법은 무엇입니까?


92

내 사용 사례는 다음과 같습니다.

템플릿 파일이 있고 해당 템플릿에서 두 개의 다른 파일을 만들고 각 파일에 대해 다른 변수 세트로 변수를 채우고 싶습니다.

예를 들어, 다음 줄이 포함 된 파일을 템플릿으로 지정하고 싶다고 가정 해 보겠습니다.

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"이고 두 번째 템플릿 인 경우 b = "File2"라는 첫 번째 템플릿을 지정할 수 있습니다.


내 모든 요리법과는 정확히,이 댓글의 모양인가요 stackoverflow.com/a/40189525/1571310을 이 도움을 바랍니다!
Tecnocat

답변:


51

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모듈은 템플릿 내에서 사용할 수있는 변수 전달을 지원하지 않습니다. 거기에 있었다 기능 요청은 있지만 거부되었습니다.

두 가지 해결 방법을 생각할 수 있습니다.

1. 포함

include문 지원은 변수를 전달합니다. 따라서 template추가 파일 안에 작업 을 넣고 적절한 매개 변수와 함께 두 번 포함 할 수 있습니다 .

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작업 직전에 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

답변 감사합니다. 그러나 해결 방법 없이는 정말 불가능합니까? 나는 현재 다음과 같은 것을 시도하고 있습니다 : stackoverflow.com/questions/26020465/… ,하지만 여전히 약간의 오류가 있습니다 (직접 관련이 없을 수도 있음).
Kestemont Max

예, 루프로도 할 수 있습니다. 여전히 해결 방법입니다. :)
udondan

14
더 이상 필요하지 않습니다. 이제 "vars"가 지원됩니다. 아래 @ konstantin-suvorov 답변을 참조하십시오.
sonjz

123

Ansible 2.x를 사용 vars:하면 작업과 함께 사용할 수 있습니다 .

템플릿 test.j2:

mkdir -p {{myTemplateVariable}}

플레이 북 :

- template: src=test.j2 dest=/tmp/File1
  vars:
    myTemplateVariable: myDirName

- template: src=test.j2 dest=/tmp/File2
  vars:
    myTemplateVariable: myOtherDir

이것은 myTemplateVariabletest.j2에 다른 값을 전달합니다.


9
처음에는 실수를 저질렀 고 vars : 나머지 템플릿 인수처럼 들여 쓰기 (예 : src :)했습니다. 들여 쓰기 수준은 vars :가 템플릿이 아니라 작업임을 의미한다고 생각합니다. 따라서 템플릿뿐만 아니라 어디서나이 작업을 수행 할 수 있습니다. 좋은.
Greg

39

이 작업을 매우 쉽게 할 수 있습니다. 제 Supervisor 레시피를보십시오.

- name: Setup Supervisor jobs files
  template:
    src: job.conf.j2
    dest: "/etc/supervisor/conf.d/{{ item.job }}.conf"
    owner: root
    group: root
    force: yes
    mode: 0644
  with_items:
    - { job: bender, arguments: "-m 64", instances: 3 }
    - { job: mailer, arguments: "-m 1024", instances: 2 }
  notify: Ensure Supervisor is restarted

job.conf.j2 :

[program:{{ item.job }}]
user=vagrant
command=/usr/share/nginx/vhosts/parclick.com/app/console rabbitmq:consumer {{ item.arguments }} {{ item.job }} -e prod
process_name=%(program_name)s_%(process_num)02d
numprocs={{ item.instances }}
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/{{ item.job }}.stderr.log
stdout_logfile=/var/log/supervisor/{{ item.job }}.stdout.log

산출:

TASK [Supervisor : Setup Supervisor jobs files] ********************************
changed: [loc.parclick.com] => (item={u'instances': 3, u'job': u'bender', u'arguments': u'-m 64'})
changed: [loc.parclick.com] => (item={u'instances': 2, u'job': u'mailer', u'arguments': u'-m 1024'})

즐겨!


정답으로 표시되어야합니다. 현재 지원 이후
PoX

23

이것은 내가 사용하는 솔루션 / 핵입니다.

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 }}

이것을 실행 한 후 this is var_a/ tmp / templateA에 들어가서this is var_b / tmp / templateB에 있습니다.

기본적으로 with_items한 항목 목록의 각 항목으로 템플릿을 렌더링하는 것을 남용 합니다. 을 사용할 때 목록이 무엇인지 제어 할 수 있기 때문에 작동합니다 with_items.

이것의 단점은 item템플릿에서 변수 이름 으로 사용해야한다는 것 입니다.

이런 식으로 둘 이상의 변수를 전달하려면 다음과 같이 목록 항목으로 dicts를 사용할 수 있습니다.

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'

다음과 같이 템플릿에서 참조하십시오.

{{ item.var_1 }}
{{ item.var_2 }}

1
클린 솔루션,하지만 모자 사용에with_items: '{{ var_a }}'
피터 Ajtai

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 }}

이것이 문제를 해결하기를 바랍니다.


with_dict더 나은 솔루션입니다.
zx1986

1
- name: copy vhosts
  template: src=site-vhost.conf dest=/etc/apache2/sites-enabled/{{ item }}.conf
  with_items:
    - somehost.local
    - otherhost.local
  notify: restart apache

중요 : 항목은 단순히 문자열 일 필요는 없으며 원하는만큼 많은 속성을 가진 객체 일 수 있으므로 여러 변수를 전달할 수 있습니다.

템플릿에는 다음이 있습니다.

<VirtualHost *:80>
    ServerAdmin me@example.org
    ServerName {{ item }}
    DocumentRoot /vagrant/public


    ErrorLog ${APACHE_LOG_DIR}/error-{{ item }}.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

1
어떻게 그것을 개체로 만들 수 있습니까?
camdixon jul.

1

비슷한 문제를 해결해야했습니다. 여기에 변수를 템플릿 파일에 전달하는 방법에 대한 간단한 솔루션이 있습니다. 트릭은 변수를 활용하여 템플릿 파일을 작성하는 것입니다. 각 파일에 해당하는 변수 세트를 보유하는 사전 (목록도 가능)을 작성해야합니다. 그런 다음 템플릿 파일 내에서 액세스합니다.

아래 참조 :

the template file: test_file.j2
# {{ ansible_managed }} created by xbalaji@gmail.com

{% set dkey  = (item | splitext)[0]  %}
{% set fname = test_vars[dkey].name  %}
{% set fip   = test_vars[dkey].ip    %}
{% set fport = test_vars[dkey].port  %}
filename: {{ fname }}
ip address: {{ fip }}
port: {{ fport }}

플레이 북

---
#
# file: template_test.yml
# author: xbalaji@gmail.com
#
# description: playbook to demonstrate passing variables to template files
#
# this playbook will create 3 files from a single template, with different
# variables passed for each of the invocation
#
# usage:
# ansible-playbook -i "localhost," template_test.yml

- name: template variables testing
  hosts: all
  gather_facts: false

  vars:
    ansible_connection: local
    dest_dir: "/tmp/ansible_template_test/"
    test_files:
      - file_01.txt
      - file_02.txt
      - file_03.txt
    test_vars:
      file_01:
        name: file_01.txt
        ip: 10.0.0.1
        port: 8001
      file_02:
        name: file_02.txt
        ip: 10.0.0.2
        port: 8002
      file_03:
        name: file_03.txt
        ip: 10.0.0.3
        port: 8003

  tasks:
    - name: copy the files
      template:
        src: test_file.j2
        dest: "{{ dest_dir }}/{{ item }}"
      with_items:
        - "{{ test_files }}"

0

목록을 사용한 또 다른 실제 사례

php.ini에 대한 템플릿 추출

{% if 'cli/php.ini' in item.d %}
max_execution_time = 0
memory_limit = 1024M
{% else %}
max_execution_time = 300
memory_limit = 512M
{% endif %}

이것은 var입니다

php_templates:
  - { s: 'php.ini.j2', d: "/etc/php/{{php_version}}/apache2/php.ini" }
  - { s: 'php.ini.j2', d: "/etc/php/{{php_version}}/cli/php.ini" }

그런 다음 이것으로 배포

- name: push templated files
  template:
    src: "{{item.s}}"
    dest: "{{item.d}}"
    mode: "{{item.m | default(0644) }}"
    owner: "{{item.o | default('root') }}"
    group: "{{item.g | default('root') }}"
    backup: yes
  with_items: "{{php_templates}}"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.