我想沒有通過(ANSIBLE_HOST)指定清單文件,但只是通過運行Ansible在Python:如何直接運行Ansible而不直接指定庫存,而是直接指定主機?
ansible.run.Runner(
module_name='ping',
host='www.google.com'
)
其實我可以在面料做到這一點很容易,但只是不知道如何在Python做到這一點。另一方面,用於python的Ansible API的文檔並不完整。
我想沒有通過(ANSIBLE_HOST)指定清單文件,但只是通過運行Ansible在Python:如何直接運行Ansible而不直接指定庫存,而是直接指定主機?
ansible.run.Runner(
module_name='ping',
host='www.google.com'
)
其實我可以在面料做到這一點很容易,但只是不知道如何在Python做到這一點。另一方面,用於python的Ansible API的文檔並不完整。
這不是一個完整的答案,但在this discussion thread中有一些關於此主題的討論。在該線程的第一篇文章的末尾,有人建議爲ansible-playbook創建一個包裝bash腳本,這有點破解但是可行。
我一直在考慮的其他事情是使用'ansible-pull'和創建一個安全庫存插件。我也有興趣找到這個問題的答案,我會繼續更新這個答案,因爲我發現更多的信息。
令人驚訝地,關鍵是要追加,
前述可以是一個主機名或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()
無論是在主機成爲你的庫存,你可以用模式搜索它(或做「全」)。
我還需要驅動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()
我知道這個問題是真的老了,但是覺得下面這個小技巧誰需要幫助,這個未來的用戶有所幫助:
ansible-playbook -i '10.254.3.133,' site.yml
,如果你對本地主機上運行:
ansible-playbook -i 'localhost,' --connection=local site.yml
訣竅是,經過IP地址/ DNS名稱,把逗號引號內,並要求「hosts: all
'在你的劇本中。
希望這會有所幫助。
爲了什麼是值得的,報價是一個沒有操作在這裏。如果你使用localhost或localhost,在這兩種情況下'ansible-playbook'都會從shell收到相同的參數。而'localhost','會以同樣的方式評估(這裏的關鍵是在shell將它們傳遞給你的命令之前,由shell解釋引號)。 – larsks
這是可行的,但爲什麼以Merlin的鬍子的名義,這是可接受的行爲?人們究竟如何知道這一點?我把我的頭髮拔出來尋找修復。 – ffledgling
IPv6與Ansible> = 1.3一起使用。 – trkoch
在Ansible 1.9.1中,當您調用ansible-playbook時,從命令行中刪除「all」,但將其保留在playbook.yml中。這是正確的答案「ansible-playbook -i example.com,playbook.yml」 – PinoSan
然後,我應該在劇本中設置爲「主機」,以便它可以與任何服務器一起使用? – azmeuk