用标签和参数调用ansible playbook

时间:2016-10-21 16:26:05

标签: ansible ansible-2.x

我试图使用include语句从另一个剧本中调用ansible v2.1 playbook(notifications.yml)。我想指定一个标签,并将一个参数传递给被调用的playbook(从包含playbook的playbook中)。我能够在没有标签的情况下使用它,但似乎无法使用标签。这是否可能(没有命令行参数),如果是这样,实现这个的语法/正确方法是什么:

main.yml

- include: playbooks/notifications.yml
  tags: ['slack']
  slack_msg: "test"

notifications.yml

---
- connection: local
  hosts: 127.0.0.1
  tasks:
    - name: Send notification message via Slack
      tags:
        - slack
      local_action:
        module: slack
        domain: changed.slack.com
        token: "{{ slack_token }}"
        msg: "{{ slack_msg }}"
        channel: "{{ slack_channel }}"
        username: "{{ slack_username }}"

    - name: Send notification message via Email
      tags:
        - email
      local_action:
        module: mail
        host: "smtp.gmail.com" 
        port: "587"   
        username: 'changed@changed.com'   
        password: 'changed'  
        to: "changed <changed@changed.com>"  
        subject: 'Ansible-report'
        body: 'System {{ ansible_hostname }} has been successfully provisioned. User {{ ansible_user_id }}'

1 个答案:

答案 0 :(得分:12)

我将首先讨论一下当我们使用include / roles时标签的实际工作方式。

使用 - 标记运行Playbook时必须指定标记,并且无论是在主文件中还是在角色/包含文件中定义,都将执行指定标记下的所有任务但是,有一些有趣的事实需要注意:

<强> main.yml

---
- hosts: all
  tasks:
    - include: includeFile.yml tags=t1

    - debug: msg="Inside main file"
      tags:
        - t2

<强> includeFile.yml

- debug: msg="task 1 in includeFile"
  tags:
    - t1

- debug: msg="task 2 in includeFile"
  tags:
    - t2

- debug: msg="task 3 in includeFile"
  tags:
    - t3
 1. ansible-playbook -i hosts main.yml --tags "t1"

现在,由于main.yml中包含文件的第一个任务正在使用此标记,因此将执行includeFile.yml中定义的所有任务,而无需进一步检查includeFile.yml中的标记。

请注意,includeFile.yml中的任务也使用此标记,但这并不意味着只会执行该特定任务。

2. ansible-playbook -i hosts main.yml --tags "t2"

在这种情况下,由于main.yml中的第一个任务(包含)未使用此标记。这并不意味着不执行includeFile.yml的任务,includeFile.yml将进一步搜索所提到的标签。因此,main.yml的第二个任务和includeFile.yml的第二个任务将被执行。

3. ansible-playbook -i hosts main.yml --tags "t3"

现在在这种情况下,只会执行includeFile.yml的第三个任务(与第二点中解释的逻辑相同)。

现在回到你的问题:

我们只能在使用 - 标签的ansible-playbook命令执行时提及标签。所以现在我们不能在包含文件时传递标签。

但是,如果你在运行ansible-playbook时提到了一些标签(存在于包含文件中),那么你就可以了...但是只有那些正在使用该特定标签的任务(在主文件中)才会被执行。因此,在您的情况下,此选项看起来不可行,因为您必须标记主文件中存在的所有任务,以使您的工作正常。

正如我们在评论中讨论的那样,最好将虚拟变量传递给该包含文件并有条件地运行任务。但是,如果您的问题陈述是根据我们上面讨论的内容设置的,您也可以使用标签。

注意:在处理角色/包含时,标签仍然有用。当你不想运行主剧本或角色/包含附件中可能存在的某些任务时,标签在这种情况下完全适合(我们在运行ansible-playbook时使用--skip-tags来实现这一点)。

最后注意:使用标记的主要目的是动态控制在特定运行中需要执行哪些任务。如果你要对标签进行硬编码(传递给包含),那么目的就会丢失。