Как запустить Ansible без указания инвентаря, но хост напрямую?

Я хочу запустить Ansible в Python без указания файла инвентаризации через (ANSIBLE_HOST), но просто:

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

Я могу на самом деле сделать это в ткани легко, но просто интересно, как это сделать в Python. С другой стороны, документация Ansible API для python на самом деле не завершена.

Ответ 1

Удивительно, но трюк заключается в том, чтобы добавить ,

# 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.

Ответ 2

Я знаю, что этот вопрос действительно старый, но думаю, что этот маленький трюк может пригодиться для будущих пользователей, которым нужна помощь для этого:

ansible-playbook -i 10.254.3.133, site.yml

если вы запускаете для локального хоста:

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

Хитрость заключается в том, что после ip-адреса/имени DNS вставьте запятую в кавычки и требуйте " hosts: all " в вашей книге игр.

Надеюсь, это поможет.

Ответ 3

Вы можете сделать это с помощью

hosts = ["webserver1","webserver2"]

webInventory = ansible.inventory.Inventory(hosts)

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

Все, что находится на хостах, становится вашим инвентарем, и вы можете искать его с помощью шаблона (или делать все).

Ответ 4

Мне также нужно было управлять 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()

Ответ 5

Это не полный ответ, но некоторые обсуждения этой темы в этот дискуссионный поток. В конце первого сообщения в этом потоке предлагается создать обертку bash script для прослушиваемой книги, которая немного взломана, но работоспособна.

Другими вещами, которые я рассматривал, является использование "незамысловатого" и создание плагина с незаменимым инвентарем. Я также заинтересован в поиске ответа на этот вопрос, и я буду продолжать обновлять этот ответ, поскольку я нахожу дополнительную информацию.

Ответ 6

Кажется, нет прямого способа дать образец. Это мой взлом, чтобы решить это.

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

Ответ 7

В моем случае я не хотел иметь hosts: all в моей -i 10.254.3.133, потому что было бы плохо, если бы кто-то запустил -i 10.254.3.133, и забыл включить -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

Это особый случай, когда мне нужно подготовить хост, и я не хочу/не нужно добавлять его в инвентарь.