2014-12-22 23:01:35 -06:00
|
|
|
from bootstrapvz.base import Task
|
2017-07-14 18:26:52 +02:00
|
|
|
from bootstrapvz.common.tasks import host
|
2014-12-22 23:01:35 -06:00
|
|
|
from bootstrapvz.common import phases
|
2017-07-14 18:26:25 +02:00
|
|
|
from bootstrapvz.common.tools import rel_path
|
2014-12-22 23:01:35 -06:00
|
|
|
import os
|
|
|
|
|
|
|
|
|
2017-07-14 18:26:52 +02:00
|
|
|
class AddRequiredCommands(Task):
|
|
|
|
description = 'Adding commands required for provisioning with ansible'
|
|
|
|
phase = phases.validation
|
|
|
|
successors = [host.CheckExternalCommands]
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
|
|
|
info.host_dependencies['ansible'] = 'ansible'
|
|
|
|
|
2014-12-22 23:01:35 -06:00
|
|
|
class CheckPlaybookPath(Task):
|
|
|
|
description = 'Checking whether the playbook path exist'
|
2016-09-12 00:52:10 +02:00
|
|
|
phase = phases.validation
|
2014-12-22 23:01:35 -06:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
|
|
|
from bootstrapvz.common.exceptions import TaskError
|
2017-07-14 18:26:25 +02:00
|
|
|
playbook = rel_path(info.manifest.path, info.manifest.plugins['ansible']['playbook'])
|
2014-12-22 23:01:35 -06:00
|
|
|
if not os.path.exists(playbook):
|
|
|
|
msg = 'The playbook file {playbook} does not exist.'.format(playbook=playbook)
|
|
|
|
raise TaskError(msg)
|
|
|
|
if not os.path.isfile(playbook):
|
|
|
|
msg = 'The playbook path {playbook} does not point to a file.'.format(playbook=playbook)
|
|
|
|
raise TaskError(msg)
|
|
|
|
|
|
|
|
|
|
|
|
class AddPackages(Task):
|
|
|
|
description = 'Making sure python is installed'
|
|
|
|
phase = phases.preparation
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
|
|
|
info.packages.add('python')
|
|
|
|
|
|
|
|
|
|
|
|
class RunAnsiblePlaybook(Task):
|
2017-07-14 18:26:25 +02:00
|
|
|
description = 'Running ansible playbook'
|
2015-05-02 12:29:55 +02:00
|
|
|
phase = phases.user_modification
|
2014-12-22 23:01:35 -06:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
|
|
|
from bootstrapvz.common.tools import log_check_call
|
|
|
|
|
|
|
|
# Extract playbook and directory
|
2017-07-14 18:26:25 +02:00
|
|
|
playbook = rel_path(info.manifest.path, info.manifest.plugins['ansible']['playbook'])
|
2014-12-22 23:01:35 -06:00
|
|
|
|
|
|
|
# Check for hosts
|
|
|
|
hosts = None
|
|
|
|
if 'hosts' in info.manifest.plugins['ansible']:
|
|
|
|
hosts = info.manifest.plugins['ansible']['hosts']
|
|
|
|
|
|
|
|
# Check for extra vars
|
|
|
|
extra_vars = None
|
|
|
|
if 'extra_vars' in info.manifest.plugins['ansible']:
|
|
|
|
extra_vars = info.manifest.plugins['ansible']['extra_vars']
|
|
|
|
|
|
|
|
tags = None
|
|
|
|
if 'tags' in info.manifest.plugins['ansible']:
|
|
|
|
tags = info.manifest.plugins['ansible']['tags']
|
|
|
|
|
|
|
|
skip_tags = None
|
|
|
|
if 'skip_tags' in info.manifest.plugins['ansible']:
|
|
|
|
skip_tags = info.manifest.plugins['ansible']['skip_tags']
|
|
|
|
|
|
|
|
opt_flags = None
|
|
|
|
if 'opt_flags' in info.manifest.plugins['ansible']:
|
|
|
|
opt_flags = info.manifest.plugins['ansible']['opt_flags']
|
|
|
|
|
|
|
|
# build the inventory file
|
|
|
|
inventory = os.path.join(info.root, 'tmp/bootstrap-inventory')
|
|
|
|
with open(inventory, 'w') as handle:
|
|
|
|
conn = '{} ansible_connection=chroot'.format(info.root)
|
2016-06-04 10:04:23 +02:00
|
|
|
content = ""
|
2014-12-22 23:01:35 -06:00
|
|
|
|
2016-06-04 10:04:23 +02:00
|
|
|
if hosts:
|
2014-12-22 23:01:35 -06:00
|
|
|
for host in hosts:
|
|
|
|
content += '[{}]\n{}\n'.format(host, conn)
|
2016-06-04 10:04:23 +02:00
|
|
|
else:
|
|
|
|
content = conn
|
2014-12-22 23:01:35 -06:00
|
|
|
|
|
|
|
handle.write(content)
|
|
|
|
|
|
|
|
# build the ansible command
|
2017-07-14 18:26:25 +02:00
|
|
|
cmd = ['ansible-playbook', '-i', inventory, playbook]
|
2014-12-22 23:01:35 -06:00
|
|
|
if extra_vars:
|
|
|
|
tmp_cmd = ['--extra-vars', '\"{}\"'.format(extra_vars)]
|
|
|
|
cmd.extend(tmp_cmd)
|
|
|
|
if tags:
|
|
|
|
tmp_cmd = ['--tags={}'.format(tags)]
|
|
|
|
cmd.extend(tmp_cmd)
|
|
|
|
if skip_tags:
|
|
|
|
tmp_cmd = ['--skip_tags={}'.format(skip_tags)]
|
|
|
|
cmd.extend(tmp_cmd)
|
|
|
|
if opt_flags:
|
|
|
|
# Should probably do proper validation on these, but I don't think it should be used very often.
|
|
|
|
cmd.extend(opt_flags)
|
|
|
|
|
|
|
|
# Run and remove the inventory file
|
2017-07-14 18:26:25 +02:00
|
|
|
log_check_call(cmd)
|
2014-12-22 23:01:35 -06:00
|
|
|
os.remove(inventory)
|