web-dev-qa-db-ja.com

インベントリではなくホストを直接指定せずにAnsibleを実行する方法は?

AnsibleをPythonで(ANSIBLE_Host)を介してインベントリファイルを指定せずに、次のように実行したいだけです。

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

私は実際にファブリックでこれを簡単に行うことができますが、Pythonでこれを行う方法を疑問に思っています。一方、pythonのAnsible APIのドキュメントは完全ではありません。

64
Ngoc Tran

驚くべきことに、トリックは,を追加することです

# 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

,の前のHostパラメーターは、ホスト名またはIPv4/v6アドレスのいずれかです。

144
trkoch

私はこの質問が本当に古いことを知っていますが、この小さなトリックはこれについて助けを必要とする将来のユーザーに役立つかもしれないと思います:

ansible-playbook -i 10.254.3.133, site.yml

ローカルホストで実行する場合:

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

トリックは、IPアドレス/ DNS名の後に、引用符の中にコンマを入れて、 'hosts: all 'あなたのプレイブックに。

これが役立つことを願っています。

36
Arbab Nazar

これを行うには:

hosts = ["webserver1","webserver2"]

webInventory = ansible.inventory.Inventory(hosts)

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

ホストにあるものはすべてインベントリになり、パターンで検索できます(または「すべて」を実行できます)。

6
seumasmac

また、 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()
1
billwanjohi

私の場合、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

これは、ホストをプロビジョニングする必要があり、それをインベントリに追加したくない/必要ない場合の特別なユースケースです。

0
Donn Lee

これは完全な答えではありませんが、このトピックに関する議論は このディスカッションスレッド にあります。そのスレッドの最初の投稿の終わりに、ansible-playbookのラッパーbashスクリプトを作成する提案があります。これは、ちょっとしたハックですが実行可能です。

私が検討してきた他のことは、「ansible-pull」の使用と、ansible Inventoryプラグインの作成です。また、この質問に対する答えを見つけることに興味があります。詳細がわかり次第、この答えを更新していきます。

0
bnsmith

パターンを与える直接的な方法はないようです。これはそれを解決するための私のハックです。

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