在我的个人网络上,我有一个简单的主机列表:
[host1]
192.168.1.2
[host2]
192.168.1.10
当我设置本地主机(例如“host2”)时,它有一个随机 (dhcp) IP 地址。我已经更改了hosts.ini并覆盖了主机IP地址,然后我使用主机变量将我想要的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
我真的认为第三个想法有其优点,但我只是无法从这里到达那里。由于这是一次性问题,我不想创建临时主机文件,但我不确定是否有其他方法可以做到这一点。
请注意,有一个调用
add_hosts
几乎 的早期游戏/任务可以工作,但鉴于主机2已经存在于库存中,我要么必须清空我的库存,要么(以某种方式)专门调用我的主机。请记住,这是为了引导,所以我们的想法是避免以后出现任何魔法。
抱歉这有点长。我想给出 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
这个问题很老了,但我找到了一个不错的解决方案:
ansible-playbook playbooks/play.yml -i <inventory file> -l "<hostname of target>" -e "ansible_host=<current ip for host>"
此外,您可能没有设置供 ansible 连接和使用的配置用户,因此您可能需要使用以下选项:
-u <username to log into> --ask-pass --ask-become-pass