Ansible:从package_facts的输出中选择软件包的版本

时间:2019-06-03 13:58:24

标签: ansible devops ansible-facts

我正在运行一个Playbook,该Playbook从远程主机收集软件包的事实,我想要实现的是过滤输出并仅获取软件包的名称和版本。

这是我的剧本

- name: Gather rpm packages
  package_facts:
    manager: auto

- name: Print the rpm packages
  debug:
    var: ansible_facts.packages

结果格式

TASK [infra_pt : Print the rpm packages] ****************************************************
ok: [192.168.47.135] => {
    "msg": {
        "GConf2": [
            {
                "arch": "x86_64", 
                "epoch": null, 
                "name": "GConf2", 
                "release": "8.el7", 
                "source": "rpm", 
                "version": "3.2.6"
            }
        ], 
        "GeoIP": [
            {
                "arch": "x86_64", 
                "epoch": null, 
                "name": "GeoIP", 
                "release": "9.el7", 
                "source": "rpm", 
                "version": "1.5.0"
            }
        ], 

首选输出仅包含名称和版本号,如何归档?

1 个答案:

答案 0 :(得分:0)

由于字典中的值在列表中,因此需要索引[0]。可能是因为可能安装了同一软件包的更多版本?

下的任务
<form asp-controller="Settings" asp-action="Login" method="post">
<select id="ddlBoard" name="board">
            @if (userIndex == 0 || userData[userIndex].ProjectId == null)
            {
                <option selected disabled value="-1">Plantafel auswählen</option>
            }
            @for (int i = 0; i < projectData.Count; i++)
            {
                if (userIndex != 0 && userData[userIndex].ProjectId == projectData[i].Idx)
                {
                    <option selected value="@projectData[i].Idx">@projectData[i].projectName</option>
                }
                else
                {
                    <option value="@projectData[i].Idx">@projectData[i].projectName</option>
                }
            }
        </select>



<!--Row-->
        <!--todo update this after project change and show only rows from one project-->
        <select id="ddlRow" name="row">
            @if (userIndex == 0 || userData[userIndex].RowId == null)
            {
                <option selected disabled value="-1">Zeile auswählen</option>
            }
            @for (int i = 0; i < rowData.Count; i++)
            {
                if (userIndex != 0 && userData[userIndex].RowId == rowData[i].Idx)
                {
                    <option selected value="@rowData[i].Idx">@rowData[i].RowName</option>
                }
                else
                {
                    <option value="@rowData[i].Idx">@rowData[i].RowName</option>
                }
            }
        </select>
</form>

给予(grep msg):

tasks:
  - debug:
      msg: "{{ item.key }} {{ item.value[0].version }}"
    loop: "{{ ansible_facts.packages|dict2items }}"

可能正确的解决方案应该使用 json_query 列表中可能包含更多版本的

"msg": "GeoIP 1.5.0"
"msg": "GConf2 3.2.6"

给予:

- debug:
    msg: "{{ item.key }} {{ item.value|json_query('[].version') }}"
  loop: "{{ ansible_facts.packages|dict2items }}"
相关问题