ดำเนินการงาน Ansible หลายรายการด้วยรายการที่เหมือนกัน


13

ฉันใช้เพลย์ลิสต์ ansible เพื่อกำหนดค่า Apache สำหรับรายการไซต์ playbook ต้องคัดลอกเทมเพลตการกำหนดค่าโฮสต์เสมือนสำหรับแต่ละไซต์ไว้แล้วเปิดใช้งานแต่ละไซต์โดยใช้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

ฉันไม่ชอบที่จะต้องทำซ้ำรายการเดียวกันสำหรับแต่ละงาน ฉันจะกำหนดค่า playbook ให้ทำงานทั้งสองรายการด้วยรายการเดียวกันได้อย่างไร

คำตอบ:


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

และใน playbook ของคุณ:

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

ฉันหวังว่าจะหาวิธีการแก้ปัญหาโดยไม่ต้องสร้างไฟล์แยกต่างหาก บางสิ่งบางอย่างloopในblockบล็อก ที่ดูเหมือนว่าจะได้รับการร้องขอ แต่ปฏิเสธผ่านเบิ้ล GH ปัญหา 13262 :-(
gertvdijk

2

ฉันพบวิธีแก้ปัญหาโดยใช้ไฟล์ globs เนื่องจากฉันมีไฟล์กำหนดค่าสำหรับแต่ละไซต์ฉันจึงสามารถใช้รายการไฟล์เหล่านั้นเพื่อทำซ้ำได้ทั้งหมด ด้วยวิธีนี้ฉันไม่มีรายการไซต์ในไฟล์งานของฉันแม้แต่ครั้งเดียว ทั้งหมดที่ฉันต้องทำเพื่อเพิ่มไซต์คือการเพิ่มไฟล์

เพื่อให้ง่ายขึ้นฉันสร้างไดเรกทอรีสำหรับเทมเพลต:

  • 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

สิ่งนี้ทำงานได้ดีกับตัวแปรที่มีความสำคัญเช่นโดยกำหนดชุดเซิร์ฟเวอร์ที่แตกต่างกันต่อสภาพแวดล้อม นอกจากนี้ยังใช้งานได้เมื่อคุณจำเป็นต้องทำงานอื่น ๆ ที่ไม่ใช่ลูปอื่น ๆ ระหว่างสองลูป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.