Lancer un livre de lecture accessible à L'aide de L'API Python
Comment puis-je lancer un playbook en script python? Quel est l'équivalent de ce qui suit en utilisant un module possible en python:
ansible -i hosts dbservers -m setup
ansible-playbook -i hosts -vvvv -k site.yml
je regardais leur documentation dans http://docs.ansible.com/developing_api.html mais ils ont des exemples très limités.
3 réponses
avis de dépréciation: ce post ne fonctionne pas dans la mesure du possible 2. L'API a été changée.
ceci est couvert dans la documentation possible sous" API Python."
par exemple, ansible -i hosts dbservers -m setup
est mis en œuvre via:
import ansible.runner
runner = ansible.runner.Runner(
module_name='setup',
module_args='',
pattern='dbservers',
)
dbservers_get_facts = runner.run()
il y a un tas de paramètres non documentés dans la méthode __init__
de Runner (de ansible.runner
). Il y a aussi beaucoup inline , mais j'ai inclus certains des paramètres dans ce message comme une supposition à ce que l'on recherche précisément.
class Runner(object):
''' core API interface to ansible '''
# see bin/ansible for how this is used...
def __init__(self,
host_list=C.DEFAULT_HOST_LIST, # ex: /etc/ansible/hosts, legacy usage
module_path=None, # ex: /usr/share/ansible
module_name=C.DEFAULT_MODULE_NAME, # ex: copy
module_args=C.DEFAULT_MODULE_ARGS, # ex: "src=/tmp/a dest=/tmp/b"
...
pattern=C.DEFAULT_PATTERN, # which hosts? ex: 'all', 'acme.example.org'
remote_user=C.DEFAULT_REMOTE_USER, # ex: 'username'
remote_pass=C.DEFAULT_REMOTE_PASS, # ex: 'password123' or None if using key
remote_port=None, # if SSH on different ports
private_key_file=C.DEFAULT_PRIVATE_KEY_FILE, # if not using keys/passwords
sudo_pass=C.DEFAULT_SUDO_PASS, # ex: 'password123' or None
...
sudo=False, # whether to run sudo or not
sudo_user=C.DEFAULT_SUDO_USER, # ex: 'root'
module_vars=None, # a playbooks internals thing
play_vars=None, #
play_file_vars=None, #
role_vars=None, #
role_params=None, #
default_vars=None, #
extra_vars=None, # extra vars specified with he playbook(s)
is_playbook=False, # running from playbook or not?
inventory=None, # reference to Inventory object
...
su=False, # Are we running our command via su?
su_user=None, # User to su to when running command, ex: 'root'
su_pass=C.DEFAULT_SU_PASS,
vault_pass=None,
...
):
par exemple, la commande ci-dessus qui spécifie un utilisateur sudo et pass serait:
runner = ansible.runner.Runner(
module_name='setup',
module_args='',
pattern='dbservers',
remote_user='some_user'
remote_pass='some_pass_or_python_expression_that_returns_a_string'
)
pour les playbooks, regardez dans playbook.PlayBook , qui prend un ensemble similaire de initialisateurs:
class PlayBook(object):
'''
runs an ansible playbook, given as a datastructure or YAML filename.
...
'''
# *****************************************************
def __init__(self,
playbook = None,
host_list = C.DEFAULT_HOST_LIST,
module_path = None,
....
et peut être exécuté avec les .run()
la méthode. par exemple:
from ansible.playbook import PlayBook
pb = PlayBook(playbook='/path/to/book.yml, --other initializers--)
pb.run()
une utilisation plus robuste peut être trouvée dans le ansible-playbook
fichier .
pour autant que je sache, la traduction de playbooks en modules Python est un peu plus impliquée, mais la documentation listée ci-dessus devrait vous couvrir et vous pouvez réutiliser L'analyseur YAML intégré dans Ansible pour convertir les playbooks en variables.
j'ai répondu à la question ici Afficher ceci ici cause l'affichage de liens est déconseillé dans la communauté. Espérons que cela aide.
la documentation est étonnamment insuffisante et vous devrez commencer ici
cela étant dit, Voici un script rapide que j'ai piraté ensemble qui parvient à lancer un playbook.
#!/usr/bin/env python
import os
import sys
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars.manager import VariableManager
from ansible.inventory.manager import Inventory
from ansible.executor.playbook_executor import PlaybookExecutor
loader = DataLoader()
inventory = Inventory(loader=loader, sources='/home/slotlocker/hosts2')
variable_manager = VariableManager(loader=loader, inventory=inventory)
playbook_path = '/home/slotlocker/ls.yml'
if not os.path.exists(playbook_path):
print '[INFO] The playbook does not exist'
sys.exit()
Options = namedtuple('Options', ['listtags', 'listtasks', 'listhosts', 'syntax', 'connection','module_path', 'forks', 'remote_user', 'private_key_file', 'ssh_common_args', 'ssh_extra_args', 'sftp_extra_args', 'scp_extra_args', 'become', 'become_method', 'become_user', 'verbosity', 'check','diff'])
options = Options(listtags=False, listtasks=False, listhosts=False, syntax=False, connection='ssh', module_path=None, forks=100, remote_user='slotlocker', private_key_file=None, ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None, become=True, become_method='sudo', become_user='root', verbosity=None, check=False, diff=False)
variable_manager.extra_vars = {'hosts': 'mywebserver'} # This can accomodate various other command line arguments.`
passwords = {}
pbex = PlaybookExecutor(playbooks=[playbook_path], inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=passwords)
results = pbex.run()
vous regardez quelque chose qui n'est pas officiellement soutenu ou recommandé donc peu de documentation à avoir.
cela dit, si vous voulez vraiment suivre ce cours, je commencerais par ouvrir le script ansible-playbook dans la bin et la rétroingénierie ce que vous voulez faire.