我试图使用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 }}'
答案 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来实现这一点)。
最后注意:使用标记的主要目的是动态控制在特定运行中需要执行哪些任务。如果你要对标签进行硬编码(传递给包含),那么目的就会丢失。