ali*_*der 5 ansible ansible-2.x
我试图使用include语句从另一个playbook调用ansible v2.1 playbook(notifications.yml).我想指定一个标签,并将一个参数传递给被调用的playbook(从包含playbook的playbook中).我能够在没有标签的情况下使用它,但似乎无法使用标签.这是否可能(没有命令行参数),如果是这样,实现这个的语法/正确方法是什么:
main.yml
- include: playbooks/notifications.yml
tags: ['slack']
slack_msg: "test"
Run Code Online (Sandbox Code Playgroud)
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 }}'
Run Code Online (Sandbox Code Playgroud)
Sha*_*a99 13
我将首先讨论一下当我们使用include/roles时标签是如何工作的.
在使用--tags运行playbook时必须指定标记,并且将执行指定标记下的所有任务,无论它们是在主文件中定义还是在角色/包含文件中定义.但是有一些有趣的事实需要注意:
main.yml
---
- hosts: all
tasks:
- include: includeFile.yml tags=t1
- debug: msg="Inside main file"
tags:
- t2
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
1. ansible-playbook -i hosts main.yml --tags "t1"
Run Code Online (Sandbox Code Playgroud)
现在,由于main.yml中包含文件的第一个任务正在使用此标记,因此将执行includeFile.yml中定义的所有任务,而无需进一步检查includeFile.yml中的标记.
请注意,includeFile.yml中的任务也使用此标记,但这并不意味着只执行该特定任务.
2. ansible-playbook -i hosts main.yml --tags "t2"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,由于main.yml中的第一个任务(包含)不使用此标记.这并不意味着不执行includeFile.yml的任务,includeFile.yml将进一步搜索所提到的标签.因此,将执行main.yml的第二个任务和includeFile.yml的第二个任务.
3. ansible-playbook -i hosts main.yml --tags "t3"
Run Code Online (Sandbox Code Playgroud)
现在在这种情况下,将只执行includeFile.yml的第三个任务(与第二点中解释的逻辑相同).
现在回到你的问题:
我们只能在使用--tags执行ansible -playbook命令时提及标签.所以现在我们不能在包含文件时传递标签.
但是,如果你在运行ansible-playbook时提到了一些标签(存在于包含文件中),那么你就可以了......但是只会执行使用该特定标签的任务(在主文件中).因此,在您的情况下,此选项看起来不可行,因为您必须标记主文件中存在的所有任务以使您的工作正常.
因此,正如我们在评论中讨论的那样,最好将虚拟变量传递给该包含文件并有条件地运行任务.但是,如果根据我们上面讨论的内容设置问题陈述,您也可以使用标签.
注意:在处理角色/包含时,标签仍然有用.当你不想运行主剧本或角色/包附件中可能存在的某些任务时,标签完全适合这种情况(我们在运行ansible-playbook时使用--skip-tags来实现这一点).
最后注意:使用标记的主要目的是动态控制在特定运行中需要执行哪些任务.如果您将对标记进行硬编码(传递给include),那么目的就会丢失.
| 归档时间: |
|
| 查看次数: |
17844 次 |
| 最近记录: |