96

我想在 Python 中运行 Ansible 而不通过 (ANSIBLE_HOST) 指定库存文件,但只需:

ansible.run.Runner(
  module_name='ping',
  host='www.google.com'
)

我实际上可以很容易地在织物中做到这一点,但只是想知道如何在 Python 中做到这一点。另一方面,Ansible API for python 的文档并不完整。

4

6 回答 6

198

令人惊讶的是,诀窍是附加一个,

# Host and IP address
ansible all -i example.com,
ansible all -i 93.184.216.119,

或者

# Requires 'hosts: all' in your playbook
ansible-playbook -i example.com, playbook.yml

前面的主机参数,可以是主机名或 IPv4/v6 地址。

于 2013-08-15T14:48:10.170 回答
56

我知道这个问题真的很老,但认为这个小技巧可能对未来需要帮助的用户有所帮助:

ansible-playbook -i 10.254.3.133, site.yml

如果您为本地主机运行:

ansible-playbook -i localhost, --connection=local site.yml

诀窍是在 ip 地址/dns 名称之后,将逗号放在引号内,并hosts: all在您的剧本中要求 ' '。

希望这会有所帮助。

于 2015-03-28T09:07:55.810 回答
9

就我而言,我不想hosts: all在我的剧本中包含,因为如果有人运行剧本并忘记包含-i 10.254.3.133,

这是我的解决方案(ansible 2.6):

$ ansible-playbook myplaybook.yml -e "{target: 10.1.1.1}" -i 10.1.1.1, ...

然后,在剧本中:

- hosts: "{{ target }}"
  remote_user: donn
  vars_files:
    - myvars
  roles:
    - myrole

当我需要配置主机并且我不想/不需要将其添加到清单中时,这是一个特殊的用例。

于 2019-06-13T01:21:20.570 回答
8

你可以这样做:

hosts = ["webserver1","webserver2"]

webInventory = ansible.inventory.Inventory(hosts)

webPing = ansible.runner.Runner(
    pattern='webserver*',
    module_name='ping',
    inventory = webInventory
).run()

主机中的任何内容都会成为您的清单,您可以使用模式搜索它(或执行“全部”)。

于 2013-09-04T09:52:16.987 回答
1

我还需要驱动Ansible Python API,并且宁愿将主机作为参数传递而不是保留清单。我使用了一个临时文件来解决 Ansible 的要求,这可能对其他人有帮助:

from tempfile import NamedTemporaryFile

from ansible.inventory import Inventory
from ansible.runner import Runner

def load_temporary_inventory(content):
    tmpfile = NamedTemporaryFile()
    try:
        tmpfile.write(content)
        tmpfile.seek(0)
        inventory = Inventory(tmpfile.name)
    finally:
        tmpfile.close()
    return inventory

def ping(hostname):
    inventory = load_temporary_inventory(hostname)
    runner = Runner(
        module_name='ping',
        inventory=inventory,
    )
    return runner.run()
于 2014-09-11T20:12:39.443 回答
0

根据我的理解,一个非常简单的解决方案,如果分散注意力,请道歉。

这里有3个主要步骤需要在那里,

  1. 命令行选项
  2. playbook.yml 中需要暴露的内容
  3. 它说什么

1.命令行选项

ansible-playbook -l "主机名" <playbook.yml>

请注意,主机名是节点的 $hostname

2.playbook.yml里面需要暴露什么

- hosts: webservers
  tasks:
    - debug:
        msg: "{{ ansible_ssh_host }}"
      when: inventory_hostname in groups['webservers']

3.它说什么?看一看 :)

TASK [debug] ***********************************************************************************************************************************************************
Thursday 10 December 2020  13:01:07 +0530 (0:00:03.153)       0:00:03.363 *****
ok: [node1] => {
    "msg": "192.168.1.186"
}

这就是我们可以使用--limit 或 -l选项在特定节点上执行任务的方式

于 2020-12-09T08:03:38.363 回答