如何在不指定库存但直接主机的情况下运行Ansible?

时间:2013-06-19 09:50:23

标签: python ansible

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

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

我实际上可以轻松地在Fabric中执行此操作,但只是想知道如何在Python中执行此操作。另一方面,用于python的Ansible API的文档并不完整。

8 个答案:

答案 0 :(得分:136)

令人惊讶的是,诀窍是追加,

# 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地址。

答案 1 :(得分:30)

我知道这个问题已经很老了但是认为这个小技巧可能对将来需要帮助的用户有所帮助:

ansible-playbook -i 10.254.3.133, site.yml

如果你竞选本地主持人:

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

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

希望这会有所帮助。

答案 2 :(得分:6)

你可以这样做:

hosts = ["webserver1","webserver2"]

webInventory = ansible.inventory.Inventory(hosts)

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

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

答案 3 :(得分: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()

答案 4 :(得分:0)

这不是一个完整的答案,但在this discussion thread中对此主题进行了一些讨论。在该主题的第一篇文章的末尾,建议为ansible-playbook创建一个包装器bash脚本,这有点像黑客但可行。

我一直在考虑的其他事情是使用'ansible-pull'和创建一个ansible库存插件。我也有兴趣找到这个问题的答案,我会在找到更多信息时不断更新这个答案。

答案 5 :(得分:0)

似乎没有直接的方式来给出图案。这是我的解决方法。

echo fldn[3789:3799].mysite.com >test; ansible all -i test -m ping

答案 6 :(得分:0)

就我而言,我不想在剧本中加入hosts: all,因为如果有人跑了剧本而忘了包含-i 10.254.3.133,

,那将是很糟糕的

这是我的解决方案(可使用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

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

答案 7 :(得分:0)

根据我的理解,这是一个非常简单的解决方案,如果这会分散您的注意力,则表示歉意。

这里需要完成3个主要步骤,

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

1。命令行选项

ansible-playbook -l“主机名”

请注意,主机名是节点的$ 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 选项

在特定节点上执行任务的方式