(ANSIBLE_HOST)를 통해 인벤토리 파일을 지정하지 않고 Python에서 Ansible을 실행하고 싶습니다.
ansible.run.Runner(
module_name='ping',
host='www.google.com'
)
실제로 패브릭에서 쉽게 할 수 있지만 파이썬에서 어떻게할지 궁금합니다. 반면에 Python 용 Ansible API 문서는 실제로 완전하지 않습니다.
답변:
놀랍게도 트릭은 ,
# 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 주소 일 수 있습니다.
이 질문이 정말 오래되었다는 것을 알고 있지만이 작은 트릭이 도움이 필요한 미래의 사용자에게 도움이 될 것이라고 생각합니다.
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
쉘에서 같은 주장을 받게됩니다. 그리고 'localhost',
같은 방식으로 평가할 것입니다 (여기서 핵심은 따옴표가 명령에 인수를 전달하기 전에 쉘에 의해 해석된다는 것입니다).
hosts: all
한 번에 하나의 호스트에서만 실행하려고 할 때 플레이 북을 사용하는 것이 약간 위험하다고 생각합니다 . 동료는 -i
. 이것은 좋은 해결책이지만 더 안전한 것을 계속 찾고 있습니다. 그럼에도 불구하고 ... 검색
다음과 같이 할 수 있습니다.
hosts = ["webserver1","webserver2"]
webInventory = ansible.inventory.Inventory(hosts)
webPing = ansible.runner.Runner(
pattern='webserver*',
module_name='ping',
inventory = webInventory
).run()
호스트에있는 것이 무엇이든 인벤토리가되고 패턴으로 검색 할 수 있습니다 (또는 "모두"수행).
제 경우에는 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
이것은 호스트를 프로비저닝해야하고 인벤토리에 추가하기를 원치 않거나 필요로하지 않는 특별한 사용 사례입니다.
또한 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()
내 이해에 따라 매우 간단한 해결책은 산만하다면 사과하십시오.
여기에 3 가지 주요 단계가 있습니다.
ansible-playbook -l "host-name"<playbook.yml>
host-name은 노드의 $ hostname입니다.
- hosts: webservers
tasks:
- debug:
msg: "{{ ansible_ssh_host }}"
when: inventory_hostname in groups['webservers']
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 옵션을 사용하여 특정 노드에서 작업을 실행할 수있는 방법입니다.