Commit fe7d3773 by Michael DeHaan

Various tests using datafiles are being moved into the integration test…

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.
parent 0581746a
---
# could test something different here but want people running tests on
# different OS platforms to still have passing tests
testing: default
# (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()
# 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
......@@ -17,94 +17,6 @@ sys.setdefaultencoding("utf8")
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
def test_check_conditional_jinja2_literals(self):
......@@ -204,44 +116,3 @@ class TestUtils(unittest.TestCase):
assert (ansible.utils.parse_kv('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
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)
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
hqsRKcw+Z9k=
=sw5O
-----END PGP PUBLIC KEY BLOCK-----
# This is the first comment.
[somegroup]
# This is the second comment.
localhost
# This is the third comment.
[somegroup:vars]
foo=bar
# 無 可 無 非 常 無
-
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
---
testing: default
#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 }}
# 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
---
- 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
---
- 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
---
- 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]
---
- hosts: all
connection: local
gather_facts: False
tasks:
- action: command false
ignore_errors: true
- action: command false
---
- 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
---
# 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
---
# 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
---
- include: "{{dir}}/playbook-included.yml variable=foobar"
\ No newline at end of file
---
# 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
# 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'
---
# 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
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.
Are you pondering what I'm pøndering?
I think so Brain, but {{ answer }}
hello {{ who }}
\ No newline at end of file
localhost
[all:vars]
inventory_var_good="{{ playbook_var_good }}"
inventory_var_bad="{{ playbook_var_bad }}"
- hosts: all
vars:
playbook_var_good: "ok"
playbook_var_bad: "{{ undefined_var }}"
tasks:
- debug: msg="{{ playbook_var_good }}"
- debug: msg="{{ playbook_var_bad }}"
- hosts: all
vars:
playbook_var_good: "ok"
playbook_var_bad: "{{ undefined_var }}"
tasks:
- debug: msg="{{ inventory_var_good }}"
- debug: msg="{{ inventory_var_bad }}"
host1
host2
[group]
host1
host2
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment