【问题标题】:I am trying to manipulate an ansible output [closed]我正在尝试操作 ansible 输出 [关闭]
【发布时间】:2022-01-15 07:18:27
【问题描述】:

所以我正在尝试为 ansible 设置动态库存。我将服务器名称放入一个文件中,现在我想把它放在 ansible 可接受的格式中。这就是我问这个问题的原因。我通过 api 从 oracle pca 中提取数据。感谢您的回答以及您的 X/Y 问题

{"msg": ["server1", "server2", " server3", " server4", " server5", " server6"], "failed": false, "changed": false}

上面的输出取自一个文件。我的目标是删除所有内容,并且仅在 1 行中列出服务器名称,如下所示:

- server1
- server2
- server3
.....

如果我能得到像下面这样的输出就更好了

---
- server1
- server2
- server3
......

为什么关闭?我不确定,无论如何,感谢那些帮助过的人

【问题讨论】:

  • 基本上类似于{{ (lookup('file', '/path/to/your_file') | from_json).msg | to_yaml }}。但这闻起来很香X/Y problem
  • 所以我正在尝试为 ansible 设置动态库存。我将服务器名称放入一个文件中,现在我想把它放在 ansible 可接受的格式中。这就是我问这个问题的原因。我通过 api 从 oracle pca 中提取数据。感谢您的回答以及您的 X/Y 问题
  • 这应该对您的问题进行编辑。
  • 您的文件内容显然来自 ansible 任务运行。你为什么不直接使用注册的内容来动态创建库存(参见add_host 模块)或将内容作为 yaml 直接写入文件以供以后使用?
  • 感谢您的帮助;但添加主机模块不会做我想要的。下面的答案正是我想要的。谢谢!

标签: awk sed ansible output manipulate


【解决方案1】:

使用sed

sed 's/]/, ]/;s/"//g;s/^[^[]*\|\[\|].*\|,//g;s/\([^ ]*.\) /- \1\n/g;i---' input_file
---
- server1
- server2
- server3
- server4
- server5
- server6

【讨论】:

  • 您的解决方案也有效,只是您忘记删除引号,这很好。如果我决定使用它,我可以添加它。谢谢!注意:如果你修复它;我也会将其标记为正确。
  • @SenanT 哎呀!似乎我用echo 测试了这个并丢失了引号。道歉。固定
【解决方案2】:

使用awk可以获取列表:

awk -F'[][]' '{sub(/"/, "- ",$2);gsub(/", *" */,"\n- ",$2);sub(/"/,"",$2);print "---\n"$2}' file
---
- server1
- server2
- server3
- server4
- server5
- server6
  • 设置分隔符为'[][]',你可以使用sub()gsub函数remove everything and have only servers name

【讨论】:

    【解决方案3】:

    通常(甚至可能需要),动态清单脚本在标准输出中返回 JSON。所以,你就快到了。

    如果您获取一个非常基本的清单,并针对它运行ansible-inventory --list,您将看到输出格式。所以如果你拿这个:

    # hosts.ini
    server1
    server2
    server3
    

    然后运行ansible-inventory --list -i hosts.ini,你会得到这个:

    {
        "_meta": {
            "hostvars": {}
        },
        "all": {
            "children": [
                "ungrouped"
            ]
        },
        "ungrouped": {
            "hosts": [
                "server1",
                "server2",
                "server3"
            ]
        }
    }
    

    因此,您必须获取您的文件,并通过jq 运行它。我写了inv.sh

    #!/bin/bash
    echo '{ "_meta": { "hostvars": {} }, "all": { "children": [ "ungrouped" ] }, "ungrouped": { "hosts": '
    cat file.json | jq .msg
    echo ' } }'
    

    您的服务器名称中确实有多余的空格。所以修复它。

    $ ansible-inventory --list -i ./inv.sh 
    {
        "_meta": {
            "hostvars": {}
        },
        "all": {
            "children": [
                "ungrouped"
            ]
        },
        "ungrouped": {
            "hosts": [
                " server3",
                " server4",
                " server5",
                " server6",
                "server1",
                "server2"
            ]
        }
    }
    

    【讨论】:

    • 虽然您的解决方案有效;这不是我想要做的。谢谢你的帮助
    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 2022-01-22
    • 2012-04-14
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多