Thực thi nhiều tác vụ Ansible với cùng một danh sách các mục


12

Tôi đang sử dụng một playbook ansible để cấu hình Apache cho một danh sách các trang web. Playbook phải sao chép mẫu cấu hình máy chủ ảo cho từng trang vào vị trí, sau đó kích hoạt từng trang bằng cách sử dụng 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

Tôi không muốn phải lặp lại cùng một danh sách cho mỗi nhiệm vụ. Làm cách nào để định cấu hình Playbook để thực thi cả hai tác vụ với cùng một danh sách các mục?

Câu trả lời:


14

Tạo tập tin nhiệm vụ riêng biệt 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

Và trong vở kịch của bạn:

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

Tôi đã hy vọng tìm ra giải pháp mà không phải tạo một tệp riêng. Một cái gì đó giống như looptrên một blockkhối. Điều đó dường như được yêu cầu, nhưng bị từ chối thông qua vấn đề Ansible GH 13262 . :-(
gertvdijk

2

Tôi tìm thấy một giải pháp bằng cách sử dụng tập tin. Vì tôi có một tệp cấu hình cho mỗi trang web, tôi chỉ có thể sử dụng danh sách các tệp đó để lặp lại trên tất cả chúng. Bằng cách đó, tôi không có danh sách các trang web trong tệp tác vụ của mình dù chỉ một lần. Tất cả những gì tôi cần làm để thêm một trang web là thêm một tập tin.

Để làm cho mọi thứ dễ dàng hơn một chút, tôi đã tạo một thư mục cho các mẫu:

  • 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

Sau đó, roles/webserver/tasks/main.ymltôi có thể sử dụng danh sách các tệp và một số biểu thức thông thường:

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

Kỹ thuật này thậm chí có thể được sử dụng với các tệp giả để tạo danh sách cho các ứng dụng khác.


1

Konstantin đã đưa ra một câu trả lời tốt; đây là một hương vị bổ sung trên nó

Tôi thường sẽ định nghĩa các danh sách là các biến và chỉ viết hai vòng lặp riêng biệt trên cùng một biến:

┌─[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

Điều này hoạt động độc đáo với quyền ưu tiên thay đổi , ví dụ bằng cách xác định các bộ máy chủ khác nhau cho mỗi môi trường. Nó cũng hoạt động khi bạn cần thực hiện các tác vụ không lặp khác nhau ở giữa hai vòng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.