JSON 格式的 Ansible 动态清单未被解析

Ansible dynamic inventory in JSON format isn't getting parsed

我尝试在python中编写了一个动态库存脚本,如下所示:

[root@satellite code]# python3 dynamic_inventory.py --list > hosts
[root@satellite code]# cat hosts
{"k8s-master": ["k8s-master.example.com"], "k8s-worker": ["worker-1.example.com", "worker-2.example.com"], "satellite": ["satellite.example.com"], "all": ["satellite.example.com", "worker-2.example.com", "k8s-master.example.com", "worker-1.example.com"], "Centos7": ["k8s-master.example.com", "worker-1.example.com", "worker-2.example.com", "satellite.example.com"]}

现在,当我尝试使用库存时,出现以下错误:

[root@satellite code]# ansible-playbook -i hosts sample.yaml
[WARNING]: Skipping 'Centos7' as this is not a valid group definition
[WARNING]: Skipping 'k8s-worker' as this is not a valid group definition
[WARNING]: Skipping 'satellite' as this is not a valid group definition
[WARNING]: Skipping 'k8s-master' as this is not a valid group definition
[WARNING]: Skipping 'all' as this is not a valid group definition
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [all] *************************************************************************************************************************************************************
skipping: no hosts matched

PLAY RECAP *************************************************************************************************************************************************************

也试过这个:

[root@satellite code]# ansible-playbook -i dynamic_inventory.py sample.yaml
[WARNING]:  * Failed to parse /root/code/dynamic_inventory.py with ini plugin: /root/code/dynamic_inventory.py:1: Expected key=value host variable assignment, got: os
[WARNING]: Unable to parse /root/code/dynamic_inventory.py as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [all] *************************************************************************************************************************************************************
skipping: no hosts matched

PLAY RECAP *************************************************************************************************************************************************************

该脚本从 MySQL 数据库中获取主机名,并将其转换为 JSON 格式。我在官方 ansible 文档中找不到任何插件。谁能帮忙解决这个问题?有什么方法可以将脚本输出渲染成ini格式。

我尝试将脚本更改为可执行文件并得到了这个:

[root@satellite code]# ansible-playbook -i dynamic_inventory.py sample.yaml
[WARNING]:  * Failed to parse /root/code/dynamic_inventory.py with script plugin: problem running /root/code/dynamic_inventory.py --list ([Errno 8] Exec format error)
[WARNING]:  * Failed to parse /root/code/dynamic_inventory.py with ini plugin: /root/code/dynamic_inventory.py:1: Expected key=value host variable assignment, got: os

注意这次使用的是脚本插件,"Exec format error"是因为我的系统默认是python2。在文件中添加了 shebang(#!/usr/bin/python3) 并且有效:

[root@satellite code]# ansible-playbook -i dynamic_inventory.py sample.yaml
[DEPRECATION WARNING]: The TRANSFORM_INVALID_GROUP_CHARS settings is set to allow bad characters in group names by default, this will change, but still be user
configurable on deprecation. This feature will be removed in version 2.10. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details

PLAY [all] *************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************
fatal: [worker-1.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname worker-1.example.com: Name or service not known", "unreachable": true}
fatal: [worker-2.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname worker-2.example.com: Name or service not known", "unreachable": true}
fatal: [k8s-master.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname k8s-master.example.com: Name or service not known", "unreachable": true}
fatal: [satellite.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}

PLAY RECAP *************************************************************************************************************************************************************
k8s-master.example.com    : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
satellite.example.com     : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
worker-1.example.com      : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
worker-2.example.com      : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0