동일한 항목 목록으로 여러 Ansible 작업 실행


13

사이트 목록에 대해 Apache를 구성하기 위해 사용 가능한 플레이 북을 사용하고 있습니다. 플레이 북은 각 사이트의 가상 호스트 구성 템플릿을 적절한 위치에 복사 한 후 다음을 사용하여 각 사이트를 활성화해야합니다 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

별도의 파일을 만들지 않고도 솔루션을 찾고 싶었습니다. 유사한 뭔가 loopA의 block블록. 그것은 요청 된 것 같지만 Ansible GH 이슈 13262 를 통해 거부 되었습니다 . :-(
gertvdijk 2013 년

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

예를 들어 환경마다 다른 서버 집합을 정의 하여 변수 우선 순위 와 잘 작동 합니다. 또한 두 루프 사이에서 다양한 다른 비 루프 작업을 수행해야 할 때에도 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.