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.

20
demandé sur helloworld2013 2014-12-21 17:00:08

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.

32
répondu ImportanceOfBeingErnest 2017-04-21 16:35:19

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()
10
répondu Phani Kumar 2017-10-31 08:29:59

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.

-5
répondu tima 2014-12-22 06:46:12