【问题标题】:Ansible dynamic inventory in JSON format isn't getting parsedJSON 格式的 Ansible 动态库存未得到解析
【发布时间】:2026-01-07 20:40:02
【问题描述】:

我试过用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格式。

【问题讨论】:

    标签: python json ansible ini


    【解决方案1】:

    我尝试将脚本更改为可执行文件,结果如下:

    [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
    

    请注意,这次它使用了脚本插件,“执行格式错误”是由于我的系统默认为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
    
    

    【讨论】: