सामानों की एक ही सूची के साथ कई कार्य करने योग्य कार्य निष्पादित करें


13

मैं अपाचे को साइटों की एक सूची के लिए कॉन्फ़िगर करने के लिए एक अचूक प्लेबुक का उपयोग कर रहा हूं। प्लेबुक को प्रत्येक साइट के लिए वर्चुअल होस्ट कॉन्फ़िगरेशन टेम्पलेट को कॉपी करना होगा, और फिर प्रत्येक साइट का उपयोग करके सक्षम करना होगा a2ensite:

- name: Install apache site conf
  template: src=apache-sites-{{item}}-conf.j2 dest=/etc/apache2/sites-available/{{item}}.conf mode=0644
  with_items:
  - sitea
  - siteb
  - sitec
  - sited
- name: Enable site apache conf
  command: a2ensite {{item}}
  args:
    creates: /etc/apache2/sites-enabled/{{item}}.conf
  with_items:
  - sitea
  - siteb
  - sitec
  - sited

मुझे प्रत्येक कार्य के लिए एक ही सूची दोहराना पसंद नहीं है। आइटम की समान सूची के साथ दोनों कार्यों को निष्पादित करने के लिए मैं प्लेबुक को कैसे कॉन्फ़िगर करूं?

जवाबों:


15

अलग कार्य फ़ाइल करें make_site.yml:

---
- name: Install apache site conf
  template:
    src: apache-sites-{{ site }}-conf.j2
    dest: /etc/apache2/sites-available/{{ site }}.conf
    mode: 0644

- name: Enable site apache conf
  command: a2ensite {{ site }}
  args:
    creates: /etc/apache2/sites-enabled/{{ site }}.conf

और आपकी प्लेबुक में:

- include_tasks: make_site.yml
  with_items:
    - sitea
    - siteb
    - sitec
    - sited
  loop_control:
    loop_var: site

मैं एक अलग फ़ाइल बनाने के लिए बिना एक समाधान खोजने की उम्मीद कर रहा था। loopएक blockब्लॉक पर कुछ ऐसा । यह अनुरोध किया जा रहा है, लेकिन 13262 Ansible GH मुद्दे के माध्यम से खारिज कर दिया । :-(
गर्टवडिज्क

2

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

चीजों को थोड़ा आसान बनाने के लिए मैंने टेम्प्लेट के लिए एक निर्देशिका बनाई:

  • roles/webserver/templates/apache-sites/sitea.conf.j2
  • roles/webserver/templates/apache-sites/siteb.conf.j2
  • roles/webserver/templates/apache-sites/sitec.conf.j2
  • roles/webserver/templates/apache-sites/sited.conf.j2

फिर roles/webserver/tasks/main.ymlमैं फ़ाइलों की सूची और कुछ नियमित अभिव्यक्तियों का उपयोग कर सकता हूं:

---
- block:
  - name: Install apache site conf
    template: src={{item}} dest=/etc/apache2/sites-available/{{item|regex_replace(".*/","")|regex_replace("\.j2$","")}} mode=0644
    with_fileglob:
    - "roles/webserver/templates/apache-sites/*"
  - name: Enable site apache conf
    command: a2ensite {{item|regex_replace(".*/","")|regex_replace("\.conf\.j2$","")}}
    args:
      creates: /etc/apache2/sites-enabled/{{item|regex_replace(".*/","")|regex_replace("\.j2$","")}}
    with_fileglob:
    - "roles/webserver/templates/apache-sites/*"
  become: yes

इस तकनीक का उपयोग अन्य अनुप्रयोगों के लिए सूची बनाने के लिए खाली डमी फ़ाइलों के साथ भी किया जा सकता है।


1

कॉन्स्टेंटिन ने एक अच्छा जवाब दिया; यहाँ इस पर एक अतिरिक्त स्वाद है।

मैं आमतौर पर सूचियों को चर के रूप में परिभाषित करता हूं, और बस एक ही चर पर दो अलग-अलग छोरों को लिखता हूं:

┌─[jamesph@geror] - [~/temp] - [Sat Jan 13, 10:06]
└─[$]> cat loops-1.yml
- hosts: localhost
  gather_facts: no
  vars:
    menu:
      - Egg and Spam
      - Spam, bacon, sausage and Spam
      - Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam
  tasks:
    - debug:
        msg: "We have {{ item }}"
      with_items: "{{ menu }}"
    - debug:
        msg: "I love {{ item }}!"
      with_items: "{{ menu }}"
┌─[jamesph@geror] - [~/temp] - [Sat Jan 13, 10:06]
└─[$]> ansible-playbook loops-1.yml
 [WARNING]: Unable to parse /etc/ansible/hosts as an inventory source

 [WARNING]: No inventory was parsed, only implicit localhost is available

 [WARNING]: Could not match supplied host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [localhost] **********************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [localhost] => (item=Egg and Spam) => {
    "changed": false,
    "item": "Egg and Spam",
    "msg": "We have Egg and Spam"
}
ok: [localhost] => (item=Spam, bacon, sausage and Spam) => {
    "changed": false,
    "item": "Spam, bacon, sausage and Spam",
    "msg": "We have Spam, bacon, sausage and Spam"
}
ok: [localhost] => (item=Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam) => {
    "changed": false,
    "item": "Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam",
    "msg": "We have Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam"
}

TASK [debug] **************************************************************************************************************************
ok: [localhost] => (item=Egg and Spam) => {
    "changed": false,
    "item": "Egg and Spam",
    "msg": "I love Egg and Spam!"
}
ok: [localhost] => (item=Spam, bacon, sausage and Spam) => {
    "changed": false,
    "item": "Spam, bacon, sausage and Spam",
    "msg": "I love Spam, bacon, sausage and Spam!"
}
ok: [localhost] => (item=Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam) => {
    "changed": false,
    "item": "Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam",
    "msg": "I love Spam, Spam, Spam, Spam, Spam, Spam, baked beans, Spam, Spam, Spam and Spam!"
}

PLAY RECAP ****************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0

उदाहरण के लिए, प्रति वातावरण में सर्वर के विभिन्न सेटों को परिभाषित करके परिवर्तनशील पूर्वता के साथ यह अच्छी तरह से काम करता है। यह तब भी काम करता है जब आपको दो लूप के बीच में अन्य गैर-लूप वाले कार्यों को करने की आवश्यकता होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.