From 931f9f1a619d8d61ab3a178de25b4ef2cac8a540 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Sat, 14 Jul 2012 11:59:12 -0400 Subject: [PATCH] Setup module no longer saves to disk, as templates are mostly useful in playbooks and this allows lots of simplifications around file pathing and removes occasional permissions conflicts depending on how things are used. --- CHANGELOG.md | 1 + lib/ansible/runner/__init__.py | 30 ++------------------ library/fetch | 25 +--------------- library/raw | 24 +--------------- library/setup | 52 ---------------------------------- library/shell | 9 ++---- library/template | 25 +--------------- test/TestRunner.py | 37 ------------------------ test/metadata.json | 3 -- 9 files changed, 10 insertions(+), 196 deletions(-) delete mode 100644 test/metadata.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 70606686a68..8dd394e99f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ Ansible Changes By Release * fetch module fixes for SSH connection type * modules now consistently all take yes/no for boolean parameters (some accepted true/false) * in YAML inventory, hosts can list their groups in inverted order now also (see tests/yaml_hosts) +* setup module no longer saves to disk, template module now only used in playbooks 0.5 "Amsterdam" ------- July 04, 2012 diff --git a/lib/ansible/runner/__init__.py b/lib/ansible/runner/__init__.py index e2760ad15f3..e4daa5825c2 100644 --- a/lib/ansible/runner/__init__.py +++ b/lib/ansible/runner/__init__.py @@ -545,6 +545,9 @@ class Runner(object): def _execute_template(self, conn, tmp): ''' handler for template operations ''' + if not self.is_playbook: + raise errors.AnsibleError("in current versions of ansible, templates are only usable in playbooks") + # load up options options = utils.parse_kv(self.module_args) source = options.get('src', None) @@ -571,38 +574,11 @@ class Runner(object): result = dict(failed=True, msg="could not find src in first_available_file list") return ReturnData(host=conn.host, comm_ok=False, result=result) - if self.module_vars is not None: inject.update(self.module_vars) source = utils.template(source, inject, self.setup_cache) - #(host, ok, data, err) = (None, None, None, None) - - if not self.is_playbook: - - # not running from a playbook so we have to fetch the remote - # setup file contents before proceeding... - if metadata is None: - if self.remote_user == 'root': - metadata = '/etc/ansible/setup' - else: - # path is expanded on remote side - metadata = "~/.ansible/tmp/setup" - - # install the template module - slurp_module = self._transfer_module(conn, tmp, 'slurp') - - # run the slurp module to get the metadata file - args = "src=%s" % metadata - result1 = self._execute_module(conn, tmp, slurp_module, args) - if not 'content' in result1.result or result1.result.get('encoding','base64') != 'base64': - result1.result['failed'] = True - return result1 - content = base64.b64decode(result1.result['content']) - inject = utils.json_loads(content) - - # install the template module copy_module = self._transfer_module(conn, tmp, 'copy') diff --git a/library/fetch b/library/fetch index f26337a490a..9132aeebbed 100755 --- a/library/fetch +++ b/library/fetch @@ -1,24 +1 @@ -#!/usr/bin/python - -# (c) 2012, Michael DeHaan -# -# This file is part of Ansible -# -# Ansible is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Ansible is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Ansible. If not, see . -# - -### THIS FILE IS FOR REFERENCE OR FUTURE USE ### - -# See lib/ansible/runner.py for implementation of the fetch functionality # - +# this is a virtual module that is entirely implemented server side diff --git a/library/raw b/library/raw index adedd46d9c0..9132aeebbed 100755 --- a/library/raw +++ b/library/raw @@ -1,23 +1 @@ -#!/usr/bin/python - -# (c) 2012, Michael DeHaan -# -# This file is part of Ansible -# -# Ansible is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Ansible is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Ansible. If not, see . - -# hey the Ansible raw module isn't really a remote transferred -# module. All the magic happens in Runner.py, see the web docs -# for more details. - +# this is a virtual module that is entirely implemented server side diff --git a/library/setup b/library/setup index 4cc343b7b9c..70bb5172c49 100755 --- a/library/setup +++ b/library/setup @@ -17,8 +17,6 @@ # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . -DEFAULT_ANSIBLE_SETUP = "/etc/ansible/setup" - import array import fcntl import glob @@ -33,11 +31,6 @@ import subprocess import traceback import syslog -try: - from hashlib import md5 as _md5 -except ImportError: - from md5 import md5 as _md5 - try: import selinux HAVE_SELINUX=True @@ -316,20 +309,6 @@ def ansible_facts(): get_service_facts(facts) return facts -def md5(filename): - ''' Return MD5 hex digest of local file, or None if file is not present. ''' - if not os.path.exists(filename): - return None - digest = _md5() - blocksize = 64 * 1024 - infile = open(filename, 'rb') - block = infile.read(blocksize) - while block: - digest.update(block) - block = infile.read(blocksize) - infile.close() - return digest.hexdigest() - # =========================================== # load config & template variables @@ -355,21 +334,6 @@ except: syslog.openlog('ansible-%s' % os.path.basename(__file__)) syslog.syslog(syslog.LOG_NOTICE, 'Invoked with %s' % setup_options) -ansible_file = os.path.expandvars(setup_options.get('metadata', DEFAULT_ANSIBLE_SETUP)) -ansible_dir = os.path.dirname(ansible_file) - -# create the config dir if it doesn't exist - -if not os.path.exists(ansible_dir): - os.makedirs(ansible_dir) - -changed = False -md5sum = None -if not os.path.exists(ansible_file): - changed = True -else: - md5sum = md5(ansible_file) - # Get some basic facts in case facter or ohai are not installed for (k, v) in ansible_facts().items(): setup_options["ansible_%s" % k] = v @@ -409,23 +373,7 @@ if os.path.exists("/usr/bin/ohai"): k2 = "ohai_%s" % k setup_options[k2] = v -# write the template/settings file using -# instructions from server - -f = open(ansible_file, "w+") -reformat = json.dumps(setup_options, sort_keys=True, indent=4) -f.write(reformat) -f.close() - -md5sum2 = md5(ansible_file) - -if md5sum != md5sum2: - changed = True - setup_result = {} -setup_result['written'] = ansible_file -setup_result['changed'] = changed -setup_result['md5sum'] = md5sum2 setup_result['ansible_facts'] = setup_options # hack to keep --verbose from showing all the setup module results diff --git a/library/shell b/library/shell index 345deea68f7..3c8e63d4f4b 100644 --- a/library/shell +++ b/library/shell @@ -1,6 +1,3 @@ -# VIRTUAL - -There is actually no actual shell module source, when you use 'shell' in ansible, -it runs the 'command' module with special arguments and it behaves differently. -See the command source and the comment "#USE_SHELL". - +# There is actually no actual shell module source, when you use 'shell' in ansible, +# it runs the 'command' module with special arguments and it behaves differently. +# See the command source and the comment "#USE_SHELL". diff --git a/library/template b/library/template index a290899c5ca..9132aeebbed 100755 --- a/library/template +++ b/library/template @@ -1,24 +1 @@ -#!/usr/bin/python - -# (c) 2012, Michael DeHaan -# -# This file is part of Ansible -# -# Ansible is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Ansible is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Ansible. If not, see . - -# hey the Ansible template module isn't really a remote transferred -# module. All the magic happens in Runner.py making use of the -# copy module, and if not running from a playbook, also the 'slurp' -# module. - +# this is a virtual module that is entirely implemented server side diff --git a/test/TestRunner.py b/test/TestRunner.py index 76c85f7af0a..3349f4d8592 100644 --- a/test/TestRunner.py +++ b/test/TestRunner.py @@ -119,28 +119,6 @@ class TestRunner(unittest.TestCase): ]) assert result['changed'] == False - def test_template(self): - input_ = self._get_test_file('sample.j2') - metadata = self._get_test_file('metadata.json') - output = self._get_stage_file('sample.out') - result = self._run('template', [ - "src=%s" % input_, - "dest=%s" % output, - "metadata=%s" % metadata - ]) - assert os.path.exists(output) - out = file(output).read() - assert out.find("duck") != -1 - assert result['changed'] == True - assert 'md5sum' in result - assert 'failed' not in result - result = self._run('template', [ - "src=%s" % input_, - "dest=%s" % output, - "metadata=%s" % metadata - ]) - assert result['changed'] == False - def test_command(self): # test command module, change trigger, etc result = self._run('command', [ "/bin/echo", "hi" ]) @@ -177,21 +155,6 @@ class TestRunner(unittest.TestCase): assert len(result['stdout']) > 100000 assert result['stderr'] == '' - def test_setup(self): - output = self._get_stage_file('output.json') - result = self._run('setup', [ "metadata=%s" % output, "a=2", "b=3", "c=4" ]) - assert 'failed' not in result - assert 'md5sum' in result - assert result['changed'] == True - outds = json.loads(file(output).read()) - assert outds['c'] == '4' - # not bothering to test change hooks here since ohai/facter results change - # almost every time so changed is always true, this just tests that - # rewriting the file is ok - result = self._run('setup', [ "metadata=%s" % output, "a=2", "b=3", "c=4" ]) - print "RAW RESULT=%s" % result - assert 'md5sum' in result - def test_async(self): # test async launch and job status # of any particular module diff --git a/test/metadata.json b/test/metadata.json deleted file mode 100644 index 8af3133e349..00000000000 --- a/test/metadata.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "answer" : "Where will we find a duck and a hose at this hour?" -}