Skip to content

Commit

Permalink
Merge pull request #684 from roots/vars-plugin
Browse files Browse the repository at this point in the history
Make raw_vars compatible with play vars and Ansible 2.1
  • Loading branch information
fullyint authored Nov 7, 2016
2 parents e6bf2ef + 83bc559 commit a6c2d5f
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 29 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
### HEAD
* Make `raw_vars` compatible with play vars and Ansible 2.1 ([#684](https://github.com/roots/trellis/pull/684))
* Ensure there is always at least one PHP-FPM pool defined ([#682](https://github.com/roots/trellis/pull/682))
* Update galaxy roles for Ansible 2.2 compatibility ([#681](https://github.com/roots/trellis/pull/681))
* Update to WP-CLI 0.25.0 for WP 4.7 compat ([#673](https://github.com/roots/trellis/pull/673))
Expand Down
14 changes: 9 additions & 5 deletions lib/trellis/plugins/callback/output.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@
import os.path
import sys

from ansible.parsing.dataloader import DataLoader
from ansible import __version__
from ansible.errors import AnsibleError

if __version__.startswith('1'):
raise AnsibleError('Trellis no longer supports Ansible 1.x. Please upgrade to Ansible 2.x.')

from ansible.plugins.callback.default import CallbackModule as CallbackModule_default

try:
Expand Down Expand Up @@ -59,10 +64,9 @@ def v2_playbook_on_play_start(self, play):
super(CallbackModule, self).v2_playbook_on_play_start(play)

# Check for relevant settings or overrides passed via cli --extra-vars
loader = DataLoader()
play_vars = play.get_variable_manager().get_vars(loader=loader, play=play)
if 'vagrant_version' in play_vars:
self.vagrant_version = play_vars['vagrant_version']
extra_vars = play.get_variable_manager().extra_vars
if 'vagrant_version' in extra_vars:
self.vagrant_version = extra_vars['vagrant_version']

def v2_runner_item_on_ok(self, result):
output.display_item(self, result)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,40 @@
import re
import sys

from ansible import __version__
from ansible.errors import AnsibleError

if __version__.startswith('1'):
raise AnsibleError('Trellis no longer supports Ansible 1.x. Please upgrade to Ansible 2.x.')

# These imports will produce Traceback in Ansible 1.x, so place after version check
from __main__ import cli
from ansible.compat.six import iteritems
from ansible.errors import AnsibleError
from ansible.parsing.dataloader import DataLoader
from ansible.parsing.yaml.objects import AnsibleMapping, AnsibleSequence, AnsibleUnicode
from ansible.plugins.callback import CallbackBase
from ansible.template import Templar


class VarsModule(object):
''' Creates and modifies host variables '''
class CallbackModule(CallbackBase):
''' Creates and modifies play and host variables '''

CALLBACK_VERSION = 2.0
CALLBACK_NAME = 'vars'

def __init__(self, inventory):
self.inventory = inventory
self.inventory_basedir = inventory.basedir()
def __init__(self):
self.loader = DataLoader()
self._options = cli.options if cli else None

def raw_triage(self, key_string, item, patterns):
# process dict values
if isinstance(item, AnsibleMapping):
return dict((key,self.raw_triage('.'.join([key_string, key]), value, patterns)) for key,value in item.iteritems())
return AnsibleMapping(dict((key,self.raw_triage('.'.join([key_string, key]), value, patterns)) for key,value in item.iteritems()))

# process list values
elif isinstance(item, AnsibleSequence):
return [self.raw_triage('.'.join([key_string, str(i)]), value, patterns) for i,value in enumerate(item)]
return AnsibleSequence([self.raw_triage('.'.join([key_string, str(i)]), value, patterns) for i,value in enumerate(item)])

# wrap values if they match raw_vars pattern
elif isinstance(item, AnsibleUnicode):
match = next((pattern for pattern in patterns if re.match(pattern, key_string)), None)
return ''.join(['{% raw %}', item, '{% endraw %}']) if not item.startswith(('{% raw', '{%raw')) and match else item
return AnsibleUnicode(''.join(['{% raw %}', item, '{% endraw %}'])) if not item.startswith(('{% raw', '{%raw')) and match else item

def raw_vars(self, host, hostvars):
def raw_vars(self, play, host, hostvars):
if 'raw_vars' not in hostvars:
return

Expand All @@ -52,7 +48,10 @@ def raw_vars(self, host, hostvars):
patterns = [re.sub(r'\*', '(.)*', re.sub(r'\.', '\.', var)) for var in raw_vars if var.split('.')[0] in hostvars]
keys = set(pattern.split('\.')[0] for pattern in patterns)
for key in keys:
host.vars[key] = self.raw_triage(key, hostvars[key], patterns)
if key in play.vars:
play.vars[key] = self.raw_triage(key, play.vars[key], patterns)
elif key in hostvars:
host.vars[key] = self.raw_triage(key, hostvars[key], patterns)

def cli_options(self):
options = []
Expand Down Expand Up @@ -86,10 +85,11 @@ def darwin_without_passlib(self):
except:
return True

def get_host_vars(self, host, vault_password=None):
self.raw_vars(host, host.get_group_vars())
host.vars['cli_options'] = self.cli_options()
host.vars['cli_ask_pass'] = getattr(self._options, 'ask_pass', False)
host.vars['cli_ask_become_pass'] = getattr(self._options, 'become_ask_pass', False)
host.vars['darwin_without_passlib'] = self.darwin_without_passlib()
return {}
def v2_playbook_on_play_start(self, play):
for host in play.get_variable_manager()._inventory.list_hosts(play.hosts[0]):
hostvars = play.get_variable_manager().get_vars(loader=self.loader, play=play, host=host)
self.raw_vars(play, host, hostvars)
host.vars['cli_options'] = self.cli_options()
host.vars['cli_ask_pass'] = getattr(self._options, 'ask_pass', False)
host.vars['cli_ask_become_pass'] = getattr(self._options, 'become_ask_pass', False)
host.vars['darwin_without_passlib'] = self.darwin_without_passlib()

0 comments on commit a6c2d5f

Please sign in to comment.