Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Ansible 2.0 Python API to run a Playbook?

I'm trying to write a python script which will call existing Ansible playbooks as it goes (because I want to loop over a list of plays while looping over a list of variables).

This post explains it very well, for ansible pre-2.0: Running ansible-playbook using Python API

This doc explains it very well if you're writing a new playbook in your script: http://docs.ansible.com/ansible/developing_api.html

But I don't see how to call an existing playbook using Python API 2.0, and ansible.runner no longer works.

Help me, Stackoverflow-Wan Kenobi. You're my only hope.

like image 953
ddro Avatar asked Feb 12 '16 16:02

ddro


People also ask

Can I use Ansible with Python?

You can use the Ansible Python API to control nodes, you can extend Ansible to respond to various Python events, you can write plugins, and you can plug in inventory data from external data sources. This document gives a basic overview and examples of the Ansible execution and playbook API.

What is an Ansible playbook?

A playbook is composed of one or more ‘plays’ in an ordered list. The terms ‘playbook’ and ‘play’ are sports analogies. Each play executes part of the overall goal of the playbook, running one or more tasks. Each task calls an Ansible module. A playbook runs in order from top to bottom. Within each play, tasks also run in order from top to bottom.

How do I check if an ansible script is valid?

The ansible-playbook command offers several options for verification, including --check, --diff, --list-hosts, list-tasks, and --syntax-check. The Tools for Validating Playbooks describes other tools for validating and testing playbooks. You can use ansible-lint for detailed, Ansible-specific feedback on your playbooks before you execute them.

How do I execute Ansible tasks more than once?

If you need to execute a task with Ansible more than once, write a playbook and put it under source control. Then you can use the playbook to push out new configuration or confirm the configuration of remote systems.


1 Answers

The documentation is surprisingly lacking and you'll have to get started here

That being said, here is a quick script I hacked together that manages to run a playbook.

#!/usr/bin/env python

import os
import sys
from collections import namedtuple

from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
from ansible.executor.playbook_executor import PlaybookExecutor

variable_manager = VariableManager()
loader = DataLoader()

inventory = Inventory(loader=loader, variable_manager=variable_manager,  host_list='/home/slotlocker/hosts2')
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'])
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=None, become_user='root', verbosity=None, check=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()
like image 94
Phani Kumar Avatar answered Sep 27 '22 22:09

Phani Kumar