Як запустити Ansible, не вказавши інвентар, але безпосередньо хоста?


79

Я хочу запустити Ansible в Python, не вказуючи файл інвентаризації через (ANSIBLE_HOST), а просто за допомогою:

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

Я дійсно можу це зробити в тканині, але просто цікаво, як це зробити в Python. З іншого боку, документація API Ansible для python насправді не є повною.

Відповіді:


175

Дивно, але фокус у тому, щоб додати a ,

# 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
У Ansible 1.9.1, коли ви викликаєте ansible-playbook, видаліть "усі" з командного рядка, але залиште це в playbook.yml. Це правильна відповідь "ansible-playbook -i example.com, playbook.yml"
PinoSan

1
Тоді, що я повинен встановити як "хост" у плейбуку, щоб він працював з будь-яким сервером?
azmeuk

2
@azmeuk в ігровій книзі, "hosts: all" повинен працювати нормально. Я зазвичай це роблю, а потім використовую -i або --limit у командному рядку, щоб вказати хости.
Дейв

що, якщо книжка ігор має два різних етапи з підключенням до різних хостів / ips? Примітка. Я не маю на увазі запускати один розділ знову на декількох IP-адресах, а запускати 2 різних розділи проти різних IP-адрес?
openCivilisation

53

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

ansible-playbook -i 10.254.3.133, site.yml

якщо ви працюєте на місцевому хості:

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

Фокус у тому, що після ip-адреси / dns-імені, поставте кому у лапки і потрібно ' hosts: all' у вашій книзі ігор.

Сподіваюся, це допоможе.


6
Для чого це варте, тут котирування не відповідають. Якщо ви використовуєте 'localhost,'або localhost,, в обох випадках ansible-playbookотримаєте однаковий аргумент від оболонки. І 'localhost',оцінював би так само (ключовим тут є те, що лапки інтерпретуються оболонкою до того, як вона передає аргументи вашій команді).
larsks

7
Це працює, але чому в ім'я бороди Мерліна така прийнятна поведінка з боку ансибла ?! Як саме люди повинні це знати? Я вирвав волосся, шукаючи згадане виправлення.
ffledgling

1
Я знаю, що запізнююсь, але я просто наткнувся на ваш коментар і хотів би дати тут якусь інформацію. Причина, по якій це працює, полягає в тому, що прапор -i вимагає, щоб ви передали дійсну ціль інвентаризації, яка може бути файлом INI, виконуваним файлом інвентаризації Ansible чи будь-яким довільним рядком, який може оброблятися плагіном Ansible inventory. Існує плагін Ansible з назвою "host_list", який бере списки хостів, розділених комами, і використовує цю інформацію для створення польового інвентаря, що дозволяє виконувати спеціальні команди на невідомих хостах. Цей плагін включений за замовчуванням до Ansible.
Héctor Luaces Novo

Я вважаю, що трохи ризиковано мати книгу ігор, hosts: allколи я маю намір запускати її лише на одному хості одночасно. Співробітник може запустити ігрову книгу без -i. Це гарне рішення, але я продовжую шукати щось більш безпечне. Все ще шукаю ...
Донн Лі

7

Ви можете зробити це за допомогою:

hosts = ["webserver1","webserver2"]

webInventory = ansible.inventory.Inventory(hosts)

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

Все, що є в хостах, стає вашим інвентарем, і ви можете шукати його з малюнком (або робити "все").


чи знаєте ви, як запустити модуль у контексті local_action, наприклад модулі ec2 слід викликати проти localhost (127.0.0.1) та як local_action. подяка
kamiseq

нічого, я відповідаю на власне запитання :-) runner = ansible.Runner (module_name = "ec2_group", complex_args = {}, forks = paralel, # private_key_file = "~ / .ssh / office.pem", inventory = Inventory ([ "127.0.0.1"]), transport = "local") return runner.run ()
kamiseq

6

У моєму випадку я не хотів мати 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

Це особливий випадок використання, коли мені потрібно надати хоста, і я не хочу / потребую додавати його до інвентаризації.


1

Мені також потрібно було керувати API Ansible Python і радше передавати хости як аргументи, а не вести інвентаризацію. Я використав тимчасовий файл, щоб обійти вимогу 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()

Чи можете ви також навести приклад того, як ви ним користуєтесь
Арбаб Назар

0

Це не повна відповідь, але в цій дискусійній темі є деяке обговорення цієї теми . В кінці першого допису в цій темі пропонується створити сценарій Bash-обгортки для ansible-playbook, який є трохи хакерським, але працездатним.

Інші речі, які я розглядав, це використання 'ansible-pull' та створення плагіна ansible inventory. Мені також цікаво знайти відповідь на це запитання, і я продовжуватиму оновлювати цю відповідь, коли знаходжу більше інформації.


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 варіанти

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.