Ansible - 当没有指定参数时默认为所有内容

时间:2017-05-16 05:59:21

标签: deployment ansible default-value

我有一个相当大的剧本,能够在给定的主机上更新多达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"

2 个答案:

答案 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]}'