Skip to content

Instantly share code, notes, and snippets.

@JonasPf
Created July 18, 2017 16:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JonasPf/45b6e9ca70ee7b62259d069a2e3c263e to your computer and use it in GitHub Desktop.
Save JonasPf/45b6e9ca70ee7b62259d069a2e3c263e to your computer and use it in GitHub Desktop.
import json
import subprocess
import os
from collections import namedtuple
from tempfile import NamedTemporaryFile
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase
from ansible.executor import playbook_executor
class Options(object):
"""
Options class to replace Ansible OptParser
Mostly copied from: https://serversforhackers.com/c/running-ansible-2-programmatically
"""
def __init__(self, verbosity=0, inventory=None, listhosts=None, extra_vars=None,
forks=5, ask_vault_pass=False, vault_password_files=None, new_vault_password_file=None,
output_file=None, tags=None, skip_tags=None, tree=None, ask_sudo_pass=False, ask_su_pass=False,
sudo=False, sudo_user=None, become=False, become_method='sudo', become_user='root', become_ask_pass=False,
ask_pass=False, private_key_file=None, remote_user=None, connection='smart', timeout=10, ssh_common_args='',
sftp_extra_args='', scp_extra_args='', ssh_extra_args='', start_at_task=None, su=False, su_user=None, subset=None, check=False,
syntax=None, diff=False, force_handlers=False, flush_cache=None, listtasks=None, listtags=None, module_path=None):
self.verbosity = verbosity
self.inventory = inventory
self.listhosts = listhosts
self.extra_vars = extra_vars
self.forks = forks
self.ask_vault_pass = ask_vault_pass
self.vault_password_files = vault_password_files
self.new_vault_password_file = new_vault_password_file
self.output_file = output_file
self.tags = tags
self.skip_tags = skip_tags
self.tree = tree
self.ask_sudo_pass = ask_sudo_pass
self.ask_su_pass = ask_su_pass
self.sudo = sudo
self.sudo_user = sudo_user
self.become = become
self.become_method = become_method
self.become_user = become_user
self.become_ask_pass = become_ask_pass
self.ask_pass = ask_pass
self.private_key_file = private_key_file
self.remote_user = remote_user
self.connection = connection
self.timeout = timeout
self.ssh_common_args = ssh_common_args
self.sftp_extra_args = sftp_extra_args
self.scp_extra_args = scp_extra_args
self.ssh_extra_args = ssh_extra_args
self.start_at_task = start_at_task
self.su = su
self.su_user = su_user
self.subset = subset
self.check = check
self.syntax = syntax
self.diff = diff
self.force_handlers = force_handlers
self.flush_cache = flush_cache
self.listtasks = listtasks
self.listtags = listtags
self.module_path = module_path
def _launch_ansible(playbook, private_key_file, hosts, ansible_vars):
# Initialize needed objects
host_list = ",".join(hosts) + "," # Needs a trailing comma
extra_vars = ansible_vars
variable_manager = VariableManager()
loader = DataLoader()
options = Options(private_key_file=private_key_file, inventory=host_list)
options.extra_vars = [unicode(json.dumps(extra_vars))]
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=host_list)
variable_manager.set_inventory(inventory)
variable_manager.extra_vars = extra_vars
passwords = {}
# Playbook to run. Assumes it is local to this python file
playbook_path = os.path.join(os.path.dirname(__file__), playbook)
executor = playbook_executor.PlaybookExecutor(
playbooks=[playbook_path],
inventory=inventory,
variable_manager=variable_manager,
loader=loader,
options=options,
passwords=passwords)
executor.run()
_launch_ansible('deploy-geth.yml', '/home/jonas/.ssh/id_rsa', ['40.71.39.192'], {"network_id": 1234})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment