Ansible Yml必须存储为字典/哈希

Ansible Yml必须存储为字典/哈希,ansible,Ansible,我有一个用户名及其ssh密钥的yaml文件,存储方式如下: --- -用户:鲍勃 姓名:鲍勃·麦克鲍勃 ssh_密钥: -ssh rsa。。。 -用户:弗雷德 姓名:弗雷德·麦克弗雷德 ssh_密钥: -ssh rsa。。。 我正在尝试获取用户和ssh\u密钥密钥,以便使用此文件在linux主机上设置用户 但Ansible似乎不喜欢此文件的格式,因为此简单任务会引发错误: -name:获取SSH密钥 包括以下变量: 文件:../admins.yml 名称:ssh_密钥 不幸的是,我无法更改a

我有一个用户名及其ssh密钥的yaml文件,存储方式如下:

---
-用户:鲍勃
姓名:鲍勃·麦克鲍勃
ssh_密钥:
-ssh rsa。。。
-用户:弗雷德
姓名:弗雷德·麦克弗雷德
ssh_密钥:
-ssh rsa。。。
我正在尝试获取
用户
ssh\u密钥
密钥,以便使用此文件在linux主机上设置用户

但Ansible似乎不喜欢此文件的格式,因为此简单任务会引发错误:

-name:获取SSH密钥
包括以下变量:
文件:../admins.yml
名称:ssh_密钥
不幸的是,我无法更改
admins.yml
文件的格式,因为它在其他工具中使用,更改格式会破坏它们。
对我如何解决这个问题有什么建议吗

看起来ansible希望
admins.yml
文件如下所示:

---
傅:
-用户:鲍勃
我叫鲍勃·麦克鲍勃
ssh_密钥:
-ssh-rsa。。

正如您所说,给定的vars文件的格式无效。您可以使用任务以您描述的方式修复文件,然后尝试加载它

lineinfle
任务可用于实现此技巧,如下例所示:

---
- hosts: localhost
  gather_facts: false
  vars:
 
  tasks:
  - name: fix vars file
    lineinfile:
      path: "{{ playbook_dir }}/vars_file.yml"
      insertafter: "^---$"
      line: "ssh_keys:"
      backup: yes

  - name: Get SSH Keys
    include_vars:
      file: "{{ playbook_dir }}/vars_file.yml"

  - debug: var=ssh_keys
如果不希望编辑该文件,可以复制到新文件名(vars_file_fixed.yml),然后应用lineinfile并加载它


干杯

正如您所说,给定的vars文件的格式无效。您可以使用任务以您描述的方式修复文件,然后尝试加载它

lineinfle
任务可用于实现此技巧,如下例所示:

---
- hosts: localhost
  gather_facts: false
  vars:
 
  tasks:
  - name: fix vars file
    lineinfile:
      path: "{{ playbook_dir }}/vars_file.yml"
      insertafter: "^---$"
      line: "ssh_keys:"
      backup: yes

  - name: Get SSH Keys
    include_vars:
      file: "{{ playbook_dir }}/vars_file.yml"

  - debug: var=ssh_keys
如果不希望编辑该文件,可以复制到新文件名(vars_file_fixed.yml),然后应用lineinfile并加载它


干杯

您发现,
include_vars
需要一个包含顶层dict键的文件。但在ansible中还有其他读取yaml文件的方法

如果无法更改文件,最简单的方法是使用和读取变量中的内容

下面是一个示例剧本。对于这个测试,上面的示例数据存储在与剧本相同的文件夹中。相应地调整

---
-主机:本地主机
收集事实:错误
变量:
管理员:{{lookup('file','admins.yml')| from_yaml}
任务:
-名称:显示管理员用户列表
调试:
变量:管理员
其中:

PLAY [localhost] ***********************************************************************************************************************************************************************************************************************

TASK [Show admin users list] ***********************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "admins": [
        {
            "name": "bob McBob",
            "ssh_keys": [
                "ssh-rsa ..."
            ],
            "user": "bob"
        },
        {
            "name": "fred McFred",
            "ssh_keys": [
                "ssh-rsa ..."
            ],
            "user": "fred"
        }
    ]
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

正如您所发现的,
include\u vars
需要一个包含顶层dict键的文件。但在ansible中还有其他读取yaml文件的方法

如果无法更改文件,最简单的方法是使用和读取变量中的内容

下面是一个示例剧本。对于这个测试,上面的示例数据存储在与剧本相同的文件夹中。相应地调整

---
-主机:本地主机
收集事实:错误
变量:
管理员:{{lookup('file','admins.yml')| from_yaml}
任务:
-名称:显示管理员用户列表
调试:
变量:管理员
其中:

PLAY [localhost] ***********************************************************************************************************************************************************************************************************************

TASK [Show admin users list] ***********************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "admins": [
        {
            "name": "bob McBob",
            "ssh_keys": [
                "ssh-rsa ..."
            ],
            "user": "bob"
        },
        {
            "name": "fred McFred",
            "ssh_keys": [
                "ssh-rsa ..."
            ],
            "user": "fred"
        }
    ]
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0