mirror of
https://github.com/kevingruesser/bootstrap-vz.git
synced 2025-08-24 15:36:27 +00:00

NOTE: I'm not doing any validation on the opt_flags param and I don't recommend using for more then adding a -vvvv. Also, I'm purposely excluding the vault flags (which also pretty commonly used) because you shouldn't be baking private keys and certs into your images. Instead, just avoid running the vault specific code or use the opt_flags if absolutely necessary.
98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
from bootstrapvz.base import Task
|
|
from bootstrapvz.common import phases
|
|
from bootstrapvz.common.tasks import apt
|
|
import os
|
|
|
|
|
|
class CheckPlaybookPath(Task):
|
|
description = 'Checking whether the playbook path exist'
|
|
phase = phases.preparation
|
|
|
|
@classmethod
|
|
def run(cls, info):
|
|
from bootstrapvz.common.exceptions import TaskError
|
|
playbook = info.manifest.plugins['ansible']['playbook']
|
|
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
|
|
predecessors = [apt.AddDefaultSources]
|
|
|
|
@classmethod
|
|
def run(cls, info):
|
|
info.packages.add('python')
|
|
|
|
|
|
class RunAnsiblePlaybook(Task):
|
|
description = 'Running ansible playbooks'
|
|
phase = phases.system_modification
|
|
|
|
@classmethod
|
|
def run(cls, info):
|
|
from bootstrapvz.common.tools import log_check_call
|
|
|
|
# Extract playbook and directory
|
|
playbook = info.manifest.plugins['ansible']['playbook']
|
|
playbook_dir = os.path.dirname(os.path.realpath(playbook))
|
|
|
|
# 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)
|
|
content = ""
|
|
|
|
if hosts:
|
|
for host in hosts:
|
|
content += '[{}]\n{}\n'.format(host, conn)
|
|
else:
|
|
content = conn
|
|
|
|
handle.write(content)
|
|
|
|
# build the ansible command
|
|
cmd = ['ansible-playbook', '-i', inventory, os.path.basename(playbook)]
|
|
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
|
|
log_check_call(cmd, cwd=playbook_dir)
|
|
os.remove(inventory)
|