내 사용 사례는 다음과 같습니다.
템플릿 파일이 있고 해당 템플릿에서 두 개의 다른 파일을 만들고 각 파일에 대해 다른 변수 세트로 변수를 채우고 싶습니다.
예를 들어, 다음 줄이 포함 된 파일을 템플릿으로 지정하고 싶다고 가정 해 보겠습니다.
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″라는 첫 번째 템플릿을 지정할 수 있습니다.
답변
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
답변
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
이것은 myTemplateVariable
test.j2에 다른 값을 전달합니다.
답변
이 작업을 매우 쉽게 할 수 있습니다. 제 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'})
즐겨!
답변
이것은 내가 사용하는 솔루션 / 핵입니다.
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 }}
답변
나는 이렇게했다.
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 }}
이것이 문제를 해결하기를 바랍니다.
답변
- 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>
답변
비슷한 문제를 해결해야했습니다. 여기에 변수를 템플릿 파일에 전달하는 방법에 대한 간단한 솔루션이 있습니다. 트릭은 변수를 활용하여 템플릿 파일을 작성하는 것입니다. 각 파일에 해당하는 변수 세트를 보유하는 사전 (목록도 가능)을 작성해야합니다. 그런 다음 템플릿 파일 내에서 액세스합니다.
아래 참조 :
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 }}"