覆盖Ansible play中的ip地址或主机标签

覆盖Ansible play中的ip地址或主机标签,ansible,Ansible,在我的个人网络上,我有一个简单的主机列表: [host1] 192.168.1.2 [host2] 192.168.1.10 当我设置本地主机时,比如“host2”,它有一个随机(dhcp)IP地址。我已经更改了hosts.ini并覆盖了主机IP地址,然后我使用hostvars将我想要的IP地址设置到它的dhcpcd.conf中 我的游戏有我所有的本地机器,所以我需要主机标签来匹配。但是,如果没有一些手动操作,我无法在第一次开机时使用它 我可以想出一些变通办法: 在ansible playbo

在我的个人网络上,我有一个简单的主机列表:

[host1]
192.168.1.2
[host2]
192.168.1.10
当我设置本地主机时,比如“host2”,它有一个随机(dhcp)IP地址。我已经更改了hosts.ini并覆盖了主机IP地址,然后我使用hostvars将我想要的IP地址设置到它的dhcpcd.conf中

我的游戏有我所有的本地机器,所以我需要主机标签来匹配。但是,如果没有一些手动操作,我无法在第一次开机时使用它

我可以想出一些变通办法:

  • ansible playbook
    命令行上的手动资源清册中覆盖IP
  • ansible playbook
    命令行上的手动资源清册中指定主机ip和主机名
  • ansible playbook
    命令行上设置ansible主机名
  • 问题是我无法让它们中的任何一个工作:

    ansible-playbook play.yml -i "[host2]\n192.168.0.123," --limit host2
     [WARNING]: Could not match supplied host pattern, ignoring: host2
    
    ansible-playbook play.yml -i "192.168.0.123 ansible_host=host2," --limit host2
     [WARNING]: Could not match supplied host pattern, ignoring: host2
    
    ansible-playbook play.yml -i "192.168.0.123," -e "ansible_host=host2" --limit host2
     [WARNING]: Could not match supplied host pattern, ignoring: host2
    
    我真的认为第三个想法是有价值的,我就是不能从这里实现。由于这是一个一次性的问题,我不想创建一个临时的hosts文件,但我不确定是否有其他方法可以做到这一点

    注意:以前的一个播放/任务调用了
    add_hosts
    几乎可以运行,但鉴于清单中已经存在host2,我要么清空清单,要么(以某种方式)以独占方式调用我的主机。记住,这是用于引导的,所以我们的想法是避免以后使用任何魔法


    抱歉,时间太长了。我想给出XY问题的背景,并询问我的具体策略/问题。

    为什么不使用基于设备mac地址的动态资源清册

    只是一个小例子。当然需要改进,但仅供参考:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from __future__ import (absolute_import, division, print_function,
                            unicode_literals)
    
    import json
    import socket
    import subprocess
    import re
    
    
    def main():
        print(json.dumps(inventory(), sort_keys=True, indent=2))
    
    
    def inventory():
        ip_address = find_ip()
    
        return {
            'all': {
                'hosts': [ip_address],
                'vars': {},
            },
            '_meta': {
                'hostvars': {
                    ip_address: {
                        'ansible_ssh_user': 'ansible',
                    }
                },
            },
            'ip': [ip_address]
        }
    
    
    def find_ip():
        lines = subprocess.check_output(['arp', '-a']).decode('utf-8').split('\n')
        for line in lines:
            if re.search('a0:d7:95:1a:80:f8', line):
                ip = re.search(r"(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b)", line)
                return ip.group(1)
    
    
    if __name__ == '__main__':
        main()
    
    输出:

    {
      "_meta": {
        "hostvars": {
          "192.168.0.100": {
            "ansible_ssh_user": "ansible"
          }
        }
      },
      "all": {
        "hosts": [
          "192.168.0.100"
        ],
        "vars": {
          "ansible_connection": "local"
        }
      },
      "ip": [
        "192.168.0.100"
      ]
    }
    
    例如:

    ansible-playbook -i inventories/dynamic/mydyn.py hosts.yml 
    
    PLAY [Test wait] ****************************************************************************************************************
    
    TASK [Debug] ********************************************************************************************************************
    ok: [192.168.0.100] => {
        "ansible_host": "192.168.0.100"
    }
    
    TASK [Ping] *********************************************************************************************************************
    ok: [192.168.0.100]
    
    PLAY RECAP **********************************************************************************************************************
    192.168.0.100              : ok=2    changed=0    unreachable=0    failed=0