ansible - 在 Ansible play 中覆盖 IP 地址或主机标签

标签 ansible

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

[host1]
192.168.1.2
[host2]
192.168.1.10

当我设置本地主机(例如“host2”)时,它有一个随机 (dhcp) IP 地址。我已经更改了hosts.ini并覆盖了主机IP地址,然后我使用主机变量将我想要的IP地址实际设置到其dhcpcd.conf中。

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

我可以想到一些解决方法:

  1. ansible-playbook 命令行上覆盖手动 list 中的 IP
  2. ansible-playbook 命令行上的手动 list 中指定主机 IP 和主机名
  3. 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 的早期游戏/任务几乎可以工作,但鉴于 host2 已存在于库存中,我要么必须清空我的库存,要么(以某种方式)专门给我的主人打电话。请记住,这是为了引导,因此我们的想法是避免以后出现任何魔法。

很抱歉这篇文章有点长。我想提供 XY 问题的背景信息,并询问我的具体策略/问题。

最佳答案

为什么不使用基于设备 MAC 地址的动态 list ?

只是一个小例子。当然还需要改进,但仅供大家引用:

#!/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 - 在 Ansible play 中覆盖 IP 地址或主机标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50998150/

相关文章:

Ansible 创建用户和组

Ansible - 同一主机的多个/备用主机名

Ansible win_audit_policy_system 模块未更改值

macos - 如何在 Mac 上降级和安装 ansible 1.9.4

ansible:lineinfile 有多行?

ansible - 在 Ansible 中解析字典键或参数变量

ansible - 在 ansible 中创建动态角色

Ansible:when子句中的多个和/或条件

elasticsearch - elasticsearch.yml的Ansible幂等

postgresql - Dockerized PostgreSQL : psql: FATAL: the database system is starting up