Как запустить 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
Это особый случай, когда мне нужно подготовить хост, и я не хочу/не нужно добавлять его в инвентарь.