ভেরিয়েবলের বিভিন্ন সেট সহ টেম্পলেট মডিউলটি কীভাবে ব্যবহার করবেন?


94

আমার ব্যবহারের ক্ষেত্রে নিম্নলিখিত:

আমার একটি টেম্পলেট ফাইল রয়েছে এবং আমি সেই টেমপ্লেট থেকে 2 টি পৃথক ফাইল তৈরি করতে চাই, প্রতিটি ফাইলের জন্য বিভিন্ন ভেরিয়েবলের ভেরিয়েবলগুলি পূরণ করা filled

উদাহরণস্বরূপ, ধরুন আমি লাইনযুক্ত ফাইলটি টেম্পলেট করতে চাই:

mkdir -p {{myTemplateVariable}}

আমি এই ফাইলটি "ফাইল 1" এবং "ফাইল 2" দিয়ে পূরণ করার উপযুক্ত উপায় খুঁজে পেতে চাই find কিছুটা এইরকম :

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


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

যেখানে আমি প্রথম টেম্প্লেটিংয়ের জন্য নির্দিষ্ট করতে পারি যে ব্যবহারের চলকটি হল একটি = "ফাইল 1" এবং দ্বিতীয়টির জন্য, বি = "ফাইল 2"।


আমি কি আমার সমস্ত রেসিপিগুলির সাথে ঠিক এটি করি, এই মন্তব্যটি দেখুন stackoverflow.com/a/40189525/1571310 , এই সহায়তা আশা করি!
টেকনোক্যাট

উত্তর:


53

উত্তরযোগ্য 2.x এর জন্য:

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

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

উত্তরযোগ্য 1.x এর জন্য:

দুর্ভাগ্যক্রমে templateমডিউলটি এতে ভেরিয়েবলগুলি পাস করার পক্ষে সমর্থন করে না, যা টেমপ্লেটের অভ্যন্তরে ব্যবহার করা যেতে পারে। এখানে একটি বৈশিষ্ট্য অনুরোধ ছিল কিন্তু তা প্রত্যাখ্যান করা হয়েছিল।

আমি দুটি কাজের কথা ভাবতে পারি:

1. অন্তর্ভুক্ত

includeবিবৃতি সমর্থন ভেরিয়েবল ক্ষণস্থায়ী। সুতরাং আপনার templateকোনও অতিরিক্ত ফাইলের মধ্যে টাস্কটি থাকতে পারে এবং এটি যথাযথ পরামিতিগুলির সাথে দুবার অন্তর্ভুক্ত করতে পারেন:

আমার_সামগ্রী.আইএমএল:

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

প্রধান.আইএমএল:

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

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

২) মাই টেম্পলেটটি পরিবর্তনশীল পুনরায় সংজ্ঞায়িত করুন

আর একটি উপায় হ'ল প্রতিটি templateকাজের আগে মাই টেম্পলেটটি পরিবর্তনশীল ডানদিকে পুনরায় সংজ্ঞা দেওয়া ।

- 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

উত্তরের জন্য ধন্যবাদ. যাইহোক, ওয়ার্কআরউন্ডস ছাড়া এটি করা কি সত্যিই অসম্ভব? আমি বর্তমানে এই জাতীয় কিছু চেষ্টা করছি: স্ট্যাকওভারফ্লো / প্রশ্ন / ২60০২০৪65৫/২ , তবে এখনও কিছু ত্রুটি রয়েছে (সম্ভবত সরাসরি সম্পর্কিত নয়)।
কেস্টেমুন্ট ম্যাক্স

হ্যাঁ, আপনি এটি একটি লুপের সাহায্যেও করতে পারেন - তবুও এটি কার্যকর নয়। :)
উডন্ডন

14
আর দরকার নেই "vars" এখন সমর্থিত। নীচে @ কনস্ট্যান্টিন-সুভেরভ উত্তর দেখুন।
Sonjz

124

উত্তরযুক্ত ২.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
প্রথমদিকে আমি একটি ভুল করেছি এবং ভারসাম্য করেছি: বাকী টেম্পলেট আর্গুমেন্টের মতো ইন্ডেন্টেড (যেমন এসআরসি :) :)। আমার ধারণা ইনডেন্ট স্তরটির অর্থ ওয়ার্স: টাস্কটির নয়, টেমপ্লেটটি নয়। সুতরাং আপনি এটি কেবল টেমপ্লেটগুলি নয়, যে কোনও জায়গায় এটি করতে পারেন। সুন্দর
গ্রেগ

39

আপনি এটি খুব সহজ করতে পারেন, আমার সুপারভাইজার রেসিপিটি দেখুন:

- 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

জব.কনফ.জে 2:

[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

এটি একটি সমাধান / হ্যাক যা আমি ব্যবহার করছি:

টাস্কস / মেইন.আইএমএল:

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

টেমপ্লেট / টেস্ট.জে 2:

{{ item }}

এটি চালানোর পরে, আপনি this is var_a/ tmp / টেম্পলেটএ এবং this is var_b/ tmp / টেমপ্লেটবিতে পাবেন।

মূলত আপনি with_itemsএক-আইটেম তালিকার প্রতিটি আইটেমের সাথে টেম্পলেটটি রেন্ডার করতে আপত্তি জানান। এটি কাজ করে কারণ আপনি যখন ব্যবহার করছেন তালিকাকে কী নিয়ন্ত্রণ করতে পারেন with_items

এর খারাপ দিকটি হ'ল আপনাকে itemআপনার টেমপ্লেটে পরিবর্তনশীল নাম হিসাবে ব্যবহার করতে হবে ।

আপনি যদি এইরকম একাধিক ভেরিয়েবল পাস করতে চান তবে আপনি আপনার তালিকার আইটেমগুলি এর মতো করে ছাঁটাই করতে পারেন:

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

4
পরিষ্কার সমাধান, তবে ব্যবহারের জন্য টুপিwith_items: '{{ var_a }}'
পিটার আজতাই

8

আমি এইভাবে এটি করেছি।

কার্যগুলিতে / মূল.আইএমএল

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

এবং ভার্সে / মেইন.আইএমএল

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

এবং টেমপ্লেটগুলিতে / 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>

4
আমি কীভাবে এটি একটি জিনিস করতে পারি?
ক্যামডিক্সন

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

এটি ভ্যার

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.