我有一个相当大的剧本,能够在给定的主机上更新多达10个服务。
让我们说我有服务,我希望能够通过传递命令行参数来有选择地更新服务,但默认情况下,在没有传递参数时更新所有内容。你怎么能在Ansible中做到这一点而不能放入任意脚本?
现在我所拥有的是对每个服务进行检查并定义在playbook调用时服务是否为true。鉴于我可能有多达10个服务,我无法编写布尔逻辑以适应各种可能性。
我希望在bash中可能有一个类似$ @的内置列出所有参数,我可以按when: $@.length = 0
ansible-playbook deploy.yml -e "a=true b=true d=true"
when: a == "true"
when: b == "true"
when: c == "true"
when: d == "true"
答案 0 :(得分:2)
我建议使用标签。假设我们有两个服务,例如nginx和fpm。然后使用nginx标记nginx的播放,使用fpm标记fpm。下面是任务级别标记的示例,比如说它名为play.yml
- name: tasks for nginx
service: name=nginx state=reloaded
tags:
- nginx
- name: tasks for php-fpm
service: name=php-fpm state=reloaded
tags:
- fpm
执行ansible-playbook play.yml将默认运行这两个任务。但是,如果我将命令更改为
ansible-playbook play.yml --tags“nginx”
然后只执行带有nginx标记的任务。标签也可以在游戏级别或角色级别上应用。
播放级别标记看起来像
- hosts: all
remote_user: user
tasks:
- include: play1.yml
tags:
- play1
- include: play2.yml
tags:
- play2
在这种情况下,playbook play1.yml中的所有任务都将继承play1的标签,play2也是如此。在运行带有标签play1的ansible-playbook的同时,执行play1.yml中的所有任务。相反,如果我们不指定任何标记,则执行play1和play2中的所有任务。
注意:任务不仅限于一个标签。
答案 1 :(得分:1)
如果您想要循环播放服务,请在 group_vars / all 或其他有意义的地方定义该列表:
services:
- first
- second
- third
- fourth
然后您在 start_services.yml 剧本中的任务可能如下所示:
- name: Ensure passed variables are in services list
fail:
msg: "{{ item }} not in services list"
when: item not in services
with_items: "{{ varlist | default(services) }}"
- name: Start services
service:
name: "{{ item }}"
state: started
with_items: "{{ varlist | default(services) }}"
将varlist作为JSON数组传递:
$ ansible-playbook start_services.yml --extra-vars='{"varlist":[first,third]}'