Prototype test for ansible-runner. (#44803)
* Prototype test for ansible-runner. Based on https://github.com/ansible/ansible/pull/44746 * Limit test to RHEL 7 and CentOS 7.
This commit is contained in:
parent
1fdd0e10bb
commit
4b9c2cb97d
8 changed files with 138 additions and 0 deletions
4
test/integration/targets/ansible-runner/aliases
Normal file
4
test/integration/targets/ansible-runner/aliases
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
shippable/posix/group3
|
||||||
|
skip/python3
|
||||||
|
skip/osx
|
||||||
|
skip/freebsd
|
|
@ -0,0 +1,26 @@
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import ansible_runner
|
||||||
|
|
||||||
|
# the first positional arg should be where the artifacts live
|
||||||
|
output_dir = sys.argv[1]
|
||||||
|
|
||||||
|
# this calls a single module directly, aka "adhoc" mode
|
||||||
|
r = ansible_runner.run(
|
||||||
|
private_data_dir=output_dir,
|
||||||
|
host_pattern='localhost',
|
||||||
|
module='shell',
|
||||||
|
module_args='whoami'
|
||||||
|
)
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'rc': r.rc,
|
||||||
|
'status': r.status,
|
||||||
|
'events': [x['event'] for x in r.events],
|
||||||
|
'stats': r.stats
|
||||||
|
}
|
||||||
|
|
||||||
|
# insert this header for the flask controller
|
||||||
|
print('#STARTJSON')
|
||||||
|
json.dump(data, sys.stdout)
|
|
@ -0,0 +1,38 @@
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import ansible_runner
|
||||||
|
|
||||||
|
|
||||||
|
PLAYBOOK = '''
|
||||||
|
- hosts: localhost
|
||||||
|
gather_facts: False
|
||||||
|
tasks:
|
||||||
|
- set_fact:
|
||||||
|
foo: bar
|
||||||
|
'''
|
||||||
|
|
||||||
|
# the first positional arg should be where the artifacts live
|
||||||
|
output_dir = sys.argv[1]
|
||||||
|
|
||||||
|
invdir = os.path.join(output_dir, 'inventory')
|
||||||
|
if not os.path.isdir(invdir):
|
||||||
|
os.makedirs(invdir)
|
||||||
|
with open(os.path.join(invdir, 'hosts'), 'w') as f:
|
||||||
|
f.write('localhost\n')
|
||||||
|
pbfile = os.path.join(output_dir, 'test.yml')
|
||||||
|
with open(pbfile, 'w') as f:
|
||||||
|
f.write(PLAYBOOK)
|
||||||
|
|
||||||
|
r = ansible_runner.run(private_data_dir=output_dir, playbook='test.yml')
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'rc': r.rc,
|
||||||
|
'status': r.status,
|
||||||
|
'events': [x['event'] for x in r.events],
|
||||||
|
'stats': r.stats
|
||||||
|
}
|
||||||
|
|
||||||
|
# insert this header for the flask controller
|
||||||
|
print('#STARTJSON')
|
||||||
|
json.dump(data, sys.stdout)
|
|
@ -0,0 +1,17 @@
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import re
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
def parse_json(value):
|
||||||
|
return json.dumps(json.loads(re.sub('^.*\n#STARTJSON\n', '', value, flags=re.DOTALL)), indent=4, sort_keys=True)
|
||||||
|
|
||||||
|
|
||||||
|
class FilterModule(object):
|
||||||
|
def filters(self):
|
||||||
|
return {
|
||||||
|
'parse_json': parse_json,
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
- name: execute the script
|
||||||
|
command: "'{{ ansible_python_interpreter }}' '{{ role_path }}/files/adhoc_example1.py' '{{ output_dir }}'"
|
||||||
|
environment:
|
||||||
|
AWX_LIB_DIRECTORY: "{{ callback_path }}"
|
||||||
|
register: script
|
||||||
|
|
||||||
|
- name: parse script output
|
||||||
|
# work around for ansible-runner showing ansible warnings on stdout
|
||||||
|
set_fact:
|
||||||
|
adexec1_json: "{{ script.stdout | parse_json }}"
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- "adexec1_json.rc == 0"
|
||||||
|
- "adexec1_json.events|length == 2"
|
||||||
|
- "'localhost' in adexec1_json.stats.ok"
|
5
test/integration/targets/ansible-runner/tasks/main.yml
Normal file
5
test/integration/targets/ansible-runner/tasks/main.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
- block:
|
||||||
|
- include_tasks: setup.yml
|
||||||
|
- include_tasks: adhoc_example1.yml
|
||||||
|
- include_tasks: playbook_example1.yml
|
||||||
|
when: ansible_distribution in ('RedHat', 'CentOS') and ansible_distribution_major_version == '7'
|
|
@ -0,0 +1,16 @@
|
||||||
|
- name: execute the script
|
||||||
|
command: "'{{ ansible_python_interpreter }}' '{{ role_path }}/files/playbook_example1.py' '{{ output_dir }}'"
|
||||||
|
environment:
|
||||||
|
AWX_LIB_DIRECTORY: "{{ callback_path }}"
|
||||||
|
register: script
|
||||||
|
|
||||||
|
- name: parse script output
|
||||||
|
# work around for ansible-runner showing ansible warnings on stdout
|
||||||
|
set_fact:
|
||||||
|
pbexec_json: "{{ script.stdout | parse_json }}"
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- "pbexec_json.rc == 0"
|
||||||
|
- "pbexec_json.events|length == 5"
|
||||||
|
- "'localhost' in pbexec_json.stats.ok"
|
16
test/integration/targets/ansible-runner/tasks/setup.yml
Normal file
16
test/integration/targets/ansible-runner/tasks/setup.yml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
- name: Install docutils
|
||||||
|
pip:
|
||||||
|
name: docutils
|
||||||
|
|
||||||
|
- name: Install ansible-runner
|
||||||
|
pip:
|
||||||
|
name: ansible-runner
|
||||||
|
|
||||||
|
- name: Find location of ansible-runner installation
|
||||||
|
command: "'{{ ansible_python_interpreter }}' -c 'import os, ansible_runner; print(os.path.dirname(ansible_runner.__file__))'"
|
||||||
|
register: ansible_runner_path
|
||||||
|
|
||||||
|
# work around for https://github.com/ansible/ansible-runner/issues/132
|
||||||
|
- name: Set callback path to work around ansible-runner bug
|
||||||
|
set_fact:
|
||||||
|
callback_path: ":{{ ansible_runner_path.stdout }}/callbacks"
|
Loading…
Reference in a new issue