2013-06-19 3 views
51

私は(ANSIBLE_HOST)を介してインベントリファイルを指定せずにPythonでAnsibleを実行したいが、ちょうどによって:在庫を指定するのではなく、ホストを直接指定する必要はありませんか?

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

私は実際には簡単に生地でこれを行うが、単にPythonでこれを行う方法を疑問に思うことができます。一方、PythonのAnatile APIのドキュメントは実際には完全ではありません。

答えて

0

これは完全な答えではありませんが、このトピックに関する議論はthis discussion threadです。そのスレッドの最初の投稿の終わりに、潜在的なプレイブック用のラッパーbashスクリプトを作成するよう提案されています。これは少しハックですが実行可能です。

私が検討してきたことの他に、 '不可解なプル'の使用と不可能なインベントリプラグインの作成があります。私はこの質問に対する答えを見つけることにも興味があります。詳細については、この回答を更新していきます。

112

驚くべきことに、トリックは、ホスト名またはIPv4/v6のアドレスのいずれかとすることができる,先行,

# 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 

ホストパラメータを付加することです。 (「すべて」または実行)のホストであるどのような

hosts = ["webserver1","webserver2"] 

webInventory = ansible.inventory.Inventory(hosts) 

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

はあなたの在庫になり、あなたはパターンとそれを検索することができます。

+2

IPv6はAnsible> = 1.3で動作します。 – trkoch

+0

不可能な1.9.1では、あなたが不可能なプレイブックを呼び出すと、コマンドラインから "all"を削除しますが、それをplaybook.ymlに残してください。これは正しい答えです "ansible-playbook -i example.com、playbook.yml" – PinoSan

+0

次に、プレイノートに "ホスト"として設定する必要がありますので、どのサーバーでも動作しますか?プレイズブックで@ azmeuk – azmeuk

6

あなたはでこれを行うことができます。

+0

local_actionコンテキストでモジュールを実行する方法を知っていますか?例えばec2モジュールは、localhost(127.0.0.1)とlocal_actionとして再度呼び出す必要があります。ありがとう – kamiseq

+0

私は自分自身の質問に答えます:-) ランナー=ランナー( モジュール名= "ec2_group"、 complex_args = {}、 フォーク= paralel、 #private_key_file = "の〜/ .ssh/office.pem"、 インベントリ=インベントリ([ "127.0.0.1"])、 ) return runner.run() – kamiseq

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() 
25

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

ansible-playbook -i '10.254.3.133,' site.yml 

あなたがローカルホストに対して実行する場合:

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

トリックは、IPアドレス/ DNS名の後に、引用符の内側にコンマを入れていることであると 'が必要です'と入力してください。

希望すると、これが役立ちます。

+5

価値があるのは、引用符はここではノーオペレーションです。 '' localhost ''や '' localhost ''を使うと、どちらの場合でも 'ansible-playbook'はシェルから同じ引数を受け取ります。 '' localhost ''は同じように評価されます(ここで重要な点は、シェルがコマンドに引数を渡す前に引用符を解釈することです)。 – larsks

+4

これはうまくいきますが、マーリンのひげの名前で、なぜこの責任ある側の行動が容認されるのですか?どのように人々はこれを知っていると予想されますか?私は修正を探して私の髪を裂いた。 – ffledgling

関連する問題