mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Various tests using datafiles are being moved into the integration test framework (tests_new right now).
The unit test infrastructure will remain for things that are mocked out and testable with out filesystem side effects, and a few cases of things that might not be quite so much (like inventory) that can still benefit from heavy access to the API. See the 'tests_new/integration' directory, this will soon fold into tests_new.
This commit is contained in:
parent
0581746a80
commit
fe7d3773ae
42 changed files with 0 additions and 1607 deletions
|
@ -1,4 +0,0 @@
|
||||||
---
|
|
||||||
# could test something different here but want people running tests on
|
|
||||||
# different OS platforms to still have passing tests
|
|
||||||
testing: default
|
|
|
@ -1,62 +0,0 @@
|
||||||
# (C) 2013, Michael Scherer, <misc@zarb.org>
|
|
||||||
|
|
||||||
# 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
|
|
||||||
import os
|
|
||||||
import unittest
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
# if you change here, also change in the plugin
|
|
||||||
FILE_DISABLE = '/tmp/ansible_test_disable'
|
|
||||||
FILE_RUN = '/tmp/ansible_test_finish'
|
|
||||||
|
|
||||||
|
|
||||||
class TestInventory(unittest.TestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
self.cwd = os.getcwd()
|
|
||||||
os.chdir(os.path.join(os.path.dirname(__file__), 'test_callbacks'))
|
|
||||||
|
|
||||||
def clean_file(self):
|
|
||||||
if os.path.exists(FILE_RUN):
|
|
||||||
os.unlink(FILE_RUN)
|
|
||||||
if os.path.exists(FILE_DISABLE):
|
|
||||||
os.unlink(FILE_DISABLE)
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
os.chdir(self.cwd)
|
|
||||||
|
|
||||||
def run_ansible_playbook(self):
|
|
||||||
subprocess.call(('source ../../hacking/env-setup 2>&1 >/dev/null;'
|
|
||||||
'ansible-playbook -i "127.0.0.1," test_playbook.yml 2>&1 >/dev/null'),
|
|
||||||
shell=True, executable='/bin/bash')
|
|
||||||
|
|
||||||
def test_callback(self):
|
|
||||||
self.clean_file()
|
|
||||||
|
|
||||||
self.run_ansible_playbook()
|
|
||||||
assert os.path.exists(FILE_RUN)
|
|
||||||
self.clean_file()
|
|
||||||
|
|
||||||
def test_callback_disabled(self):
|
|
||||||
self.clean_file()
|
|
||||||
open(FILE_DISABLE, 'w').close()
|
|
||||||
|
|
||||||
self.run_ansible_playbook()
|
|
||||||
assert not os.path.exists(FILE_RUN)
|
|
||||||
|
|
||||||
self.clean_file()
|
|
|
@ -1,443 +0,0 @@
|
||||||
|
|
||||||
# tests are fairly 'live' (but safe to run)
|
|
||||||
# setup authorized_keys for logged in user such
|
|
||||||
# that the user can log in as themselves before running tests
|
|
||||||
|
|
||||||
import unittest
|
|
||||||
import getpass
|
|
||||||
import ansible.playbook
|
|
||||||
import ansible.utils as utils
|
|
||||||
import ansible.callbacks as ans_callbacks
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
import ansible.constants as C
|
|
||||||
|
|
||||||
EVENTS = []
|
|
||||||
|
|
||||||
class TestCallbacks(object):
|
|
||||||
# using same callbacks class for both runner and playbook
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def set_playbook(self, playbook):
|
|
||||||
self.playbook = playbook
|
|
||||||
|
|
||||||
def on_no_hosts_remaining(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def on_start(self):
|
|
||||||
EVENTS.append('start')
|
|
||||||
|
|
||||||
def on_skipped(self, host, item=None):
|
|
||||||
EVENTS.append([ 'skipped', [ host ]])
|
|
||||||
|
|
||||||
def on_import_for_host(self, host, filename):
|
|
||||||
EVENTS.append([ 'import', [ host, filename ]])
|
|
||||||
|
|
||||||
def on_error(self, host, msg):
|
|
||||||
EVENTS.append([ 'stderr', [ host, msg ]])
|
|
||||||
|
|
||||||
def on_not_import_for_host(self, host, missing_filename):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def on_notify(self, host, handler):
|
|
||||||
EVENTS.append([ 'notify', [ host, handler ]])
|
|
||||||
|
|
||||||
def on_task_start(self, name, is_conditional):
|
|
||||||
EVENTS.append([ 'task start', [ name, is_conditional ]])
|
|
||||||
|
|
||||||
def on_failed(self, host, results, ignore_errors):
|
|
||||||
EVENTS.append([ 'failed', [ host, results, ignore_errors ]])
|
|
||||||
|
|
||||||
def on_ok(self, host, result):
|
|
||||||
# delete certain info from host_result to make test comparisons easier
|
|
||||||
host_result = result.copy()
|
|
||||||
for k in [ 'ansible_job_id', 'results_file', 'md5sum', 'delta', 'start', 'end' ]:
|
|
||||||
if k in host_result:
|
|
||||||
del host_result[k]
|
|
||||||
for k in host_result.keys():
|
|
||||||
if k.startswith('facter_') or k.startswith('ohai_'):
|
|
||||||
del host_result[k]
|
|
||||||
EVENTS.append([ 'ok', [ host, host_result ]])
|
|
||||||
|
|
||||||
def on_play_start(self, pattern):
|
|
||||||
EVENTS.append([ 'play start', [ pattern ]])
|
|
||||||
|
|
||||||
def on_async_ok(self, host, res, jid):
|
|
||||||
EVENTS.append([ 'async ok', [ host ]])
|
|
||||||
|
|
||||||
def on_async_poll(self, host, res, jid, clock):
|
|
||||||
EVENTS.append([ 'async poll', [ host ]])
|
|
||||||
|
|
||||||
def on_async_failed(self, host, res, jid):
|
|
||||||
EVENTS.append([ 'async failed', [ host ]])
|
|
||||||
|
|
||||||
def on_unreachable(self, host, msg):
|
|
||||||
EVENTS.append([ 'failed/dark', [ host, msg ]])
|
|
||||||
|
|
||||||
def on_setup(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def on_no_hosts(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class TestPlaybook(unittest.TestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
self.user = getpass.getuser()
|
|
||||||
self.cwd = os.getcwd()
|
|
||||||
self.test_dir = os.path.join(self.cwd, 'test')
|
|
||||||
self.stage_dir = self._prepare_stage_dir()
|
|
||||||
|
|
||||||
if os.path.exists('/tmp/ansible_test_data_copy.out'):
|
|
||||||
os.unlink('/tmp/ansible_test_data_copy.out')
|
|
||||||
if os.path.exists('/tmp/ansible_test_data_template.out'):
|
|
||||||
os.unlink('/tmp/ansible_test_data_template.out')
|
|
||||||
if os.path.exists('/tmp/ansible_test_messages.out'):
|
|
||||||
os.unlink('/tmp/ansible_test_messages.out')
|
|
||||||
if os.path.exists('/tmp/ansible_test_role_messages.out'):
|
|
||||||
os.unlink('/tmp/ansible_test_role_messages.out')
|
|
||||||
|
|
||||||
def _prepare_stage_dir(self):
|
|
||||||
stage_path = os.path.join(self.test_dir, 'test_data')
|
|
||||||
if os.path.exists(stage_path):
|
|
||||||
shutil.rmtree(stage_path, ignore_errors=False)
|
|
||||||
assert not os.path.exists(stage_path)
|
|
||||||
os.makedirs(stage_path)
|
|
||||||
assert os.path.exists(stage_path)
|
|
||||||
return stage_path
|
|
||||||
|
|
||||||
def _get_test_file(self, filename):
|
|
||||||
# get a file inside the test input directory
|
|
||||||
filename = os.path.join(self.test_dir, filename)
|
|
||||||
assert os.path.exists(filename)
|
|
||||||
return filename
|
|
||||||
|
|
||||||
def _get_stage_file(self, filename):
|
|
||||||
# get a file inside the test output directory
|
|
||||||
filename = os.path.join(self.stage_dir, filename)
|
|
||||||
return filename
|
|
||||||
|
|
||||||
def _run(self, test_playbook, host_list='test/ansible_hosts', extra_vars=None):
|
|
||||||
''' run a module and get the localhost results '''
|
|
||||||
# This ensures tests are independent of eachother
|
|
||||||
global EVENTS
|
|
||||||
ansible.playbook.SETUP_CACHE.clear()
|
|
||||||
EVENTS = []
|
|
||||||
|
|
||||||
self.test_callbacks = TestCallbacks()
|
|
||||||
self.playbook = ansible.playbook.PlayBook(
|
|
||||||
playbook = test_playbook,
|
|
||||||
host_list = host_list,
|
|
||||||
module_path = 'library/',
|
|
||||||
forks = 1,
|
|
||||||
timeout = 5,
|
|
||||||
remote_user = self.user,
|
|
||||||
remote_pass = None,
|
|
||||||
extra_vars = extra_vars,
|
|
||||||
stats = ans_callbacks.AggregateStats(),
|
|
||||||
callbacks = self.test_callbacks,
|
|
||||||
runner_callbacks = self.test_callbacks
|
|
||||||
)
|
|
||||||
result = self.playbook.run()
|
|
||||||
return result
|
|
||||||
|
|
||||||
def test_playbook_vars(self):
|
|
||||||
test_callbacks = TestCallbacks()
|
|
||||||
playbook = ansible.playbook.PlayBook(
|
|
||||||
playbook=os.path.join(self.test_dir, 'test_playbook_vars', 'playbook.yml'),
|
|
||||||
host_list='test/test_playbook_vars/hosts',
|
|
||||||
stats=ans_callbacks.AggregateStats(),
|
|
||||||
callbacks=test_callbacks,
|
|
||||||
runner_callbacks=test_callbacks
|
|
||||||
)
|
|
||||||
playbook.run()
|
|
||||||
|
|
||||||
def _test_playbook_undefined_vars(self, playbook, fail_on_undefined):
|
|
||||||
# save DEFAULT_UNDEFINED_VAR_BEHAVIOR so we can restore it in the end of the test
|
|
||||||
saved_undefined_var_behavior = C.DEFAULT_UNDEFINED_VAR_BEHAVIOR
|
|
||||||
C.DEFAULT_UNDEFINED_VAR_BEHAVIOR = fail_on_undefined
|
|
||||||
|
|
||||||
test_callbacks = TestCallbacks()
|
|
||||||
playbook = ansible.playbook.PlayBook(
|
|
||||||
playbook=os.path.join(self.test_dir, 'test_playbook_undefined_vars', playbook),
|
|
||||||
host_list='test/test_playbook_undefined_vars/hosts',
|
|
||||||
stats=ans_callbacks.AggregateStats(),
|
|
||||||
callbacks=test_callbacks,
|
|
||||||
runner_callbacks=test_callbacks
|
|
||||||
)
|
|
||||||
actual = playbook.run()
|
|
||||||
|
|
||||||
C.DEFAULT_UNDEFINED_VAR_BEHAVIOR = saved_undefined_var_behavior
|
|
||||||
|
|
||||||
# if different, this will output to screen
|
|
||||||
print "**ACTUAL**"
|
|
||||||
print utils.jsonify(actual, format=True)
|
|
||||||
expected = {
|
|
||||||
"localhost": {
|
|
||||||
"changed": 0,
|
|
||||||
"failures": 0,
|
|
||||||
"ok": int(not fail_on_undefined) + 1,
|
|
||||||
"skipped": 0,
|
|
||||||
"unreachable": int(fail_on_undefined)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "**EXPECTED**"
|
|
||||||
print utils.jsonify(expected, format=True)
|
|
||||||
|
|
||||||
assert utils.jsonify(expected, format=True) == utils.jsonify(actual, format=True)
|
|
||||||
|
|
||||||
#def test_playbook_undefined_vars1_ignore(self):
|
|
||||||
# self._test_playbook_undefined_vars('playbook1.yml', False)
|
|
||||||
|
|
||||||
#def test_playbook_undefined_vars1_fail(self):
|
|
||||||
# self._test_playbook_undefined_vars('playbook1.yml', True)
|
|
||||||
|
|
||||||
#def test_playbook_undefined_vars2_ignore(self):
|
|
||||||
# self._test_playbook_undefined_vars('playbook2.yml', False)
|
|
||||||
|
|
||||||
#def test_playbook_undefined_vars2_fail(self):
|
|
||||||
# self._test_playbook_undefined_vars('playbook2.yml', True)
|
|
||||||
|
|
||||||
def test_yaml_hosts_list(self):
|
|
||||||
# Make sure playbooks support hosts: [host1, host2]
|
|
||||||
# TODO: Actually run the play on more than one host
|
|
||||||
test_callbacks = TestCallbacks()
|
|
||||||
playbook = ansible.playbook.PlayBook(
|
|
||||||
playbook=os.path.join(self.test_dir, 'hosts_list.yml'),
|
|
||||||
host_list='test/ansible_hosts',
|
|
||||||
stats=ans_callbacks.AggregateStats(),
|
|
||||||
callbacks=test_callbacks,
|
|
||||||
runner_callbacks=test_callbacks
|
|
||||||
)
|
|
||||||
play = ansible.playbook.Play(playbook, playbook.playbook[0], os.getcwd())
|
|
||||||
assert play.hosts == ';'.join(('host1', 'host2', 'host3'))
|
|
||||||
|
|
||||||
def test_playbook_hash_replace(self):
|
|
||||||
# save default hash behavior so we can restore it in the end of the test
|
|
||||||
saved_hash_behavior = C.DEFAULT_HASH_BEHAVIOUR
|
|
||||||
C.DEFAULT_HASH_BEHAVIOUR = "replace"
|
|
||||||
|
|
||||||
test_callbacks = TestCallbacks()
|
|
||||||
playbook = ansible.playbook.PlayBook(
|
|
||||||
playbook=os.path.join(self.test_dir, 'test_hash_behavior', 'playbook.yml'),
|
|
||||||
host_list='test/ansible_hosts',
|
|
||||||
stats=ans_callbacks.AggregateStats(),
|
|
||||||
callbacks=test_callbacks,
|
|
||||||
runner_callbacks=test_callbacks
|
|
||||||
)
|
|
||||||
playbook.run()
|
|
||||||
|
|
||||||
filename = '/tmp/ansible_test_messages.out'
|
|
||||||
expected_lines = [
|
|
||||||
"goodbye: Goodbye World!"
|
|
||||||
]
|
|
||||||
self._compare_file_output(filename, expected_lines)
|
|
||||||
|
|
||||||
filename = '/tmp/ansible_test_role_messages.out'
|
|
||||||
expected_lines = [
|
|
||||||
"inside_a_role: Indeed!"
|
|
||||||
]
|
|
||||||
self._compare_file_output(filename, expected_lines)
|
|
||||||
|
|
||||||
# restore default hash behavior
|
|
||||||
C.DEFAULT_HASH_BEHAVIOUR = saved_hash_behavior
|
|
||||||
|
|
||||||
def test_playbook_hash_merge(self):
|
|
||||||
# save default hash behavior so we can restore it in the end of the test
|
|
||||||
saved_hash_behavior = C.DEFAULT_HASH_BEHAVIOUR
|
|
||||||
C.DEFAULT_HASH_BEHAVIOUR = "merge"
|
|
||||||
|
|
||||||
test_callbacks = TestCallbacks()
|
|
||||||
playbook = ansible.playbook.PlayBook(
|
|
||||||
playbook=os.path.join(self.test_dir, 'test_hash_behavior', 'playbook.yml'),
|
|
||||||
host_list='test/ansible_hosts',
|
|
||||||
stats=ans_callbacks.AggregateStats(),
|
|
||||||
callbacks=test_callbacks,
|
|
||||||
runner_callbacks=test_callbacks
|
|
||||||
)
|
|
||||||
playbook.run()
|
|
||||||
|
|
||||||
filename = '/tmp/ansible_test_messages.out'
|
|
||||||
expected_lines = [
|
|
||||||
"goodbye: Goodbye World!",
|
|
||||||
"hello: Hello World!"
|
|
||||||
]
|
|
||||||
self._compare_file_output(filename, expected_lines)
|
|
||||||
|
|
||||||
filename = '/tmp/ansible_test_role_messages.out'
|
|
||||||
expected_lines = [
|
|
||||||
"goodbye: Goodbye World!",
|
|
||||||
"hello: Hello World!",
|
|
||||||
"inside_a_role: Indeed!"
|
|
||||||
]
|
|
||||||
self._compare_file_output(filename, expected_lines)
|
|
||||||
|
|
||||||
# restore default hash behavior
|
|
||||||
C.DEFAULT_HASH_BEHAVIOUR = saved_hash_behavior
|
|
||||||
|
|
||||||
def test_playbook_ignore_errors(self):
|
|
||||||
test_callbacks = TestCallbacks()
|
|
||||||
playbook = ansible.playbook.PlayBook(
|
|
||||||
playbook=os.path.join(self.test_dir, 'playbook-ignore-errors.yml'),
|
|
||||||
host_list='test/ansible_hosts',
|
|
||||||
stats=ans_callbacks.AggregateStats(),
|
|
||||||
callbacks=test_callbacks,
|
|
||||||
runner_callbacks=test_callbacks
|
|
||||||
)
|
|
||||||
actual = playbook.run()
|
|
||||||
|
|
||||||
# if different, this will output to screen
|
|
||||||
print "**ACTUAL**"
|
|
||||||
print utils.jsonify(actual, format=True)
|
|
||||||
expected = {
|
|
||||||
"localhost": {
|
|
||||||
"changed": 1,
|
|
||||||
"failures": 1,
|
|
||||||
"ok": 1,
|
|
||||||
"skipped": 0,
|
|
||||||
"unreachable": 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "**EXPECTED**"
|
|
||||||
print utils.jsonify(expected, format=True)
|
|
||||||
|
|
||||||
assert utils.jsonify(expected, format=True) == utils.jsonify(actual,format=True)
|
|
||||||
|
|
||||||
def test_playbook_changed_when(self):
|
|
||||||
test_callbacks = TestCallbacks()
|
|
||||||
playbook = ansible.playbook.PlayBook(
|
|
||||||
playbook=os.path.join(self.test_dir, 'playbook-changed_when.yml'),
|
|
||||||
host_list='test/ansible_hosts',
|
|
||||||
stats=ans_callbacks.AggregateStats(),
|
|
||||||
callbacks=test_callbacks,
|
|
||||||
runner_callbacks=test_callbacks
|
|
||||||
)
|
|
||||||
actual = playbook.run()
|
|
||||||
|
|
||||||
# if different, this will output to screen
|
|
||||||
print "**ACTUAL**"
|
|
||||||
print utils.jsonify(actual, format=True)
|
|
||||||
expected = {
|
|
||||||
"localhost": {
|
|
||||||
"changed": 3,
|
|
||||||
"failures": 0,
|
|
||||||
"ok": 6,
|
|
||||||
"skipped": 0,
|
|
||||||
"unreachable": 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "**EXPECTED**"
|
|
||||||
print utils.jsonify(expected, format=True)
|
|
||||||
|
|
||||||
assert utils.jsonify(expected, format=True) == utils.jsonify(actual,format=True)
|
|
||||||
|
|
||||||
def test_playbook_failed_when(self):
|
|
||||||
test_callbacks = TestCallbacks()
|
|
||||||
playbook = ansible.playbook.PlayBook(
|
|
||||||
playbook=os.path.join(self.test_dir, 'playbook-failed_when.yml'),
|
|
||||||
host_list='test/ansible_hosts',
|
|
||||||
stats=ans_callbacks.AggregateStats(),
|
|
||||||
callbacks=test_callbacks,
|
|
||||||
runner_callbacks=test_callbacks
|
|
||||||
)
|
|
||||||
actual = playbook.run()
|
|
||||||
|
|
||||||
# if different, this will output to screen
|
|
||||||
print "**ACTUAL**"
|
|
||||||
print utils.jsonify(actual, format=True)
|
|
||||||
expected = {
|
|
||||||
"localhost": {
|
|
||||||
"changed": 2,
|
|
||||||
"failures": 1,
|
|
||||||
"ok": 2,
|
|
||||||
"skipped": 0,
|
|
||||||
"unreachable": 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "**EXPECTED**"
|
|
||||||
print utils.jsonify(expected, format=True)
|
|
||||||
|
|
||||||
assert utils.jsonify(expected, format=True) == utils.jsonify(actual,format=True)
|
|
||||||
|
|
||||||
|
|
||||||
def test_playbook_always_run(self):
|
|
||||||
test_callbacks = TestCallbacks()
|
|
||||||
playbook = ansible.playbook.PlayBook(
|
|
||||||
playbook=os.path.join(self.test_dir, 'playbook-always-run.yml'),
|
|
||||||
host_list='test/ansible_hosts',
|
|
||||||
stats=ans_callbacks.AggregateStats(),
|
|
||||||
callbacks=test_callbacks,
|
|
||||||
runner_callbacks=test_callbacks,
|
|
||||||
check=True
|
|
||||||
)
|
|
||||||
actual = playbook.run()
|
|
||||||
|
|
||||||
# if different, this will output to screen
|
|
||||||
print "**ACTUAL**"
|
|
||||||
print utils.jsonify(actual, format=True)
|
|
||||||
expected = {
|
|
||||||
"localhost": {
|
|
||||||
"changed": 4,
|
|
||||||
"failures": 0,
|
|
||||||
"ok": 4,
|
|
||||||
"skipped": 8,
|
|
||||||
"unreachable": 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "**EXPECTED**"
|
|
||||||
print utils.jsonify(expected, format=True)
|
|
||||||
|
|
||||||
assert utils.jsonify(expected, format=True) == utils.jsonify(actual,format=True)
|
|
||||||
|
|
||||||
#def test_playbook_logging_non_ascii(self):
|
|
||||||
# pb = 'test/playbook-logging-non-ascii.yml'
|
|
||||||
# actual = self._run(pb)
|
|
||||||
#
|
|
||||||
# expected = {
|
|
||||||
# "localhost": {
|
|
||||||
# "changed": 3,
|
|
||||||
# "failures": 0,
|
|
||||||
# "ok": 3,
|
|
||||||
# "skipped": 0,
|
|
||||||
# "unreachable": 0
|
|
||||||
# }
|
|
||||||
# }
|
|
||||||
#
|
|
||||||
# assert utils.jsonify(expected, format=True) == utils.jsonify(actual, format=True)
|
|
||||||
|
|
||||||
|
|
||||||
# Disabled for now as there are permissions issues that happen if you are not the owner that created files
|
|
||||||
# in the archive.
|
|
||||||
# def test_unarchive(self):
|
|
||||||
# pb = 'test/playbook-unarchive.yml'
|
|
||||||
# actual = self._run(pb)
|
|
||||||
#
|
|
||||||
# expected = {
|
|
||||||
# "localhost": {
|
|
||||||
# "changed": 29,
|
|
||||||
# "failures": 0,
|
|
||||||
# "ok": 33,
|
|
||||||
# "skipped": 12,
|
|
||||||
# "unreachable": 0
|
|
||||||
# }
|
|
||||||
# }
|
|
||||||
#
|
|
||||||
# assert utils.jsonify(expected, format=True) == utils.jsonify(actual,format=True)
|
|
||||||
|
|
||||||
|
|
||||||
def _compare_file_output(self, filename, expected_lines):
|
|
||||||
actual_lines = []
|
|
||||||
with open(filename) as f:
|
|
||||||
actual_lines = [l.strip() for l in f.readlines()]
|
|
||||||
actual_lines = sorted(actual_lines)
|
|
||||||
|
|
||||||
print "**ACTUAL**"
|
|
||||||
print actual_lines
|
|
||||||
|
|
||||||
print "**EXPECTED**"
|
|
||||||
print expected_lines
|
|
||||||
|
|
||||||
assert actual_lines == expected_lines
|
|
|
@ -1,129 +0,0 @@
|
||||||
|
|
||||||
# tests are fairly 'live' (but safe to run)
|
|
||||||
# setup authorized_keys for logged in user such
|
|
||||||
# that the user can log in as themselves before running tests
|
|
||||||
|
|
||||||
import unittest
|
|
||||||
import getpass
|
|
||||||
import ansible.runner
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
import time
|
|
||||||
import tempfile
|
|
||||||
|
|
||||||
from nose.plugins.skip import SkipTest
|
|
||||||
|
|
||||||
|
|
||||||
def get_binary(name):
|
|
||||||
for directory in os.environ["PATH"].split(os.pathsep):
|
|
||||||
path = os.path.join(directory, name)
|
|
||||||
if os.path.isfile(path) and os.access(path, os.X_OK):
|
|
||||||
return path
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
class TestRunner(unittest.TestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
self.user = getpass.getuser()
|
|
||||||
self.runner = ansible.runner.Runner(
|
|
||||||
basedir='test/',
|
|
||||||
module_name='ping',
|
|
||||||
module_path='library/',
|
|
||||||
module_args='',
|
|
||||||
remote_user=self.user,
|
|
||||||
remote_pass=None,
|
|
||||||
host_list='test/ansible_hosts',
|
|
||||||
timeout=5,
|
|
||||||
forks=1,
|
|
||||||
background=0,
|
|
||||||
pattern='all',
|
|
||||||
transport='local',
|
|
||||||
)
|
|
||||||
self.cwd = os.getcwd()
|
|
||||||
self.test_dir = os.path.join(self.cwd, 'test')
|
|
||||||
self.stage_dir = self._prepare_stage_dir()
|
|
||||||
|
|
||||||
def _prepare_stage_dir(self):
|
|
||||||
stage_path = os.path.join(self.test_dir, 'test_data')
|
|
||||||
if os.path.exists(stage_path):
|
|
||||||
shutil.rmtree(stage_path, ignore_errors=False)
|
|
||||||
assert not os.path.exists(stage_path)
|
|
||||||
os.makedirs(stage_path)
|
|
||||||
assert os.path.exists(stage_path)
|
|
||||||
return stage_path
|
|
||||||
|
|
||||||
def _get_test_file(self, filename):
|
|
||||||
# get a file inside the test input directory
|
|
||||||
filename = os.path.join(self.test_dir, filename)
|
|
||||||
assert os.path.exists(filename)
|
|
||||||
return filename
|
|
||||||
|
|
||||||
def _get_stage_file(self, filename):
|
|
||||||
# get a file inside the test output directory
|
|
||||||
filename = os.path.join(self.stage_dir, filename)
|
|
||||||
return filename
|
|
||||||
|
|
||||||
def _run(self, module_name, module_args, background=0, check_mode=False):
|
|
||||||
''' run a module and get the localhost results '''
|
|
||||||
self.runner.module_name = module_name
|
|
||||||
args = ' '.join(module_args)
|
|
||||||
self.runner.module_args = args
|
|
||||||
self.runner.background = background
|
|
||||||
self.runner.check = check_mode
|
|
||||||
results = self.runner.run()
|
|
||||||
# when using nosetests this will only show up on failure
|
|
||||||
# which is pretty useful
|
|
||||||
assert "localhost" in results['contacted']
|
|
||||||
return results['contacted']['localhost']
|
|
||||||
|
|
||||||
def test_action_plugins(self):
|
|
||||||
result = self._run("uncategorized_plugin", [])
|
|
||||||
assert result.get("msg") == "uncategorized"
|
|
||||||
result = self._run("categorized_plugin", [])
|
|
||||||
assert result.get("msg") == "categorized"
|
|
||||||
|
|
||||||
def test_ping(self):
|
|
||||||
result = self._run('ping', [])
|
|
||||||
assert "ping" in result
|
|
||||||
|
|
||||||
def test_async(self):
|
|
||||||
# test async launch and job status
|
|
||||||
# of any particular module
|
|
||||||
result = self._run('command', [get_binary("sleep"), "3"], background=20)
|
|
||||||
assert 'ansible_job_id' in result
|
|
||||||
assert 'started' in result
|
|
||||||
jid = result['ansible_job_id']
|
|
||||||
# no real chance of this op taking a while, but whatever
|
|
||||||
time.sleep(5)
|
|
||||||
# CLI will abstract this (when polling), but this is how it works internally
|
|
||||||
result = self._run('async_status', ["jid=%s" % jid])
|
|
||||||
# TODO: would be nice to have tests for supervisory process
|
|
||||||
# killing job after X seconds
|
|
||||||
assert 'finished' in result
|
|
||||||
assert 'failed' not in result
|
|
||||||
assert 'rc' in result
|
|
||||||
assert 'stdout' in result
|
|
||||||
assert result['ansible_job_id'] == jid
|
|
||||||
|
|
||||||
def test_assemble(self):
|
|
||||||
input = self._get_test_file('assemble.d')
|
|
||||||
output = self._get_stage_file('sample.out')
|
|
||||||
result = self._run('assemble', [
|
|
||||||
"src=%s" % input,
|
|
||||||
"dest=%s" % output,
|
|
||||||
])
|
|
||||||
assert os.path.exists(output)
|
|
||||||
out = file(output).read()
|
|
||||||
assert out.find("first") != -1
|
|
||||||
assert out.find("second") != -1
|
|
||||||
assert out.find("third") != -1
|
|
||||||
assert result['changed'] is True
|
|
||||||
assert 'md5sum' in result
|
|
||||||
assert 'failed' not in result
|
|
||||||
result = self._run('assemble', [
|
|
||||||
"src=%s" % input,
|
|
||||||
"dest=%s" % output,
|
|
||||||
])
|
|
||||||
assert result['changed'] is False
|
|
||||||
|
|
|
@ -16,94 +16,6 @@ sys.setdefaultencoding("utf8")
|
||||||
|
|
||||||
class TestUtils(unittest.TestCase):
|
class TestUtils(unittest.TestCase):
|
||||||
|
|
||||||
#####################################
|
|
||||||
### varReplace function tests
|
|
||||||
|
|
||||||
def test_varReplace_var_complex_var(self):
|
|
||||||
vars = {
|
|
||||||
'x': '$y',
|
|
||||||
'y': {
|
|
||||||
'foo': 'result',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
template = '${x.foo}'
|
|
||||||
res = template2.template(None, template, vars)
|
|
||||||
assert res == 'result'
|
|
||||||
|
|
||||||
#####################################
|
|
||||||
### template_ds function tests
|
|
||||||
|
|
||||||
def test_template_ds_basic(self):
|
|
||||||
vars = {
|
|
||||||
'data': {
|
|
||||||
'var': [
|
|
||||||
'foo',
|
|
||||||
'bar',
|
|
||||||
'baz',
|
|
||||||
],
|
|
||||||
'types': [
|
|
||||||
'str',
|
|
||||||
u'unicode',
|
|
||||||
1,
|
|
||||||
1L,
|
|
||||||
1.2,
|
|
||||||
],
|
|
||||||
'alphas': '$alphas',
|
|
||||||
},
|
|
||||||
'alphas': [
|
|
||||||
'abc',
|
|
||||||
'def',
|
|
||||||
'ghi',
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
template = '${data.var}'
|
|
||||||
res = template2.template(None, template, vars)
|
|
||||||
assert sorted(res) == sorted(vars['data']['var'])
|
|
||||||
|
|
||||||
template = '${data.types}'
|
|
||||||
res = template2.template(None, template, vars)
|
|
||||||
assert sorted(res) == sorted(vars['data']['types'])
|
|
||||||
|
|
||||||
template = '${data.alphas}'
|
|
||||||
res = template2.template(None, template, vars)
|
|
||||||
assert sorted(res) == sorted(vars['alphas'])
|
|
||||||
|
|
||||||
template = '${data.nonexisting}'
|
|
||||||
res = template2.template(None, template, vars)
|
|
||||||
assert res == template
|
|
||||||
|
|
||||||
#####################################
|
|
||||||
### Template function tests
|
|
||||||
|
|
||||||
def test_template_basic(self):
|
|
||||||
vars = {
|
|
||||||
'who': 'world',
|
|
||||||
}
|
|
||||||
|
|
||||||
res = template2.template_from_file("test", "template-basic", vars)
|
|
||||||
|
|
||||||
assert res == 'hello world'
|
|
||||||
|
|
||||||
def test_template_whitespace(self):
|
|
||||||
vars = {
|
|
||||||
'who': 'world',
|
|
||||||
}
|
|
||||||
|
|
||||||
res = template2.template_from_file("test", "template-whitespace", vars)
|
|
||||||
|
|
||||||
assert res == 'hello world\n'
|
|
||||||
|
|
||||||
def test_template_unicode(self):
|
|
||||||
vars = {
|
|
||||||
'who': u'wórld',
|
|
||||||
}
|
|
||||||
|
|
||||||
res = template2.template_from_file("test", "template-basic", vars)
|
|
||||||
|
|
||||||
assert res == u'hello wórld'
|
|
||||||
|
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
### check_conditional tests
|
### check_conditional tests
|
||||||
|
|
||||||
|
@ -204,44 +116,3 @@ class TestUtils(unittest.TestCase):
|
||||||
assert (ansible.utils.parse_kv('a=simple b="with space" c="this=that"') ==
|
assert (ansible.utils.parse_kv('a=simple b="with space" c="this=that"') ==
|
||||||
{'a': 'simple', 'b': 'with space', 'c': 'this=that'})
|
{'a': 'simple', 'b': 'with space', 'c': 'this=that'})
|
||||||
|
|
||||||
#####################################
|
|
||||||
### plugins
|
|
||||||
|
|
||||||
def test_loaders_expanduser_each_dir(self):
|
|
||||||
# Test that PluginLoader will call expanduser on each path
|
|
||||||
# when it splits its "config" argument.
|
|
||||||
home_dir = os.path.expanduser("~")
|
|
||||||
if home_dir == "~":
|
|
||||||
raise SkipTest("your platform doesn't expand ~ in paths")
|
|
||||||
elif not os.path.isdir(home_dir):
|
|
||||||
raise SkipTest("~ expands to non-directory %r" % (home_dir,))
|
|
||||||
elif not os.path.isabs(home_dir):
|
|
||||||
raise SkipTest("~ expands to non-absolute path %r" % (home_dir,))
|
|
||||||
# Unfortunately we have to create temporary directories in
|
|
||||||
# your home directory; the directories have to exist for
|
|
||||||
# PluginLoader to accept them.
|
|
||||||
abs_dirs, tilde_dirs = [], []
|
|
||||||
try:
|
|
||||||
for _ in range(2):
|
|
||||||
temp_dir = tempfile.mkdtemp(prefix="ansible", dir=home_dir)
|
|
||||||
abs_dirs.append(temp_dir)
|
|
||||||
# Convert mkdtemp's absolute path to one starting with "~".
|
|
||||||
tilde_dir = os.path.join("~", os.path.relpath(temp_dir,
|
|
||||||
home_dir))
|
|
||||||
tilde_dirs.append(tilde_dir)
|
|
||||||
loader = ansible.utils.plugins.PluginLoader(
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
os.pathsep.join(tilde_dirs),
|
|
||||||
"something_under_basedir"
|
|
||||||
)
|
|
||||||
loader_paths = loader.print_paths().split(os.pathsep)
|
|
||||||
for abs_dir in abs_dirs:
|
|
||||||
assert abs_dir in loader_paths, \
|
|
||||||
"%r not in %r" % (abs_dir, loader_paths)
|
|
||||||
finally:
|
|
||||||
for a_dir in abs_dirs:
|
|
||||||
try:
|
|
||||||
os.rmdir(a_dir)
|
|
||||||
except os.error:
|
|
||||||
pass
|
|
||||||
|
|
|
@ -1,90 +0,0 @@
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
Version: GnuPG v1.4.10 (GNU/Linux)
|
|
||||||
|
|
||||||
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
|
|
||||||
hqsRKcw+Z9k=
|
|
||||||
=sw5O
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
|
@ -1,2 +0,0 @@
|
||||||
# This is the first comment.
|
|
||||||
[somegroup]
|
|
|
@ -1,2 +0,0 @@
|
||||||
# This is the second comment.
|
|
||||||
localhost
|
|
|
@ -1,4 +0,0 @@
|
||||||
# This is the third comment.
|
|
||||||
[somegroup:vars]
|
|
||||||
foo=bar
|
|
||||||
# 無 可 無 非 常 無
|
|
|
@ -1,42 +0,0 @@
|
||||||
-
|
|
||||||
hosts: all
|
|
||||||
gather_facts: no
|
|
||||||
remote_user: root
|
|
||||||
vars:
|
|
||||||
color: brown
|
|
||||||
tasks:
|
|
||||||
- name: test 1
|
|
||||||
cron: name="execution test 1" weekday="2,3" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate" cron_file=yum-autoupdate state=absent
|
|
||||||
tags:
|
|
||||||
- cron
|
|
||||||
|
|
||||||
- name: test 1-1
|
|
||||||
cron: name="execution test 1" weekday="2,3" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate" cron_file=yum-autoupdate state=absent
|
|
||||||
tags:
|
|
||||||
- cron
|
|
||||||
|
|
||||||
- name: test 2-1
|
|
||||||
cron: name="execution test 2" weekday="2,3" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate" state=absent
|
|
||||||
tags:
|
|
||||||
- cron
|
|
||||||
|
|
||||||
- name: test 2-2
|
|
||||||
cron: name="execution test 2" weekday="2,3" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate" state=absent
|
|
||||||
tags:
|
|
||||||
- cron
|
|
||||||
|
|
||||||
- name: test 2-3
|
|
||||||
cron: name="execution test 2" weekday="2,3" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate"
|
|
||||||
tags:
|
|
||||||
- cron
|
|
||||||
|
|
||||||
- name: test 3-1
|
|
||||||
cron: name="execution test 3" weekday="2,3" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate" cron_file=yum-autoupdate state=absent
|
|
||||||
tags:
|
|
||||||
- cron
|
|
||||||
|
|
||||||
- name: test 3-2
|
|
||||||
cron: name="execution test 3" weekday="2,3" minute=0 hour=12 user="root" job="YUMINTERACTIVE=0 /usr/sbin/yum-autoupdate" cron_file=yum-autoupdate
|
|
||||||
tags:
|
|
||||||
- cron
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
---
|
|
||||||
testing: default
|
|
|
@ -1,10 +0,0 @@
|
||||||
#jinja2: variable_end_string: @@, variable_start_string: @@
|
|
||||||
|
|
||||||
{% raw %}
|
|
||||||
if this succeeds you should see '{{ ansible_hostname }}' with the hostname on the line above
|
|
||||||
if this fails you should see '@@ ansible_hostname @@' with the hostname on the line beneath
|
|
||||||
{% endraw %}
|
|
||||||
|
|
||||||
@@ ansible_hostname @@
|
|
||||||
{{ ansible_hostname }}
|
|
||||||
|
|
|
@ -1,113 +0,0 @@
|
||||||
# simple test of lookup plugins in with_*
|
|
||||||
---
|
|
||||||
- hosts: all
|
|
||||||
connection: local
|
|
||||||
vars:
|
|
||||||
empty_list: []
|
|
||||||
tasks:
|
|
||||||
- name: test with_items
|
|
||||||
action: command true
|
|
||||||
with_items:
|
|
||||||
- 1
|
|
||||||
- 2
|
|
||||||
- 3
|
|
||||||
- name: test with_items with empty list
|
|
||||||
action: command true
|
|
||||||
with_items: $empty_list
|
|
||||||
|
|
||||||
- name: test with_file and FILE
|
|
||||||
action: command test "$item" = "$FILE(sample.j2)"
|
|
||||||
with_file: sample.j2
|
|
||||||
|
|
||||||
- name: test with_pipe
|
|
||||||
action: command test "$item" = "$PIPE(cat sample.j2)"
|
|
||||||
with_pipe: cat sample.j2
|
|
||||||
|
|
||||||
- name: test LOOKUP and PIPE
|
|
||||||
action: command test "$LOOKUP(pipe, cat sample.j2)" = "$PIPE(cat sample.j2)"
|
|
||||||
|
|
||||||
- name: test with_sequence, generate
|
|
||||||
command: touch /tmp/seq-${item}
|
|
||||||
with_sequence: 0-16/2:%02x
|
|
||||||
|
|
||||||
- name: test with_sequence, fenceposts 1
|
|
||||||
copy: src=/tmp/seq-00 dest=/tmp/seq-10
|
|
||||||
|
|
||||||
- name: test with_sequence, fenceposts 2
|
|
||||||
file: dest=/tmp/seq-${item} state=absent
|
|
||||||
with_items: [11, 12]
|
|
||||||
|
|
||||||
- name: test with_sequence, missing
|
|
||||||
file: dest=/tmp/seq-${item} state=absent
|
|
||||||
with_sequence: 0x10/02:%02x
|
|
||||||
|
|
||||||
- name: test with_sequence,remove
|
|
||||||
file: dest=/tmp/seq-${item} state=absent
|
|
||||||
with_sequence: 0-0x10/02:%02x
|
|
||||||
|
|
||||||
- name: ensure test file doesnt exist
|
|
||||||
# command because file will return differently
|
|
||||||
action: command rm -f /tmp/ansible-test-with_lines-data
|
|
||||||
- name: test with_lines
|
|
||||||
action: shell echo "$item" >> /tmp/ansible-test-with_lines-data
|
|
||||||
with_lines: cat sample.j2
|
|
||||||
- name: verify with_lines
|
|
||||||
action: copy src=sample.j2 dest=/tmp/ansible-test-with_lines-data
|
|
||||||
- name: cleanup test file
|
|
||||||
action: file path=/tmp/ansible-test-with_lines-data state=absent
|
|
||||||
|
|
||||||
# Test nested loop
|
|
||||||
- name: test nested loop with more than 3 elements
|
|
||||||
command: test "{{ item[0] }}, {{ item[1] }}, {{ item[2] }}, {{ item[3] }}" = "red, 1, up, top"
|
|
||||||
with_nested:
|
|
||||||
- [ 'red' ]
|
|
||||||
- [ 1 ]
|
|
||||||
- [ 'up']
|
|
||||||
- [ 'top']
|
|
||||||
|
|
||||||
# password lookup plugin
|
|
||||||
- name: ensure test file doesn't exist
|
|
||||||
# command because file will return differently
|
|
||||||
action: command rm -f /tmp/ansible-test-with_password
|
|
||||||
- name: test LOOKUP and PASSWORD with non existing password file
|
|
||||||
action: command test "$LOOKUP(password, /tmp/ansible-test-with_password)" = "$PASSWORD(/tmp/ansible-test-with_password)"
|
|
||||||
- name: test LOOKUP and PASSWORD with existing password file
|
|
||||||
action: command test "$LOOKUP(password, /tmp/ansible-test-with_password)" = "$PASSWORD(/tmp/ansible-test-with_password)"
|
|
||||||
- name: now test existing password via $item and with_password
|
|
||||||
action: command test "$PASSWORD(/tmp/ansible-test-with_password)" = "$item"
|
|
||||||
with_password:
|
|
||||||
- /tmp/ansible-test-with_password
|
|
||||||
- name: cleanup test file
|
|
||||||
action: file path=/tmp/ansible-test-with_password state=absent
|
|
||||||
- name: now test a password of non-default length (default=20, but here length=8)
|
|
||||||
action: command test "$PASSWORD(/tmp/ansible-test-with_password length=8)" = "$LOOKUP(password, /tmp/ansible-test-with_password)"
|
|
||||||
# - name: did we really create a password of length=8?
|
|
||||||
# action: command test "`expr length $PASSWORD(/tmp/ansible-test-with_password)`" = "8"
|
|
||||||
- name: cleanup test file, again
|
|
||||||
action: file path=/tmp/ansible-test-with_password state=absent
|
|
||||||
|
|
||||||
# indexed_items lookup plugin
|
|
||||||
- name: create directory for indexed_items
|
|
||||||
file: path=/tmp/ansible-test-with_indexed_items-data state=directory
|
|
||||||
- name: test indexed_items
|
|
||||||
shell: echo "{{ item.0 }}" > /tmp/ansible-test-with_indexed_items-data/{{ item.1 }}
|
|
||||||
with_indexed_items:
|
|
||||||
- a
|
|
||||||
- b
|
|
||||||
- c
|
|
||||||
- name: check indexed_items content
|
|
||||||
shell: test -f /tmp/ansible-test-with_indexed_items-data/{{ item.1 }} &&
|
|
||||||
test "{{ item.0 }}" = "$(cat /tmp/ansible-test-with_indexed_items-data/{{ item.1 }})"
|
|
||||||
with_indexed_items:
|
|
||||||
- a
|
|
||||||
- b
|
|
||||||
- c
|
|
||||||
- name: cleanup indexed_items test
|
|
||||||
file: path=/tmp/ansible-test-with_indexed_items-data/{{ item.1 }} state=absent
|
|
||||||
with_indexed_items:
|
|
||||||
- a
|
|
||||||
- b
|
|
||||||
- c
|
|
||||||
- name: remove with_indexed_items directory
|
|
||||||
file: path=/tmp/ansible-test-with_indexed_items-data state=absent
|
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
---
|
|
||||||
- hosts: all
|
|
||||||
connection: local
|
|
||||||
gather_facts: False
|
|
||||||
vars:
|
|
||||||
var_true: True
|
|
||||||
var_false: False
|
|
||||||
var_empty_str: "''"
|
|
||||||
var_null: ~
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- action: command echo ping
|
|
||||||
always_run: yes
|
|
||||||
|
|
||||||
- action: command echo pong 1
|
|
||||||
|
|
||||||
- action: command echo pong 2
|
|
||||||
always_run: no
|
|
||||||
|
|
||||||
- action: command echo pong 3
|
|
||||||
always_run: 1 + 1
|
|
||||||
|
|
||||||
- action: command echo pong 4
|
|
||||||
always_run: "''"
|
|
||||||
|
|
||||||
- action: command echo pong 5
|
|
||||||
always_run: False
|
|
||||||
|
|
||||||
- action: command echo pong 6
|
|
||||||
always_run: True
|
|
||||||
|
|
||||||
- action: command echo pong 7
|
|
||||||
always_run: var_true
|
|
||||||
|
|
||||||
- action: command echo pong 8
|
|
||||||
always_run: var_false
|
|
||||||
|
|
||||||
- action: command echo pong 9
|
|
||||||
always_run: var_empty_str
|
|
||||||
|
|
||||||
- action: command echo pong 10
|
|
||||||
always_run: var_null
|
|
||||||
|
|
||||||
# this will never run...
|
|
||||||
- action: command echo pong 11
|
|
||||||
always_run: yes
|
|
||||||
when: no
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
---
|
|
||||||
- hosts: all
|
|
||||||
connection: local
|
|
||||||
gather_facts: False
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- action: command echo first action
|
|
||||||
- action: command echo second action
|
|
||||||
register: var
|
|
||||||
changed_when: "'X' in var.stdout"
|
|
||||||
- action: shell exit 2
|
|
||||||
register: exit
|
|
||||||
ignore_errors: yes
|
|
||||||
changed_when: "exit.rc < 1"
|
|
||||||
- action: command echo third action
|
|
||||||
changed_when: false
|
|
||||||
- action: file path=/ state=directory
|
|
||||||
changed_when: true
|
|
||||||
- action: command echo {{item}}
|
|
||||||
register: out
|
|
||||||
changed_when: "'e' in out.stdout"
|
|
||||||
with_items:
|
|
||||||
- hello
|
|
||||||
- foo
|
|
||||||
- bye
|
|
|
@ -1,15 +0,0 @@
|
||||||
---
|
|
||||||
- hosts: all
|
|
||||||
connection: local
|
|
||||||
gather_facts: False
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- action: shell exit 0
|
|
||||||
register: exit
|
|
||||||
failed_when: not exit.rc in [0, 1]
|
|
||||||
- action: shell exit 1
|
|
||||||
register: exit
|
|
||||||
failed_when: exit.rc not in [0, 1]
|
|
||||||
- action: shell exit 2
|
|
||||||
register: exit
|
|
||||||
failed_when: exit.rc not in [0, 1]
|
|
|
@ -1,9 +0,0 @@
|
||||||
---
|
|
||||||
- hosts: all
|
|
||||||
connection: local
|
|
||||||
gather_facts: False
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- action: command false
|
|
||||||
ignore_errors: true
|
|
||||||
- action: command false
|
|
|
@ -1,17 +0,0 @@
|
||||||
---
|
|
||||||
- hosts: localhost
|
|
||||||
connection: local
|
|
||||||
gather_facts: False
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: Loggføring fungerer
|
|
||||||
command: echo "Feilsøking"
|
|
||||||
always_run: yes
|
|
||||||
|
|
||||||
- name: Die Süßigkeit
|
|
||||||
command: echo "Die Süßigkeit"
|
|
||||||
always_run: yes
|
|
||||||
|
|
||||||
- name: Logging works
|
|
||||||
command: echo "Debugging"
|
|
||||||
always_run: yes
|
|
|
@ -1,98 +0,0 @@
|
||||||
---
|
|
||||||
# run with option -i localhost
|
|
||||||
# need root permissions
|
|
||||||
|
|
||||||
- name: host module testing
|
|
||||||
hosts: localhost
|
|
||||||
connection: local
|
|
||||||
gather_facts: no
|
|
||||||
sudo: yes
|
|
||||||
|
|
||||||
pre_tasks:
|
|
||||||
- name: backup /etc/hosts
|
|
||||||
command: cp /etc/hosts /etc/hosts.origin
|
|
||||||
|
|
||||||
post_tasks:
|
|
||||||
- name: restore /etc/hosts
|
|
||||||
command: cp /etc/hosts.origin /etc/hosts
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: test add a record
|
|
||||||
host: hostname=foobar ip=192.168.123.1
|
|
||||||
register: result
|
|
||||||
failed_when: not result.changed
|
|
||||||
|
|
||||||
- name: test error handling only hostname given on present
|
|
||||||
host: hostname=foobar
|
|
||||||
register: result
|
|
||||||
failed_when: result.changed
|
|
||||||
|
|
||||||
- name: test error handling only ip given on present
|
|
||||||
host: ip=192.168.123.1
|
|
||||||
register: result
|
|
||||||
failed_when: result.changed
|
|
||||||
|
|
||||||
- name: test record exists
|
|
||||||
host: hostname=foobar ip=192.168.123.1
|
|
||||||
register: result
|
|
||||||
failed_when: result.changed
|
|
||||||
|
|
||||||
- name: test remove record using hostname
|
|
||||||
host: hostname=foobar state=absent
|
|
||||||
register: result
|
|
||||||
failed_when: not result.changed
|
|
||||||
|
|
||||||
- name: test remove not existing record using hostname
|
|
||||||
host: hostname=foobar state=absent
|
|
||||||
register: result
|
|
||||||
failed_when: result.changed
|
|
||||||
|
|
||||||
- name: test add a record again
|
|
||||||
host: hostname=foobar ip=192.168.123.1
|
|
||||||
register: result
|
|
||||||
failed_when: not result.changed
|
|
||||||
|
|
||||||
- name: test remove record using ip
|
|
||||||
host: ip=192.168.123.1 state=absent
|
|
||||||
register: result
|
|
||||||
failed_when: not result.changed
|
|
||||||
|
|
||||||
- name: test remove not existing record using ip
|
|
||||||
host: ip=192.168.123.1 state=absent
|
|
||||||
register: result
|
|
||||||
failed_when: result.changed
|
|
||||||
|
|
||||||
- name: test add a record with alias
|
|
||||||
host: hostname=foobar ip=192.168.123.1 aliases=foobar.com,foobar.net
|
|
||||||
register: result
|
|
||||||
failed_when: not result.changed
|
|
||||||
|
|
||||||
- name: test add an existing record with alias
|
|
||||||
host: hostname=foobar ip=192.168.123.1 aliases=foobar.com,foobar.net
|
|
||||||
register: result
|
|
||||||
failed_when: result.changed
|
|
||||||
|
|
||||||
- name: test add an existing record with changed alias
|
|
||||||
host: hostname=foobar ip=192.168.123.1 aliases=foobar.net,foobar.com
|
|
||||||
register: result
|
|
||||||
failed_when: not result.changed
|
|
||||||
|
|
||||||
- name: test remove aliases from existing record
|
|
||||||
host: hostname=foobar ip=192.168.123.1
|
|
||||||
register: result
|
|
||||||
failed_when: not result.changed
|
|
||||||
|
|
||||||
- name: test add aliases for existing record
|
|
||||||
host: hostname=foobar ip=192.168.123.1 aliases=foobar.net,foobar.com
|
|
||||||
register: result
|
|
||||||
failed_when: not result.changed
|
|
||||||
|
|
||||||
- name: test change ip on existing record
|
|
||||||
host: hostname=foobar ip=192.168.123.2
|
|
||||||
register: result
|
|
||||||
failed_when: not result.changed
|
|
||||||
|
|
||||||
- name: test change hostname on existing record
|
|
||||||
host: hostname=barfoo ip=192.168.123.2
|
|
||||||
register: result
|
|
||||||
failed_when: not result.changed
|
|
|
@ -1,133 +0,0 @@
|
||||||
---
|
|
||||||
# To run me manually, use: -i "localhost,"
|
|
||||||
- hosts: localhost
|
|
||||||
connection: local
|
|
||||||
gather_facts: no
|
|
||||||
vars:
|
|
||||||
- testdir: /tmp/ansible-rcopy
|
|
||||||
- filesdir: test_recursive_copy/files
|
|
||||||
tasks:
|
|
||||||
|
|
||||||
#
|
|
||||||
# First, regression tests for single-file behavior
|
|
||||||
#
|
|
||||||
|
|
||||||
- name: "src single file, dest file"
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/subdir/subdir2/subdir3/test1 dest={{testdir}}/file1
|
|
||||||
register: res
|
|
||||||
- command: test -f {{testdir}}/file1
|
|
||||||
- command: test "{{res.changed}}" = "True"
|
|
||||||
- copy: src={{filesdir}}/subdir/subdir2/subdir3/test1 dest={{testdir}}/file1
|
|
||||||
register: res
|
|
||||||
- command: test "{{res.changed}}" = "False"
|
|
||||||
|
|
||||||
- name: "src single file, dest dir w/trailing slash"
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/subdir/subdir2/subdir3/test1 dest={{testdir}}/
|
|
||||||
register: res
|
|
||||||
- command: test -f {{testdir}}/test1
|
|
||||||
- command: test "{{res.changed}}" = "True"
|
|
||||||
- copy: src={{filesdir}}/subdir/subdir2/subdir3/test1 dest={{testdir}}/
|
|
||||||
register: res
|
|
||||||
- command: test "{{res.changed}}" = "False"
|
|
||||||
|
|
||||||
- name: "src single file, dest dir wo/trailing slash - doesn't behave in sane way"
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/subdir/subdir2/subdir3/test1 dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- shell: test -f {{testdir}}/test1
|
|
||||||
- command: test "{{res.changed}}" = "True"
|
|
||||||
- copy: src={{filesdir}}/subdir/subdir2/subdir3/test1 dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test "{{res.changed}}" = "False"
|
|
||||||
|
|
||||||
#
|
|
||||||
# Now, test recursive behavior
|
|
||||||
#
|
|
||||||
|
|
||||||
- name: "src dir w/trailing slash, dest w/trailing slash"
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/subdir/ dest={{testdir}}/
|
|
||||||
register: res
|
|
||||||
- command: test -d {{testdir}}/subdir2
|
|
||||||
- command: test -d {{testdir}}/subdir2/subdir3
|
|
||||||
- command: test -d {{testdir}}/subdir2/subdir3
|
|
||||||
- command: test -f {{testdir}}/subdir2/subdir3/test1
|
|
||||||
- command: test -f {{testdir}}/subdir2/subdir3/test2
|
|
||||||
- command: test "{{res.changed}}" = "True"
|
|
||||||
- copy: src={{filesdir}}/subdir/ dest={{testdir}}/
|
|
||||||
register: res
|
|
||||||
- command: test "{{res.changed}}" = "False"
|
|
||||||
|
|
||||||
# Expecting the same behavior
|
|
||||||
- name: "src dir w/trailing slash, dest wo/trailing slash"
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/subdir/ dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test -d {{testdir}}/subdir2
|
|
||||||
- command: test -d {{testdir}}/subdir2/subdir3
|
|
||||||
- command: test -d {{testdir}}/subdir2/subdir3
|
|
||||||
- command: test -f {{testdir}}/subdir2/subdir3/test1
|
|
||||||
- command: test -f {{testdir}}/subdir2/subdir3/test2
|
|
||||||
- command: test "{{res.changed}}" = "True"
|
|
||||||
- copy: src={{filesdir}}/subdir/ dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test "{{res.changed}}" = "False"
|
|
||||||
|
|
||||||
- name: "src dir wo/trailing slash, dest w/trailing slash"
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/subdir dest={{testdir}}/
|
|
||||||
register: res
|
|
||||||
- command: test -d {{testdir}}/subdir/subdir2
|
|
||||||
- command: test -d {{testdir}}/subdir/subdir2/subdir3
|
|
||||||
- command: test -d {{testdir}}/subdir/subdir2/subdir3
|
|
||||||
- command: test -f {{testdir}}/subdir/subdir2/subdir3/test1
|
|
||||||
- command: test -f {{testdir}}/subdir/subdir2/subdir3/test2
|
|
||||||
- command: test "{{res.changed}}" = "True"
|
|
||||||
- copy: src={{filesdir}}/subdir dest={{testdir}}/
|
|
||||||
register: res
|
|
||||||
- command: test "{{res.changed}}" = "False"
|
|
||||||
|
|
||||||
# Expecting the same behavior
|
|
||||||
- name: "src dir wo/trailing slash, dest wo/trailing slash"
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/subdir dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test -d {{testdir}}/subdir/subdir2
|
|
||||||
- command: test -d {{testdir}}/subdir/subdir2/subdir3
|
|
||||||
- command: test -d {{testdir}}/subdir/subdir2/subdir3
|
|
||||||
- command: test -f {{testdir}}/subdir/subdir2/subdir3/test1
|
|
||||||
- command: test -f {{testdir}}/subdir/subdir2/subdir3/test2
|
|
||||||
- command: test "{{res.changed}}" = "True"
|
|
||||||
- copy: src={{filesdir}}/subdir dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test "{{res.changed}}" = "False"
|
|
||||||
|
|
||||||
|
|
||||||
- name: "Verifying notify handling for recursive files"
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/subdir dest={{testdir}}
|
|
||||||
notify:
|
|
||||||
- files changed
|
|
||||||
- meta: flush_handlers
|
|
||||||
- command: test -f {{testdir}}/notify_fired
|
|
||||||
|
|
||||||
- command: rm {{testdir}}/notify_fired
|
|
||||||
- copy: src={{filesdir}}/subdir dest={{testdir}}
|
|
||||||
notify:
|
|
||||||
- files changed
|
|
||||||
- meta: flush_handlers
|
|
||||||
- command: test ! -f {{testdir}}/notify_fired
|
|
||||||
|
|
||||||
handlers:
|
|
||||||
- name: files changed
|
|
||||||
command: touch {{testdir}}/notify_fired
|
|
|
@ -1,2 +0,0 @@
|
||||||
---
|
|
||||||
- include: "{{dir}}/playbook-included.yml variable=foobar"
|
|
|
@ -1,90 +0,0 @@
|
||||||
---
|
|
||||||
# To run me manually, use: -i "localhost,"
|
|
||||||
- hosts: localhost
|
|
||||||
connection: local
|
|
||||||
gather_facts: no
|
|
||||||
vars:
|
|
||||||
- testdir: /tmp/ansible-unarchive
|
|
||||||
- filesdir: test_unarchive/files
|
|
||||||
tasks:
|
|
||||||
|
|
||||||
- name: "Simple tar unarchive."
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- unarchive: src={{filesdir}}/test.tar dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test -f {{testdir}}/foo
|
|
||||||
- fail: msg="Resource was expected to be changed."
|
|
||||||
when: not res|changed
|
|
||||||
- unarchive: src={{filesdir}}/test.tar dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- fail: msg="Resource was not expected to be changed."
|
|
||||||
when: res|changed
|
|
||||||
|
|
||||||
- name: "Simple tar.gz unarchive."
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- unarchive: src={{filesdir}}/test.tar.gz dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test -f {{testdir}}/foo
|
|
||||||
- fail: msg="Resource was expected to be changed."
|
|
||||||
when: not res|changed
|
|
||||||
- unarchive: src={{filesdir}}/test.tar.gz dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- fail: msg="Resource was not expected to be changed."
|
|
||||||
when: res|changed
|
|
||||||
|
|
||||||
- name: "Simple zip unarchive."
|
|
||||||
command: rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- unarchive: src={{filesdir}}/test.zip dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test -f {{testdir}}/foo
|
|
||||||
- fail: msg="Resource was expected to be changed."
|
|
||||||
when: not res|changed
|
|
||||||
- unarchive: src={{filesdir}}/test.zip dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- fail: msg="Resource was expected to be changed."
|
|
||||||
when: not res|changed
|
|
||||||
|
|
||||||
- name: "Unarchive a local tar file."
|
|
||||||
command : rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/test.tar dest={{testdir}}
|
|
||||||
- unarchive: src={{testdir}}/test.tar dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test -f {{testdir}}/foo
|
|
||||||
- fail: msg="Resource was expected to be changed."
|
|
||||||
when: not res|changed
|
|
||||||
- unarchive: src={{testdir}}/test.tar dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- fail: msg="Resource was not expected to be changed."
|
|
||||||
when: res|changed
|
|
||||||
|
|
||||||
- name: "Unarchive a local tar.gz file."
|
|
||||||
command : rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/test.tar.gz dest={{testdir}}
|
|
||||||
- unarchive: src={{testdir}}/test.tar.gz dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test -f {{testdir}}/foo
|
|
||||||
- fail: msg="Resource was expected to be changed."
|
|
||||||
when: not res|changed
|
|
||||||
- unarchive: src={{testdir}}/test.tar.gz dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- fail: msg="Resource was not expected to be changed."
|
|
||||||
when: res|changed
|
|
||||||
|
|
||||||
- name: "Unarchive a local zip file."
|
|
||||||
command : rm -rf {{testdir}}
|
|
||||||
- file: state=directory dest={{testdir}}
|
|
||||||
- copy: src={{filesdir}}/test.zip dest={{testdir}}
|
|
||||||
- unarchive: src={{testdir}}/test.zip dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- command: test -f {{testdir}}/foo
|
|
||||||
- fail: msg="Resource was expected to be changed."
|
|
||||||
when: not res|changed
|
|
||||||
- unarchive: src={{testdir}}/test.zip dest={{testdir}}
|
|
||||||
register: res
|
|
||||||
- fail: msg="Resource was expected to be changed."
|
|
||||||
when: not res|changed
|
|
|
@ -1,70 +0,0 @@
|
||||||
# extremely simple test of the most basic of playbook engine/functions
|
|
||||||
---
|
|
||||||
- hosts: all
|
|
||||||
connection: local
|
|
||||||
|
|
||||||
# the 'weasels' string should show up in the output
|
|
||||||
|
|
||||||
vars:
|
|
||||||
answer: "Wuh, I think so, Brain, but if we didn't have ears, we'd look like weasels."
|
|
||||||
port: 5150
|
|
||||||
|
|
||||||
# we should have import events for common_vars and CentOS.yml (if run on CentOS)
|
|
||||||
# sorry, tests are a bit platform specific just for now
|
|
||||||
|
|
||||||
vars_files:
|
|
||||||
- common_vars.yml
|
|
||||||
- [ '{{facter_operatingsystem.yml}}', 'default_os.yml' ]
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
|
|
||||||
- name: test basic success command
|
|
||||||
action: command true
|
|
||||||
|
|
||||||
- name: test basic success command 2
|
|
||||||
action: command true
|
|
||||||
|
|
||||||
- name: test basic shell, plus two ways to dereference a variable
|
|
||||||
action: shell echo {{port}}
|
|
||||||
|
|
||||||
- name: test vars_files imports
|
|
||||||
action: shell echo {{duck}} {{cow}} {{testing}}
|
|
||||||
|
|
||||||
# in the command below, the test file should contain a valid template
|
|
||||||
# and trigger the change handler
|
|
||||||
|
|
||||||
- name: test copy
|
|
||||||
action: copy src=sample.j2 dest=/tmp/ansible_test_data_copy.out
|
|
||||||
notify:
|
|
||||||
- on change 1
|
|
||||||
|
|
||||||
# there should be various poll events within the range
|
|
||||||
|
|
||||||
- name: async poll test
|
|
||||||
action: shell sleep 5
|
|
||||||
async: 10
|
|
||||||
poll: 3
|
|
||||||
|
|
||||||
# the following command should be skipped
|
|
||||||
|
|
||||||
- name: this should be skipped
|
|
||||||
action: shell echo 'if you see this, this is wrong'
|
|
||||||
when: 2 == 3
|
|
||||||
|
|
||||||
handlers:
|
|
||||||
|
|
||||||
# in the above test example, this should fire ONCE (at the end)
|
|
||||||
- name: on change 1
|
|
||||||
action: shell echo 'this should fire once'
|
|
||||||
|
|
||||||
# in the above test example, this should fire ONCE (at the end)
|
|
||||||
|
|
||||||
- name: on change 2
|
|
||||||
action: shell echo 'this should fire once also'
|
|
||||||
|
|
||||||
# in the above test example, this should NOT FIRE
|
|
||||||
|
|
||||||
- name: on change 3
|
|
||||||
action: shell echo 'if you see this, this is wrong'
|
|
||||||
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
---
|
|
||||||
# Test iterating over lines of stdout stored in a register.
|
|
||||||
- hosts: localhost
|
|
||||||
connection: local
|
|
||||||
vars:
|
|
||||||
small_file: /etc/resolv.conf
|
|
||||||
temp_file: /tmp/ansible_result_list.tmp
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- action: command cat $small_file
|
|
||||||
register: result
|
|
||||||
|
|
||||||
- action: file dest=$temp_file state=absent
|
|
||||||
|
|
||||||
- action: shell echo '$item' >> $temp_file
|
|
||||||
with_items: ${result.stdout_lines}
|
|
||||||
|
|
||||||
- action: command diff $small_file $temp_file
|
|
||||||
|
|
||||||
- action: file dest=$temp_file state=absent
|
|
|
@ -1,6 +0,0 @@
|
||||||
An ansible is a fictitious machine capable of instantaneous or superluminal
|
|
||||||
communication. Typically it is depicted as a lunch-box sized object with some
|
|
||||||
combination of microphone, speaker, keyboard and display. It can send and
|
|
||||||
receive messages to and from a corresponding device over any distance
|
|
||||||
whatsoever with no delay. Ansibles occur as plot devices in science fiction
|
|
||||||
literature.
|
|
|
@ -1,4 +0,0 @@
|
||||||
Are you pondering what I'm pøndering?
|
|
||||||
|
|
||||||
I think so Brain, but {{ answer }}
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
hello {{ who }}
|
|
|
@ -1 +0,0 @@
|
||||||
hello {{ who }}
|
|
|
@ -1,5 +0,0 @@
|
||||||
localhost
|
|
||||||
|
|
||||||
[all:vars]
|
|
||||||
inventory_var_good="{{ playbook_var_good }}"
|
|
||||||
inventory_var_bad="{{ playbook_var_bad }}"
|
|
|
@ -1,7 +0,0 @@
|
||||||
- hosts: all
|
|
||||||
vars:
|
|
||||||
playbook_var_good: "ok"
|
|
||||||
playbook_var_bad: "{{ undefined_var }}"
|
|
||||||
tasks:
|
|
||||||
- debug: msg="{{ playbook_var_good }}"
|
|
||||||
- debug: msg="{{ playbook_var_bad }}"
|
|
|
@ -1,7 +0,0 @@
|
||||||
- hosts: all
|
|
||||||
vars:
|
|
||||||
playbook_var_good: "ok"
|
|
||||||
playbook_var_bad: "{{ undefined_var }}"
|
|
||||||
tasks:
|
|
||||||
- debug: msg="{{ inventory_var_good }}"
|
|
||||||
- debug: msg="{{ inventory_var_bad }}"
|
|
|
@ -1,2 +0,0 @@
|
||||||
---
|
|
||||||
attr2: 2
|
|
|
@ -1,2 +0,0 @@
|
||||||
---
|
|
||||||
attr1: 1
|
|
|
@ -1,6 +0,0 @@
|
||||||
host1
|
|
||||||
host2
|
|
||||||
|
|
||||||
[group]
|
|
||||||
host1
|
|
||||||
host2
|
|
|
@ -1,2 +0,0 @@
|
||||||
---
|
|
||||||
- hosts: group
|
|
|
@ -1,2 +0,0 @@
|
||||||
test1
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
test2
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1 +0,0 @@
|
||||||
world
|
|
Loading…
Reference in a new issue