使用标签和参数调用 ansible 剧本

calling an ansible playbook with tag and parameter

我正在尝试使用 include 语句从另一个剧本调用一个 ansible v2.1 剧本 (notifications.yml)。我想指定一个标签并将一个参数传递给被调用的剧本(从包含剧本的剧本中)。我能够在没有标签的情况下让它工作,但似乎无法让它与标签一起工作。这甚至可能吗(没有命令行参数),如果是的话,syntax/correct 实现此目标的方法是什么:

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 }}'

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

在使用 --tags 执行剧本时 运行 必须指定标签,并且无论是否已定义,都将执行指定标签下的所有任务在主文件或 roles/included files.However 中有一些有趣的事实需要注意:

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 中定义的所有任务将在不进一步检查 [=] 中的标签的情况下执行72=].

请注意 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 的第三个任务(与第二点中解释的逻辑相同)。



现在回到你的问题:

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

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

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

注意:标签在处理 roles/includes 时仍然有用。当你不想 运行 一些可能出现在主剧本或附加的 role/include 中的任务时,标签非常适合这种情况(我们使用 --skip-tags 而 运行ning ansible-playbook 来实现这个)。

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