ansible - विभिन्न प्रकार के चर के साथ टेम्पलेट मॉड्यूल का उपयोग कैसे करें?




ansible-template (6)

मेरा उपयोग मामला निम्नलिखित है:

मेरे पास एक टेम्प्लेट फ़ाइल है, और मैं उस टेम्प्लेट से 2 अलग-अलग फाइलें बनाना चाहूंगा, जिसमें वैरिएबल प्रत्येक फ़ाइल के लिए अलग-अलग वेरिएबल्स द्वारा भरा जाए।

उदाहरण के लिए, मैं यह कहना चाहता हूं कि मैं फ़ाइल को लाइन में रखना चाहता हूं:

mkdir -p {{myTemplateVariable}}

मैं "File1" और "File2" द्वारा भरे गए इस वैरिएबल को प्राप्त करने का एक उचित तरीका खोजना चाहता हूं। कुछ इस तरह :

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


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

जहां मैं पहली टेम्प्लेटिंग के लिए निर्दिष्ट कर सकता था कि उपयोग करने वाला चर = "फाइल 1" है और दूसरे के लिए, बी = "पी 2" है।


Ansible 2.x के साथ आप var का उपयोग कर सकते हैं 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 में पास करेगा।


आप इसे बहुत आसान कर सकते हैं, देखिए मेरी सुपरवाइजर रेसिपी:

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

का आनंद लें!


दुर्भाग्य से 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

मुझे हल करने के लिए एक समान समस्या थी, यहां टेम्प्लेट फ़ाइलों में चर कैसे पास किया जाए इसका एक सरल समाधान है, ट्रिक वैरिएबल का लाभ उठाते हुए टेम्पलेट फ़ाइल लिखना है। आपको एक शब्दकोश (सूची भी संभव है) बनाने की आवश्यकता है, जो प्रत्येक फ़ाइल के अनुरूप चर का सेट रखता है। फिर टेम्पलेट फ़ाइल के भीतर उन्हें एक्सेस करें।

निचे देखो:

the template file: test_file.j2
# {{ ansible_managed }} created by [email protected]

{% 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: [email protected]
#
# 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 }}"

यह एक समाधान / हैक मैं उपयोग कर रहा हूँ:

कार्य / 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

वार्स / main.yml

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

टेम्पलेट्स / test.j2:

{{ item }}

इसे चलाने के बाद, आपको this is var_a मिल this is var_a in / tmp / templateA और this is var_b in / tmp / templateB है।

मूल रूप से आप एक आइटम सूची में प्रत्येक आइटम के साथ टेम्पलेट को प्रस्तुत करने के लिए with_items का दुरुपयोग 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 }}

- 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 [email protected]
    ServerName {{ item }}
    DocumentRoot /vagrant/public


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

</VirtualHost>




ansible-template