在include指令和with_items

时间:2018-06-14 18:21:07

标签: ansible provisioning

所以我遇到了一个奇怪的问题,即ansible无法在角色中执行某些标记为include的任务。

经过一番挖掘后,只要includewith_items相关联,就会出现运行指定任务的能力。

例如,我的简单角色包含:

role/tasks/main.yml
---
- include: test.yml
  tags:
    - my_role_test


role/tasks/test.yml
---
- debug:
    msg: "It works"

当我用--tags=my_role_test运行我的Playbook时,我可以看到预期的输出:

[20:18:52] test : debug | server | SUCCESS | 593ms
{
  - msg: It works
}

但是,如果我更改了main.yml文件并将with_items添加到包含任务:

role/tasks/main.yml
---
- include: test.yml
  with_items:
    - A
    - B
  tags:
    - my_role_test

我得到了这个输出:

[20:15:41] test : include
[20:15:41]  ➥ system | included: /test/tasks/test.yml for server
[20:15:41]  ➥ system | included: /test/tasks/test.yml for server
[20:15:41]  ➥ system | -- Play recap --

并且没有执行任务。

我做错了吗?这是一个安赛问题吗?你知道一个解决方法吗?

我的ansible版本是2.5.2。

谢谢,

3 个答案:

答案 0 :(得分:1)

要问的主要问题是:

使用Ansible在循环中为每个项目设置标记。

这看起来像一个未解决的问题。 https://github.com/ansible/ansible/issues/19115

请检查一下: https://serverfault.com/questions/864638/ansible-set-tags-per-item-in-with-items-loop

答案 1 :(得分:1)

尝试" include_tasks"而不是"包括"正如https://github.com/ansible/ansible/issues/19115中所建议的那样 " ...此问题已在最近的ansible版本中得到解决,但需要更改include以改为使用include_tasks。" 有详细信息 https://docs.ansible.com/ansible/2.5/porting_guides/porting_guide_2.5.html#dynamic-includes-and-attribute-inheritance

答案 2 :(得分:0)

所以,基本上,ansible changed the way to manage tags inheritance since Ansible 2.5。唯一的解决方案是将标记直接放在包含的任务文件的每个任务上,或使用static import_ *。注意,对于动态包含,使用块部分可能会有所帮助:

Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/userinfo?user=root&password=admin");
Statement statement = connection.createStatement();

resultset = statement.executeQuery("select * from item");

<select id = "item3" name = "item3" onchange = "display_selection()">
    <%while(resultset.next()){%> 
    <option>
        <%= resultset.getString(2)%>
        <%= resultset.getString(3)%> 
    </option>
    <%}%>

    <script>
        function display_selection() {
            var e = document.getElementById("item3").value;
            var val = document.getElementById("item");
            val.value = e;
        } 
    </script> 
</select></font>
<div class = "item2">
    <input type = "text" name = "item" id = "item" value = "" size = "165" disabled = "disabled" /> 
</div>
</h5>