用标签和参数调用ansible playbook

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),那么目的就会丢失.

  • 谢谢你把这些放在一起 (3认同)