2014-12-21 17 views

risposta

31

Avviso di disdetta: questo post non funziona da ansibile 2. L'API è stata modificata.

Questo è incluso in Ansible documentation in "API Python".

Ad esempio, ansible -i hosts dbservers -m setup è attuato attraverso:

import ansible.runner 

runner = ansible.runner.Runner(
    module_name='setup', 
    module_args='', 
    pattern='dbservers', 
) 
dbservers_get_facts = runner.run() 

Ci sono una serie di parametri non documentato nel metodo __init__ di Runner (da ansible.runner). C'è lo too many to list inline, ma ho incluso alcuni dei parametri in questo post come supposizione di ciò che stai cercando in particolare.

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, 
     ... 
     ): 

Ad esempio, il comando precedente che specifica un utente sudo e passo sarebbe:

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' 
) 

Per playbooks, esaminare playbook.PlayBook, che richiede una serie simile di initializers:

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, 
     .... 

e può essere eseguito con il metodo .run(). es .:

from ansible.playbook import PlayBook 
pb = PlayBook(playbook='/path/to/book.yml, --other initializers--) 
pb.run() 

utilizzo più robusta può essere trovato nel ansible-playbook file.

Per quanto ne so, traducendo Playbooks ai moduli Python è un po 'più complesso, ma la documentazione di cui sopra dovrebbe ottenere coperto e si può riutilizzare il parser YAML integrato in Ansible per convertire playbooks alle variabili.

+0

Questo non sembra rispondere a come eseguire un playbook, ma piuttosto un singolo compito. Esiste anche una classe 'ansible.playbook.Playbook' con un metodo' run' che penso che l'OP si stia chiedendo - So che è quello che sto cercando di trovare: D – fideloper

+0

ansible.playbook.Playbook chiama a runner per esecuzione (vedi 'is_playbook' in ansible.runner), ma buon punto. aggiornamento della risposta ora. –

+0

Grazie mille! Ho anche trovato un buon esempio in (dove altro ?!) il repository GitHub con il loro [comando ansible-playbook] (https://github.com/ansible/ansible/blob/devel/bin/ansible-playbook#L186) - - (modifica: whoops, l'hai già indicato: D) – fideloper

-7

Stai guardando qualcosa che non è ufficialmente supportato o consigliato quindi poca documentazione da avere.

Detto questo, se si vuole davvero seguire questo corso, inizierei con l'apertura dello script ansible-playbook in bin e il reverse engineering su ciò che si vuole fare.

+2

Questo è inaccurato ed è coperto dalla [documentazione ufficiale] (http://docs.ansible.com/developing_api.html). Il fatto che ci sia poca documentazione è una questione a parte. –

+1

tristan: Non sono sicuro di cosa stai guardando, perché al momento non esiste una documentazione ufficiale sull'esecuzione dei playbook tramite l'API Python. – Dolph

+0

@Dolph Fare clic su [collegamento nel mio commento] (http://docs.ansible.com/developing_api.html) - il 'ansible.runner' è il punto di ingresso per l'esecuzione di playbook (vedere il commento di" The Python API è molto potente, ed è il modo in cui sono implementate la CLI e il playbook ansible. "). E sì, la documentazione si legge meglio per le persone che hanno già lavorato nella base di codice di Ansible, ma ciò non rende corretta questa risposta. –

9

Ho risposto alla domanda here Pubblicando questo qui perché i collegamenti di pubblicazione sono scoraggiati nella comunità. Spero che sia d'aiuto.

La documentazione è sorprendentemente carente e si dovrà iniziare here

Detto questo, ecco un breve script ho messo insieme che riesce a eseguire 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() 
+0

Come otteniamo tutti i vars di gruppo rilevanti per il playbook? –

+0

Ciao grazie per la tua risposta, mi ha aiutato molto, per tutti quelli che usano paramiko_ssh, per favore, devi avere ** 'ssh_common_args = ''' e 'ssh_extra_args = ''' non None **, altrimenti otterrai un eccezione: _TypeError: item sequence: stringa attesa, NoneType found_ mi è costato un po 'di tempo e ho fatto il surfing del codice per chiarirlo. –

Problemi correlati