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
我不想重复每个任务的清单相同。如何配置剧本以执行具有相同项目列表的两个任务?
#1 楼
制作单独的任务文件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
#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
该技术甚至可以与空的虚拟文件一起使用,以创建其他应用程序的列表。
#3 楼
康斯坦丁给出了一个很好的答案。我通常将列表定义为变量,并在同一变量上编写两个单独的循环:
┌─[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
这可以很好地与可变优先级配合使用,例如通过为每个环境定义不同的服务器集。当您需要在两个循环之间执行各种其他非循环任务时,它也可以工作。
评论
我希望找到一种解决方案而不必创建单独的文件。类似于块块上的循环。这似乎是有要求的,但是通过Ansible GH问题13262拒绝了。:-(
– Gertvdijk
19年3月13日在13:27