【问题标题】:Ansible: Create variables from json stringAnsible:从 json 字符串创建变量
【发布时间】:2017-07-11 23:07:08
【问题描述】:

在 Ansible 中,有没有办法将位于 JSON 变量中的键/值对的动态列表转换为可以在 Playbook 中访问而不使用文件系统的变量名称/值?

IE - 如果我在变量中有以下 JSON(在我的情况下,已经从 URI 调用导入):

{
        "ansible_facts": {
            "list_of_passwords": {
                "ansible_password": "abc123",
                "ansible_user": "user123",
                "blue_server_password": "def456",
                "blue_server_user": "user456"
            }
}

有没有办法将该 JSON 变量转换为:

vars:
  ansible_password: abc123
  ansible_user: user123
  blue_server_password: def456
  blue_server_user: user456

通常,我会将变量写入文件,然后使用vars_files: 将其导入。我们的目标是不将秘密写入文件系统。

【问题讨论】:

  • "不使用文件系统" -- 文件系统?你在说什么?使用像list_of_passwords.ansible_password 这样的虚线路径访问值有什么问题?你问了一个非常笼统的问题,但这个例子太本地化了。您可以使用模板逐个转换结构。
  • 我认为我正在努力解决的是您回复的第二部分 - 逐个转换结构。假设我事先不知道变量是什么,我怎么能逐个处理呢?

标签: json ansible


【解决方案1】:

您可以使用uri module 拨打电话,然后注册对变量的响应:

例如:

- uri:
    url: http://www.mocky.io/v2/59667604110000040ec8f5c6
    body_format: json
  register: response
- debug:
    msg: "{{response.json}}"
- set_fact: {"{{ item.key }}":"{{ item.val }}"}
  with_dict: "{{response.json.ansible_facts.list_of_passwords}}"

【讨论】:

  • 如果json来自uri以外的其他来源,您可以使用from_json过滤器:docs.ansible.com/ansible/…
  • 我读到的 URI,我想弄清楚的是如何将返回的 JSON 对象处理成变量,这些变量的名称和键是 in JSON 对象.
  • 您可以使用set_fact动态设置变量。查看我的更新。
  • 您的更新对我有用,但我必须使用 with_dict 而不是 with_items。谢谢!
  • 是的,你是对的,我昨天没有测试过,我更正了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多