summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Henkel <tobias.henkel@bmw.de>2019-01-19 18:06:56 +0100
committerTobias Henkel <tobias.henkel@bmw.de>2019-03-15 09:09:50 +0100
commitfed4d627ced02c87988652959dce14106f1d4bc6 (patch)
tree7ec5092bfdb8e0e94ea358a41fba0d8b6872d7cc
parent6504f24caab4cda0372f50e1f3dd0c873ca91b22 (diff)
downloadzuul-fed4d627ced02c87988652959dce14106f1d4bc6.tar.gz
Support ansible 2.7
We should keep up with recent ansible versions so support 2.7. Change-Id: Ic4234784f104690d72cfac71e09ecd170ccce1b5
-rw-r--r--.zuul.yaml14
-rw-r--r--releasenotes/notes/ansible-2.7-e4db1ec0440446be.yaml4
-rw-r--r--tests/fixtures/config/ansible-versions/git/common-config/zuul.yaml9
-rwxr-xr-xtests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_exception.py15
-rwxr-xr-xtests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_no_result.py (renamed from tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module.py)0
-rw-r--r--tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/module_failure_exception.yaml (renamed from tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/module_failure.yaml)2
-rw-r--r--tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/module_failure_no_result.yaml6
-rw-r--r--tests/remote/test_remote_action_modules.py4
-rw-r--r--tests/remote/test_remote_zuul_json.py4
-rw-r--r--tests/remote/test_remote_zuul_stream.py31
-rw-r--r--tests/unit/test_v3.py5
l---------zuul/ansible/2.7/action/__init__.py1
l---------zuul/ansible/2.7/action/add_host.py1
l---------zuul/ansible/2.7/action/add_host.pyi1
l---------zuul/ansible/2.7/action/aireos.py1
l---------zuul/ansible/2.7/action/aireos.pyi1
l---------zuul/ansible/2.7/action/aireos_config.py1
l---------zuul/ansible/2.7/action/aireos_config.pyi1
l---------zuul/ansible/2.7/action/aruba.py1
l---------zuul/ansible/2.7/action/aruba.pyi1
l---------zuul/ansible/2.7/action/aruba_config.py1
l---------zuul/ansible/2.7/action/aruba_config.pyi1
l---------zuul/ansible/2.7/action/asa.py1
l---------zuul/ansible/2.7/action/asa.pyi1
l---------zuul/ansible/2.7/action/asa_config.py1
l---------zuul/ansible/2.7/action/asa_config.pyi1
l---------zuul/ansible/2.7/action/asa_template.py1
l---------zuul/ansible/2.7/action/asa_template.pyi1
l---------zuul/ansible/2.7/action/assemble.py1
l---------zuul/ansible/2.7/action/assemble.pyi1
l---------zuul/ansible/2.7/action/aws_s3.py1
l---------zuul/ansible/2.7/action/aws_s3.pyi1
l---------zuul/ansible/2.7/action/ce.py1
l---------zuul/ansible/2.7/action/ce.pyi1
l---------zuul/ansible/2.7/action/ce_config.py1
l---------zuul/ansible/2.7/action/ce_config.pyi1
l---------zuul/ansible/2.7/action/ce_template.py1
l---------zuul/ansible/2.7/action/ce_template.pyi1
l---------zuul/ansible/2.7/action/copy.py1
l---------zuul/ansible/2.7/action/copy.pyi1
l---------zuul/ansible/2.7/action/dellos10_config.py1
l---------zuul/ansible/2.7/action/dellos10_config.pyi1
l---------zuul/ansible/2.7/action/dellos6_config.py1
l---------zuul/ansible/2.7/action/dellos6_config.pyi1
l---------zuul/ansible/2.7/action/dellos9_config.py1
l---------zuul/ansible/2.7/action/dellos9_config.pyi1
l---------zuul/ansible/2.7/action/eos_config.py1
l---------zuul/ansible/2.7/action/eos_config.pyi1
l---------zuul/ansible/2.7/action/eos_template.py1
l---------zuul/ansible/2.7/action/eos_template.pyi1
l---------zuul/ansible/2.7/action/fetch.py1
l---------zuul/ansible/2.7/action/fetch.pyi1
l---------zuul/ansible/2.7/action/fortios_config.py1
l---------zuul/ansible/2.7/action/fortios_config.pyi1
l---------zuul/ansible/2.7/action/include_vars.py1
l---------zuul/ansible/2.7/action/include_vars.pyi1
l---------zuul/ansible/2.7/action/ios_config.py1
l---------zuul/ansible/2.7/action/ios_config.pyi1
l---------zuul/ansible/2.7/action/ios_template.py1
l---------zuul/ansible/2.7/action/ios_template.pyi1
l---------zuul/ansible/2.7/action/iosxr_config.py1
l---------zuul/ansible/2.7/action/iosxr_config.pyi1
l---------zuul/ansible/2.7/action/iosxr_template.py1
l---------zuul/ansible/2.7/action/iosxr_template.pyi1
l---------zuul/ansible/2.7/action/junos_config.py1
l---------zuul/ansible/2.7/action/junos_config.pyi1
l---------zuul/ansible/2.7/action/junos_template.py1
l---------zuul/ansible/2.7/action/junos_template.pyi1
l---------zuul/ansible/2.7/action/net_banner.py1
l---------zuul/ansible/2.7/action/net_banner.pyi1
l---------zuul/ansible/2.7/action/net_base.py1
l---------zuul/ansible/2.7/action/net_base.pyi1
l---------zuul/ansible/2.7/action/net_config.py1
l---------zuul/ansible/2.7/action/net_config.pyi1
l---------zuul/ansible/2.7/action/net_get.py1
l---------zuul/ansible/2.7/action/net_get.pyi1
l---------zuul/ansible/2.7/action/net_interface.py1
l---------zuul/ansible/2.7/action/net_interface.pyi1
l---------zuul/ansible/2.7/action/net_l2_interface.py1
l---------zuul/ansible/2.7/action/net_l2_interface.pyi1
l---------zuul/ansible/2.7/action/net_l3_interface.py1
l---------zuul/ansible/2.7/action/net_l3_interface.pyi1
l---------zuul/ansible/2.7/action/net_linkagg.py1
l---------zuul/ansible/2.7/action/net_linkagg.pyi1
l---------zuul/ansible/2.7/action/net_lldp.py1
l---------zuul/ansible/2.7/action/net_lldp.pyi1
l---------zuul/ansible/2.7/action/net_lldp_interface.py1
l---------zuul/ansible/2.7/action/net_lldp_interface.pyi1
l---------zuul/ansible/2.7/action/net_logging.py1
l---------zuul/ansible/2.7/action/net_logging.pyi1
l---------zuul/ansible/2.7/action/net_ping.py1
l---------zuul/ansible/2.7/action/net_ping.pyi1
l---------zuul/ansible/2.7/action/net_static_route.py1
l---------zuul/ansible/2.7/action/net_static_route.pyi1
l---------zuul/ansible/2.7/action/net_system.py1
l---------zuul/ansible/2.7/action/net_system.pyi1
l---------zuul/ansible/2.7/action/net_template.py1
l---------zuul/ansible/2.7/action/net_template.pyi1
l---------zuul/ansible/2.7/action/net_user.py1
l---------zuul/ansible/2.7/action/net_user.pyi1
l---------zuul/ansible/2.7/action/net_vlan.py1
l---------zuul/ansible/2.7/action/net_vlan.pyi1
l---------zuul/ansible/2.7/action/net_vrf.py1
l---------zuul/ansible/2.7/action/net_vrf.pyi1
l---------zuul/ansible/2.7/action/netconf_config.py1
l---------zuul/ansible/2.7/action/netconf_config.pyi1
l---------zuul/ansible/2.7/action/network.py1
l---------zuul/ansible/2.7/action/network.pyi1
l---------zuul/ansible/2.7/action/normal.py1
l---------zuul/ansible/2.7/action/normal.pyi1
l---------zuul/ansible/2.7/action/nxos_config.py1
l---------zuul/ansible/2.7/action/nxos_config.pyi1
l---------zuul/ansible/2.7/action/nxos_template.py1
l---------zuul/ansible/2.7/action/nxos_template.pyi1
l---------zuul/ansible/2.7/action/ops_config.py1
l---------zuul/ansible/2.7/action/ops_config.pyi1
l---------zuul/ansible/2.7/action/ops_template.py1
l---------zuul/ansible/2.7/action/ops_template.pyi1
l---------zuul/ansible/2.7/action/patch.py1
l---------zuul/ansible/2.7/action/patch.pyi1
l---------zuul/ansible/2.7/action/raw.py1
l---------zuul/ansible/2.7/action/raw.pyi1
l---------zuul/ansible/2.7/action/script.py1
l---------zuul/ansible/2.7/action/script.pyi1
l---------zuul/ansible/2.7/action/sros_config.py1
l---------zuul/ansible/2.7/action/sros_config.pyi1
l---------zuul/ansible/2.7/action/synchronize.py1
l---------zuul/ansible/2.7/action/synchronize.pyi1
l---------zuul/ansible/2.7/action/template.py1
l---------zuul/ansible/2.7/action/template.pyi1
l---------zuul/ansible/2.7/action/unarchive.py1
l---------zuul/ansible/2.7/action/unarchive.pyi1
l---------zuul/ansible/2.7/action/uri.py1
l---------zuul/ansible/2.7/action/uri.pyi1
l---------zuul/ansible/2.7/action/vyos_config.py1
l---------zuul/ansible/2.7/action/vyos_config.pyi1
l---------zuul/ansible/2.7/action/win_copy.py1
l---------zuul/ansible/2.7/action/win_copy.pyi1
l---------zuul/ansible/2.7/action/win_template.py1
l---------zuul/ansible/2.7/action/win_template.pyi1
l---------zuul/ansible/2.7/actiongeneral/__init__.py1
l---------zuul/ansible/2.7/actiongeneral/command.py1
l---------zuul/ansible/2.7/actiongeneral/command.pyi1
l---------zuul/ansible/2.7/actiongeneral/zuul_return.py1
l---------zuul/ansible/2.7/callback/__init__.py1
l---------zuul/ansible/2.7/callback/zuul_json.py1
l---------zuul/ansible/2.7/callback/zuul_stream.py1
l---------zuul/ansible/2.7/callback/zuul_unreachable.py1
l---------zuul/ansible/2.7/filter/__init__.py1
l---------zuul/ansible/2.7/filter/zuul_filters.py1
l---------zuul/ansible/2.7/library/__init__.py1
l---------zuul/ansible/2.7/library/command.py1
l---------zuul/ansible/2.7/library/zuul_console.py1
l---------zuul/ansible/2.7/logconfig.py1
l---------zuul/ansible/2.7/lookup/__init__.py1
l---------zuul/ansible/2.7/lookup/_banned.py1
l---------zuul/ansible/2.7/lookup/_banned.pyi1
l---------zuul/ansible/2.7/lookup/chef_databag.py1
l---------zuul/ansible/2.7/lookup/chef_databag.pyi1
l---------zuul/ansible/2.7/lookup/consul_kv.py1
l---------zuul/ansible/2.7/lookup/consul_kv.pyi1
l---------zuul/ansible/2.7/lookup/credstash.py1
l---------zuul/ansible/2.7/lookup/credstash.pyi1
l---------zuul/ansible/2.7/lookup/csvfile.py1
l---------zuul/ansible/2.7/lookup/csvfile.pyi1
l---------zuul/ansible/2.7/lookup/cyberarkpassword.py1
l---------zuul/ansible/2.7/lookup/cyberarkpassword.pyi1
l---------zuul/ansible/2.7/lookup/dig.py1
l---------zuul/ansible/2.7/lookup/dig.pyi1
l---------zuul/ansible/2.7/lookup/dnstxt.py1
l---------zuul/ansible/2.7/lookup/dnstxt.pyi1
l---------zuul/ansible/2.7/lookup/env.py1
l---------zuul/ansible/2.7/lookup/env.pyi1
l---------zuul/ansible/2.7/lookup/etcd.py1
l---------zuul/ansible/2.7/lookup/etcd.pyi1
l---------zuul/ansible/2.7/lookup/file.py1
l---------zuul/ansible/2.7/lookup/file.pyi1
l---------zuul/ansible/2.7/lookup/fileglob.py1
l---------zuul/ansible/2.7/lookup/fileglob.pyi1
l---------zuul/ansible/2.7/lookup/filetree.py1
l---------zuul/ansible/2.7/lookup/filetree.pyi1
l---------zuul/ansible/2.7/lookup/first_found.py1
l---------zuul/ansible/2.7/lookup/first_found.pyi1
l---------zuul/ansible/2.7/lookup/hashi_valut.py1
l---------zuul/ansible/2.7/lookup/hashi_valut.pyi1
l---------zuul/ansible/2.7/lookup/hiera.py1
l---------zuul/ansible/2.7/lookup/hiera.pyi1
l---------zuul/ansible/2.7/lookup/ini.py1
l---------zuul/ansible/2.7/lookup/ini.pyi1
l---------zuul/ansible/2.7/lookup/keyring.py1
l---------zuul/ansible/2.7/lookup/keyring.pyi1
l---------zuul/ansible/2.7/lookup/lastpass.py1
l---------zuul/ansible/2.7/lookup/lastpass.pyi1
l---------zuul/ansible/2.7/lookup/lines.py1
l---------zuul/ansible/2.7/lookup/lines.pyi1
l---------zuul/ansible/2.7/lookup/mongodb.py1
l---------zuul/ansible/2.7/lookup/mongodb.pyi1
l---------zuul/ansible/2.7/lookup/password.py1
l---------zuul/ansible/2.7/lookup/password.pyi1
l---------zuul/ansible/2.7/lookup/passwordstore.py1
l---------zuul/ansible/2.7/lookup/passwordstore.pyi1
l---------zuul/ansible/2.7/lookup/pipe.py1
l---------zuul/ansible/2.7/lookup/pipe.pyi1
l---------zuul/ansible/2.7/lookup/redis_kv.py1
l---------zuul/ansible/2.7/lookup/redis_kv.pyi1
l---------zuul/ansible/2.7/lookup/shelvefile.py1
l---------zuul/ansible/2.7/lookup/shelvefile.pyi1
l---------zuul/ansible/2.7/lookup/template.py1
l---------zuul/ansible/2.7/lookup/template.pyi1
l---------zuul/ansible/2.7/lookup/url.py1
l---------zuul/ansible/2.7/lookup/url.pyi1
l---------zuul/ansible/2.7/paths.py1
-rw-r--r--zuul/ansible/base/action/uri.py35
-rw-r--r--zuul/ansible/base/action/uri.pyi0
-rw-r--r--zuul/ansible/base/callback/zuul_stream.py8
-rw-r--r--zuul/lib/ansible-config.conf3
216 files changed, 332 insertions, 9 deletions
diff --git a/.zuul.yaml b/.zuul.yaml
index 5e798a304..a594c2041 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -40,6 +40,12 @@
zuul_ansible_version: 2.6
- job:
+ name: zuul-stream-functional-2.7
+ parent: zuul-stream-functional
+ vars:
+ zuul_ansible_version: 2.7
+
+- job:
name: zuul-tox-remote
parent: tox
vars:
@@ -156,7 +162,7 @@
parent: upload-docker-image
description: Build Docker images and upload to Docker Hub.
allowed-projects: openstack-infra/zuul
- secrets:
+ secrets:
name: docker_credentials
secret: zuul-dockerhub
pass-to-parent: true
@@ -185,10 +191,12 @@
- zuul/cmd/migrate.py
- playbooks/zuul-migrate/.*
nodeset: ubuntu-xenial
+ timeout: 2700 # 45 minutes
- tox-py36:
irrelevant-files:
- zuul/cmd/migrate.py
- playbooks/zuul-migrate/.*
+ timeout: 2700 # 45 minutes
- zuul-build-dashboard
- zuul-build-dashboard-multi-tenant
- nodejs-npm-run-lint:
@@ -204,6 +212,7 @@
- web/.*
- zuul-stream-functional-2.5
- zuul-stream-functional-2.6
+ - zuul-stream-functional-2.7
- zuul-tox-remote
- zuul-quick-start
- nodepool-zuul-functional:
@@ -218,10 +227,12 @@
- zuul/cmd/migrate.py
- playbooks/zuul-migrate/.*
nodeset: ubuntu-xenial
+ timeout: 2700 # 45 minutes
- tox-py36:
irrelevant-files:
- zuul/cmd/migrate.py
- playbooks/zuul-migrate/.*
+ timeout: 2700 # 45 minutes
- zuul-build-dashboard
- nodejs-npm-run-lint:
vars:
@@ -236,6 +247,7 @@
- web/.*
- zuul-stream-functional-2.5
- zuul-stream-functional-2.6
+ - zuul-stream-functional-2.7
- zuul-tox-remote
- zuul-quick-start
- zuul-upload-image
diff --git a/releasenotes/notes/ansible-2.7-e4db1ec0440446be.yaml b/releasenotes/notes/ansible-2.7-e4db1ec0440446be.yaml
new file mode 100644
index 000000000..ce569b465
--- /dev/null
+++ b/releasenotes/notes/ansible-2.7-e4db1ec0440446be.yaml
@@ -0,0 +1,4 @@
+---
+features:
+ - |
+ Zuul now supports ansible 2.7 for running jobs.
diff --git a/tests/fixtures/config/ansible-versions/git/common-config/zuul.yaml b/tests/fixtures/config/ansible-versions/git/common-config/zuul.yaml
index 38cca9f22..c25841c40 100644
--- a/tests/fixtures/config/ansible-versions/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/ansible-versions/git/common-config/zuul.yaml
@@ -43,6 +43,14 @@
test_ansible_version_major: 2
test_ansible_version_minor: 6
+- job:
+ name: ansible-27
+ parent: ansible-version
+ ansible-version: 2.7
+ vars:
+ test_ansible_version_major: 2
+ test_ansible_version_minor: 7
+
- project:
name: common-config
@@ -51,3 +59,4 @@
- ansible-default
- ansible-25
- ansible-26
+ - ansible-27
diff --git a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_exception.py b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_exception.py
new file mode 100755
index 000000000..6cfa0a3d0
--- /dev/null
+++ b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_exception.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python
+
+
+def main():
+ raise Exception('This module is broken')
+
+
+try:
+ from ansible.module_utils.basic import * # noqa
+except ImportError:
+ pass
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module.py b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_no_result.py
index 065509d0d..065509d0d 100755
--- a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module.py
+++ b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/library/broken_module_no_result.py
diff --git a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/module_failure.yaml b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/module_failure_exception.yaml
index cd61e2ae8..a37b03675 100644
--- a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/module_failure.yaml
+++ b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/module_failure_exception.yaml
@@ -3,4 +3,4 @@
- name: Start zuul_console daemon
zuul_console:
- name: Module failure
- broken_module:
+ broken_module_exception:
diff --git a/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/module_failure_no_result.yaml b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/module_failure_no_result.yaml
new file mode 100644
index 000000000..ed71c9ab7
--- /dev/null
+++ b/tests/fixtures/config/remote-zuul-stream/git/org_project/playbooks/module_failure_no_result.yaml
@@ -0,0 +1,6 @@
+- hosts: all
+ tasks:
+ - name: Start zuul_console daemon
+ zuul_console:
+ - name: Module failure
+ broken_module_no_result:
diff --git a/tests/remote/test_remote_action_modules.py b/tests/remote/test_remote_action_modules.py
index 086ecb603..64c802388 100644
--- a/tests/remote/test_remote_action_modules.py
+++ b/tests/remote/test_remote_action_modules.py
@@ -215,3 +215,7 @@ class TestActionModules25(AnsibleZuulTestCase):
class TestActionModules26(TestActionModules25):
ansible_version = '2.6'
+
+
+class TestActionModules27(TestActionModules25):
+ ansible_version = '2.7'
diff --git a/tests/remote/test_remote_zuul_json.py b/tests/remote/test_remote_zuul_json.py
index 3dce04cec..ec2d2a04b 100644
--- a/tests/remote/test_remote_zuul_json.py
+++ b/tests/remote/test_remote_zuul_json.py
@@ -146,3 +146,7 @@ class TestZuulJSON25(AnsibleZuulTestCase):
class TestZuulJSON26(TestZuulJSON25):
ansible_version = '2.6'
+
+
+class TestZuulJSON27(TestZuulJSON25):
+ ansible_version = '2.7'
diff --git a/tests/remote/test_remote_zuul_stream.py b/tests/remote/test_remote_zuul_stream.py
index 752735d94..8e869b150 100644
--- a/tests/remote/test_remote_zuul_stream.py
+++ b/tests/remote/test_remote_zuul_stream.py
@@ -156,8 +156,8 @@ class TestZuulStream25(AnsibleZuulTestCase):
r'RUN END RESULT_NORMAL: \[untrusted : review.example.com/'
r'org/project/playbooks/command.yaml@master]', text)
- def test_module_failure(self):
- job = self._run_job('module_failure')
+ def test_module_exception(self):
+ job = self._run_job('module_failure_exception')
with self.jobLog(job):
build = self.history[-1]
self.assertEqual(build.result, 'FAILURE')
@@ -165,8 +165,33 @@ class TestZuulStream25(AnsibleZuulTestCase):
text = self._get_job_output(build)
self.assertLogLine(r'TASK \[Module failure\]', text)
self.assertLogLine(
- r'controller \| MODULE FAILURE: This module is broken', text)
+ r'controller \| MODULE FAILURE:', text)
+ self.assertLogLine(
+ r'controller \| Exception: This module is broken', text)
+
+ def test_module_no_result(self):
+ job = self._run_job('module_failure_no_result')
+ with self.jobLog(job):
+ build = self.history[-1]
+ self.assertEqual(build.result, 'FAILURE')
+
+ text = self._get_job_output(build)
+ self.assertLogLine(r'TASK \[Module failure\]', text)
+
+ if self.ansible_version in ('2.5', '2.6'):
+ regex = r'controller \| MODULE FAILURE: This module is broken'
+ else:
+ # Ansible starting with 2.7 emits a different error message
+ # if a module exits without an exception or the ansible
+ # supplied methods.
+ regex = r'controller \| "msg": "New-style module did not ' \
+ r'handle its own exit"'
+ self.assertLogLine(regex, text)
class TestZuulStream26(TestZuulStream25):
ansible_version = '2.6'
+
+
+class TestZuulStream27(TestZuulStream25):
+ ansible_version = '2.7'
diff --git a/tests/unit/test_v3.py b/tests/unit/test_v3.py
index 294fc15cb..24725346b 100644
--- a/tests/unit/test_v3.py
+++ b/tests/unit/test_v3.py
@@ -2443,6 +2443,10 @@ class TestAnsible26(TestAnsible25):
ansible_version = '2.6'
+class TestAnsible27(TestAnsible25):
+ ansible_version = '2.7'
+
+
class TestPrePlaybooks(AnsibleZuulTestCase):
# A temporary class to hold new tests while others are disabled
@@ -5309,4 +5313,5 @@ class TestAnsibleVersion(AnsibleZuulTestCase):
dict(name='ansible-default', result='SUCCESS', changes='1,1'),
dict(name='ansible-25', result='SUCCESS', changes='1,1'),
dict(name='ansible-26', result='SUCCESS', changes='1,1'),
+ dict(name='ansible-27', result='SUCCESS', changes='1,1'),
], ordered=False)
diff --git a/zuul/ansible/2.7/action/__init__.py b/zuul/ansible/2.7/action/__init__.py
new file mode 120000
index 000000000..4048e7ac1
--- /dev/null
+++ b/zuul/ansible/2.7/action/__init__.py
@@ -0,0 +1 @@
+../../base/action/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/add_host.py b/zuul/ansible/2.7/action/add_host.py
new file mode 120000
index 000000000..fdb7f466b
--- /dev/null
+++ b/zuul/ansible/2.7/action/add_host.py
@@ -0,0 +1 @@
+../../base/action/add_host.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/add_host.pyi b/zuul/ansible/2.7/action/add_host.pyi
new file mode 120000
index 000000000..9257939ce
--- /dev/null
+++ b/zuul/ansible/2.7/action/add_host.pyi
@@ -0,0 +1 @@
+../../base/action/add_host.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/aireos.py b/zuul/ansible/2.7/action/aireos.py
new file mode 120000
index 000000000..f2459ab86
--- /dev/null
+++ b/zuul/ansible/2.7/action/aireos.py
@@ -0,0 +1 @@
+../../base/action/aireos.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/aireos.pyi b/zuul/ansible/2.7/action/aireos.pyi
new file mode 120000
index 000000000..f58722a86
--- /dev/null
+++ b/zuul/ansible/2.7/action/aireos.pyi
@@ -0,0 +1 @@
+../../base/action/aireos.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/aireos_config.py b/zuul/ansible/2.7/action/aireos_config.py
new file mode 120000
index 000000000..acc0dd85e
--- /dev/null
+++ b/zuul/ansible/2.7/action/aireos_config.py
@@ -0,0 +1 @@
+../../base/action/aireos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/aireos_config.pyi b/zuul/ansible/2.7/action/aireos_config.pyi
new file mode 120000
index 000000000..fc7b16cf6
--- /dev/null
+++ b/zuul/ansible/2.7/action/aireos_config.pyi
@@ -0,0 +1 @@
+../../base/action/aireos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/aruba.py b/zuul/ansible/2.7/action/aruba.py
new file mode 120000
index 000000000..8784b92ed
--- /dev/null
+++ b/zuul/ansible/2.7/action/aruba.py
@@ -0,0 +1 @@
+../../base/action/aruba.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/aruba.pyi b/zuul/ansible/2.7/action/aruba.pyi
new file mode 120000
index 000000000..228b3ecfe
--- /dev/null
+++ b/zuul/ansible/2.7/action/aruba.pyi
@@ -0,0 +1 @@
+../../base/action/aruba.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/aruba_config.py b/zuul/ansible/2.7/action/aruba_config.py
new file mode 120000
index 000000000..f50d9082b
--- /dev/null
+++ b/zuul/ansible/2.7/action/aruba_config.py
@@ -0,0 +1 @@
+../../base/action/aruba_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/aruba_config.pyi b/zuul/ansible/2.7/action/aruba_config.pyi
new file mode 120000
index 000000000..bab9d28fd
--- /dev/null
+++ b/zuul/ansible/2.7/action/aruba_config.pyi
@@ -0,0 +1 @@
+../../base/action/aruba_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/asa.py b/zuul/ansible/2.7/action/asa.py
new file mode 120000
index 000000000..3e7e93dc0
--- /dev/null
+++ b/zuul/ansible/2.7/action/asa.py
@@ -0,0 +1 @@
+../../base/action/asa.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/asa.pyi b/zuul/ansible/2.7/action/asa.pyi
new file mode 120000
index 000000000..e0cdc24b5
--- /dev/null
+++ b/zuul/ansible/2.7/action/asa.pyi
@@ -0,0 +1 @@
+../../base/action/asa.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/asa_config.py b/zuul/ansible/2.7/action/asa_config.py
new file mode 120000
index 000000000..598f400d5
--- /dev/null
+++ b/zuul/ansible/2.7/action/asa_config.py
@@ -0,0 +1 @@
+../../base/action/asa_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/asa_config.pyi b/zuul/ansible/2.7/action/asa_config.pyi
new file mode 120000
index 000000000..86fe03484
--- /dev/null
+++ b/zuul/ansible/2.7/action/asa_config.pyi
@@ -0,0 +1 @@
+../../base/action/asa_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/asa_template.py b/zuul/ansible/2.7/action/asa_template.py
new file mode 120000
index 000000000..e1e8eecbe
--- /dev/null
+++ b/zuul/ansible/2.7/action/asa_template.py
@@ -0,0 +1 @@
+../../base/action/asa_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/asa_template.pyi b/zuul/ansible/2.7/action/asa_template.pyi
new file mode 120000
index 000000000..0753101f1
--- /dev/null
+++ b/zuul/ansible/2.7/action/asa_template.pyi
@@ -0,0 +1 @@
+../../base/action/asa_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/assemble.py b/zuul/ansible/2.7/action/assemble.py
new file mode 120000
index 000000000..22273b123
--- /dev/null
+++ b/zuul/ansible/2.7/action/assemble.py
@@ -0,0 +1 @@
+../../base/action/assemble.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/assemble.pyi b/zuul/ansible/2.7/action/assemble.pyi
new file mode 120000
index 000000000..3a7074ec7
--- /dev/null
+++ b/zuul/ansible/2.7/action/assemble.pyi
@@ -0,0 +1 @@
+../../base/action/assemble.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/aws_s3.py b/zuul/ansible/2.7/action/aws_s3.py
new file mode 120000
index 000000000..a2dabf9f8
--- /dev/null
+++ b/zuul/ansible/2.7/action/aws_s3.py
@@ -0,0 +1 @@
+../../base/action/aws_s3.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/aws_s3.pyi b/zuul/ansible/2.7/action/aws_s3.pyi
new file mode 120000
index 000000000..5ac40a7db
--- /dev/null
+++ b/zuul/ansible/2.7/action/aws_s3.pyi
@@ -0,0 +1 @@
+../../base/action/aws_s3.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ce.py b/zuul/ansible/2.7/action/ce.py
new file mode 120000
index 000000000..db95d9121
--- /dev/null
+++ b/zuul/ansible/2.7/action/ce.py
@@ -0,0 +1 @@
+../../base/action/ce.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ce.pyi b/zuul/ansible/2.7/action/ce.pyi
new file mode 120000
index 000000000..ba2365f2b
--- /dev/null
+++ b/zuul/ansible/2.7/action/ce.pyi
@@ -0,0 +1 @@
+../../base/action/ce.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ce_config.py b/zuul/ansible/2.7/action/ce_config.py
new file mode 120000
index 000000000..ec0319843
--- /dev/null
+++ b/zuul/ansible/2.7/action/ce_config.py
@@ -0,0 +1 @@
+../../base/action/ce_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ce_config.pyi b/zuul/ansible/2.7/action/ce_config.pyi
new file mode 120000
index 000000000..b762785d1
--- /dev/null
+++ b/zuul/ansible/2.7/action/ce_config.pyi
@@ -0,0 +1 @@
+../../base/action/ce_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ce_template.py b/zuul/ansible/2.7/action/ce_template.py
new file mode 120000
index 000000000..aa59e80a0
--- /dev/null
+++ b/zuul/ansible/2.7/action/ce_template.py
@@ -0,0 +1 @@
+../../base/action/ce_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ce_template.pyi b/zuul/ansible/2.7/action/ce_template.pyi
new file mode 120000
index 000000000..75ba2250c
--- /dev/null
+++ b/zuul/ansible/2.7/action/ce_template.pyi
@@ -0,0 +1 @@
+../../base/action/ce_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/copy.py b/zuul/ansible/2.7/action/copy.py
new file mode 120000
index 000000000..1c0c2291f
--- /dev/null
+++ b/zuul/ansible/2.7/action/copy.py
@@ -0,0 +1 @@
+../../base/action/copy.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/copy.pyi b/zuul/ansible/2.7/action/copy.pyi
new file mode 120000
index 000000000..189722f2a
--- /dev/null
+++ b/zuul/ansible/2.7/action/copy.pyi
@@ -0,0 +1 @@
+../../base/action/copy.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/dellos10_config.py b/zuul/ansible/2.7/action/dellos10_config.py
new file mode 120000
index 000000000..caf6ce6c3
--- /dev/null
+++ b/zuul/ansible/2.7/action/dellos10_config.py
@@ -0,0 +1 @@
+../../base/action/dellos10_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/dellos10_config.pyi b/zuul/ansible/2.7/action/dellos10_config.pyi
new file mode 120000
index 000000000..ede9a927e
--- /dev/null
+++ b/zuul/ansible/2.7/action/dellos10_config.pyi
@@ -0,0 +1 @@
+../../base/action/dellos10_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/dellos6_config.py b/zuul/ansible/2.7/action/dellos6_config.py
new file mode 120000
index 000000000..080fcce4c
--- /dev/null
+++ b/zuul/ansible/2.7/action/dellos6_config.py
@@ -0,0 +1 @@
+../../base/action/dellos6_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/dellos6_config.pyi b/zuul/ansible/2.7/action/dellos6_config.pyi
new file mode 120000
index 000000000..d5cf3ce15
--- /dev/null
+++ b/zuul/ansible/2.7/action/dellos6_config.pyi
@@ -0,0 +1 @@
+../../base/action/dellos6_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/dellos9_config.py b/zuul/ansible/2.7/action/dellos9_config.py
new file mode 120000
index 000000000..c2e79870c
--- /dev/null
+++ b/zuul/ansible/2.7/action/dellos9_config.py
@@ -0,0 +1 @@
+../../base/action/dellos9_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/dellos9_config.pyi b/zuul/ansible/2.7/action/dellos9_config.pyi
new file mode 120000
index 000000000..b50389ab4
--- /dev/null
+++ b/zuul/ansible/2.7/action/dellos9_config.pyi
@@ -0,0 +1 @@
+../../base/action/dellos9_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/eos_config.py b/zuul/ansible/2.7/action/eos_config.py
new file mode 120000
index 000000000..4d1ab53bb
--- /dev/null
+++ b/zuul/ansible/2.7/action/eos_config.py
@@ -0,0 +1 @@
+../../base/action/eos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/eos_config.pyi b/zuul/ansible/2.7/action/eos_config.pyi
new file mode 120000
index 000000000..f6d058ba1
--- /dev/null
+++ b/zuul/ansible/2.7/action/eos_config.pyi
@@ -0,0 +1 @@
+../../base/action/eos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/eos_template.py b/zuul/ansible/2.7/action/eos_template.py
new file mode 120000
index 000000000..a108bf66f
--- /dev/null
+++ b/zuul/ansible/2.7/action/eos_template.py
@@ -0,0 +1 @@
+../../base/action/eos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/eos_template.pyi b/zuul/ansible/2.7/action/eos_template.pyi
new file mode 120000
index 000000000..b9cac42e8
--- /dev/null
+++ b/zuul/ansible/2.7/action/eos_template.pyi
@@ -0,0 +1 @@
+../../base/action/eos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/fetch.py b/zuul/ansible/2.7/action/fetch.py
new file mode 120000
index 000000000..d53e02548
--- /dev/null
+++ b/zuul/ansible/2.7/action/fetch.py
@@ -0,0 +1 @@
+../../base/action/fetch.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/fetch.pyi b/zuul/ansible/2.7/action/fetch.pyi
new file mode 120000
index 000000000..b3ae31523
--- /dev/null
+++ b/zuul/ansible/2.7/action/fetch.pyi
@@ -0,0 +1 @@
+../../base/action/fetch.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/fortios_config.py b/zuul/ansible/2.7/action/fortios_config.py
new file mode 120000
index 000000000..ef38743bc
--- /dev/null
+++ b/zuul/ansible/2.7/action/fortios_config.py
@@ -0,0 +1 @@
+../../base/action/fortios_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/fortios_config.pyi b/zuul/ansible/2.7/action/fortios_config.pyi
new file mode 120000
index 000000000..fa334a059
--- /dev/null
+++ b/zuul/ansible/2.7/action/fortios_config.pyi
@@ -0,0 +1 @@
+../../base/action/fortios_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/include_vars.py b/zuul/ansible/2.7/action/include_vars.py
new file mode 120000
index 000000000..832d5a27a
--- /dev/null
+++ b/zuul/ansible/2.7/action/include_vars.py
@@ -0,0 +1 @@
+../../base/action/include_vars.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/include_vars.pyi b/zuul/ansible/2.7/action/include_vars.pyi
new file mode 120000
index 000000000..4099c1ae6
--- /dev/null
+++ b/zuul/ansible/2.7/action/include_vars.pyi
@@ -0,0 +1 @@
+../../base/action/include_vars.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ios_config.py b/zuul/ansible/2.7/action/ios_config.py
new file mode 120000
index 000000000..f1495d47e
--- /dev/null
+++ b/zuul/ansible/2.7/action/ios_config.py
@@ -0,0 +1 @@
+../../base/action/ios_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ios_config.pyi b/zuul/ansible/2.7/action/ios_config.pyi
new file mode 120000
index 000000000..e6af5e34c
--- /dev/null
+++ b/zuul/ansible/2.7/action/ios_config.pyi
@@ -0,0 +1 @@
+../../base/action/ios_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ios_template.py b/zuul/ansible/2.7/action/ios_template.py
new file mode 120000
index 000000000..ef863cedf
--- /dev/null
+++ b/zuul/ansible/2.7/action/ios_template.py
@@ -0,0 +1 @@
+../../base/action/ios_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ios_template.pyi b/zuul/ansible/2.7/action/ios_template.pyi
new file mode 120000
index 000000000..c37247812
--- /dev/null
+++ b/zuul/ansible/2.7/action/ios_template.pyi
@@ -0,0 +1 @@
+../../base/action/ios_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/iosxr_config.py b/zuul/ansible/2.7/action/iosxr_config.py
new file mode 120000
index 000000000..4eb293626
--- /dev/null
+++ b/zuul/ansible/2.7/action/iosxr_config.py
@@ -0,0 +1 @@
+../../base/action/iosxr_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/iosxr_config.pyi b/zuul/ansible/2.7/action/iosxr_config.pyi
new file mode 120000
index 000000000..70a2d67a3
--- /dev/null
+++ b/zuul/ansible/2.7/action/iosxr_config.pyi
@@ -0,0 +1 @@
+../../base/action/iosxr_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/iosxr_template.py b/zuul/ansible/2.7/action/iosxr_template.py
new file mode 120000
index 000000000..6a60fa49e
--- /dev/null
+++ b/zuul/ansible/2.7/action/iosxr_template.py
@@ -0,0 +1 @@
+../../base/action/iosxr_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/iosxr_template.pyi b/zuul/ansible/2.7/action/iosxr_template.pyi
new file mode 120000
index 000000000..918f5a113
--- /dev/null
+++ b/zuul/ansible/2.7/action/iosxr_template.pyi
@@ -0,0 +1 @@
+../../base/action/iosxr_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/junos_config.py b/zuul/ansible/2.7/action/junos_config.py
new file mode 120000
index 000000000..c50f3bc67
--- /dev/null
+++ b/zuul/ansible/2.7/action/junos_config.py
@@ -0,0 +1 @@
+../../base/action/junos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/junos_config.pyi b/zuul/ansible/2.7/action/junos_config.pyi
new file mode 120000
index 000000000..31cbba451
--- /dev/null
+++ b/zuul/ansible/2.7/action/junos_config.pyi
@@ -0,0 +1 @@
+../../base/action/junos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/junos_template.py b/zuul/ansible/2.7/action/junos_template.py
new file mode 120000
index 000000000..a2119b7cd
--- /dev/null
+++ b/zuul/ansible/2.7/action/junos_template.py
@@ -0,0 +1 @@
+../../base/action/junos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/junos_template.pyi b/zuul/ansible/2.7/action/junos_template.pyi
new file mode 120000
index 000000000..e6ef22ba9
--- /dev/null
+++ b/zuul/ansible/2.7/action/junos_template.pyi
@@ -0,0 +1 @@
+../../base/action/junos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_banner.py b/zuul/ansible/2.7/action/net_banner.py
new file mode 120000
index 000000000..69cc6d5a4
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_banner.py
@@ -0,0 +1 @@
+../../base/action/net_banner.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_banner.pyi b/zuul/ansible/2.7/action/net_banner.pyi
new file mode 120000
index 000000000..f926dbf70
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_banner.pyi
@@ -0,0 +1 @@
+../../base/action/net_banner.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_base.py b/zuul/ansible/2.7/action/net_base.py
new file mode 120000
index 000000000..f36b6ecc7
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_base.py
@@ -0,0 +1 @@
+../../base/action/net_base.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_base.pyi b/zuul/ansible/2.7/action/net_base.pyi
new file mode 120000
index 000000000..9f6ce1b7d
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_base.pyi
@@ -0,0 +1 @@
+../../base/action/net_base.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_config.py b/zuul/ansible/2.7/action/net_config.py
new file mode 120000
index 000000000..a817ca518
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_config.py
@@ -0,0 +1 @@
+../../base/action/net_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_config.pyi b/zuul/ansible/2.7/action/net_config.pyi
new file mode 120000
index 000000000..412b8110e
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_config.pyi
@@ -0,0 +1 @@
+../../base/action/net_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_get.py b/zuul/ansible/2.7/action/net_get.py
new file mode 120000
index 000000000..da3d7be0e
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_get.py
@@ -0,0 +1 @@
+../../base/action/net_get.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_get.pyi b/zuul/ansible/2.7/action/net_get.pyi
new file mode 120000
index 000000000..015c4271b
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_get.pyi
@@ -0,0 +1 @@
+../../base/action/net_get.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_interface.py b/zuul/ansible/2.7/action/net_interface.py
new file mode 120000
index 000000000..1d24f7821
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_interface.py
@@ -0,0 +1 @@
+../../base/action/net_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_interface.pyi b/zuul/ansible/2.7/action/net_interface.pyi
new file mode 120000
index 000000000..57bb45316
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_interface.pyi
@@ -0,0 +1 @@
+../../base/action/net_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_l2_interface.py b/zuul/ansible/2.7/action/net_l2_interface.py
new file mode 120000
index 000000000..1f44192c8
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_l2_interface.py
@@ -0,0 +1 @@
+../../base/action/net_l2_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_l2_interface.pyi b/zuul/ansible/2.7/action/net_l2_interface.pyi
new file mode 120000
index 000000000..2b780821d
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_l2_interface.pyi
@@ -0,0 +1 @@
+../../base/action/net_l2_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_l3_interface.py b/zuul/ansible/2.7/action/net_l3_interface.py
new file mode 120000
index 000000000..97017f4e3
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_l3_interface.py
@@ -0,0 +1 @@
+../../base/action/net_l3_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_l3_interface.pyi b/zuul/ansible/2.7/action/net_l3_interface.pyi
new file mode 120000
index 000000000..9317599a2
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_l3_interface.pyi
@@ -0,0 +1 @@
+../../base/action/net_l3_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_linkagg.py b/zuul/ansible/2.7/action/net_linkagg.py
new file mode 120000
index 000000000..d3fc53dd1
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_linkagg.py
@@ -0,0 +1 @@
+../../base/action/net_linkagg.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_linkagg.pyi b/zuul/ansible/2.7/action/net_linkagg.pyi
new file mode 120000
index 000000000..b5fac56b6
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_linkagg.pyi
@@ -0,0 +1 @@
+../../base/action/net_linkagg.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_lldp.py b/zuul/ansible/2.7/action/net_lldp.py
new file mode 120000
index 000000000..15fc3a859
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_lldp.py
@@ -0,0 +1 @@
+../../base/action/net_lldp.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_lldp.pyi b/zuul/ansible/2.7/action/net_lldp.pyi
new file mode 120000
index 000000000..a627fdec7
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_lldp.pyi
@@ -0,0 +1 @@
+../../base/action/net_lldp.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_lldp_interface.py b/zuul/ansible/2.7/action/net_lldp_interface.py
new file mode 120000
index 000000000..f57ec137f
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_lldp_interface.py
@@ -0,0 +1 @@
+../../base/action/net_lldp_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_lldp_interface.pyi b/zuul/ansible/2.7/action/net_lldp_interface.pyi
new file mode 120000
index 000000000..fdd97b078
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_lldp_interface.pyi
@@ -0,0 +1 @@
+../../base/action/net_lldp_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_logging.py b/zuul/ansible/2.7/action/net_logging.py
new file mode 120000
index 000000000..57d9766aa
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_logging.py
@@ -0,0 +1 @@
+../../base/action/net_logging.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_logging.pyi b/zuul/ansible/2.7/action/net_logging.pyi
new file mode 120000
index 000000000..1d6f1b029
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_logging.pyi
@@ -0,0 +1 @@
+../../base/action/net_logging.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_ping.py b/zuul/ansible/2.7/action/net_ping.py
new file mode 120000
index 000000000..696d9f526
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_ping.py
@@ -0,0 +1 @@
+../../base/action/net_ping.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_ping.pyi b/zuul/ansible/2.7/action/net_ping.pyi
new file mode 120000
index 000000000..03f84e975
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_ping.pyi
@@ -0,0 +1 @@
+../../base/action/net_ping.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_static_route.py b/zuul/ansible/2.7/action/net_static_route.py
new file mode 120000
index 000000000..c22b7f0e0
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_static_route.py
@@ -0,0 +1 @@
+../../base/action/net_static_route.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_static_route.pyi b/zuul/ansible/2.7/action/net_static_route.pyi
new file mode 120000
index 000000000..859c20fec
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_static_route.pyi
@@ -0,0 +1 @@
+../../base/action/net_static_route.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_system.py b/zuul/ansible/2.7/action/net_system.py
new file mode 120000
index 000000000..a03dd93c9
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_system.py
@@ -0,0 +1 @@
+../../base/action/net_system.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_system.pyi b/zuul/ansible/2.7/action/net_system.pyi
new file mode 120000
index 000000000..cc159053b
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_system.pyi
@@ -0,0 +1 @@
+../../base/action/net_system.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_template.py b/zuul/ansible/2.7/action/net_template.py
new file mode 120000
index 000000000..18ba965e4
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_template.py
@@ -0,0 +1 @@
+../../base/action/net_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_template.pyi b/zuul/ansible/2.7/action/net_template.pyi
new file mode 120000
index 000000000..3bfbb6f0f
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_template.pyi
@@ -0,0 +1 @@
+../../base/action/net_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_user.py b/zuul/ansible/2.7/action/net_user.py
new file mode 120000
index 000000000..fcfb3f55a
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_user.py
@@ -0,0 +1 @@
+../../base/action/net_user.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_user.pyi b/zuul/ansible/2.7/action/net_user.pyi
new file mode 120000
index 000000000..267f5da34
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_user.pyi
@@ -0,0 +1 @@
+../../base/action/net_user.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_vlan.py b/zuul/ansible/2.7/action/net_vlan.py
new file mode 120000
index 000000000..df275656f
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_vlan.py
@@ -0,0 +1 @@
+../../base/action/net_vlan.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_vlan.pyi b/zuul/ansible/2.7/action/net_vlan.pyi
new file mode 120000
index 000000000..718074899
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_vlan.pyi
@@ -0,0 +1 @@
+../../base/action/net_vlan.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_vrf.py b/zuul/ansible/2.7/action/net_vrf.py
new file mode 120000
index 000000000..c757d2100
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_vrf.py
@@ -0,0 +1 @@
+../../base/action/net_vrf.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/net_vrf.pyi b/zuul/ansible/2.7/action/net_vrf.pyi
new file mode 120000
index 000000000..df043a0cd
--- /dev/null
+++ b/zuul/ansible/2.7/action/net_vrf.pyi
@@ -0,0 +1 @@
+../../base/action/net_vrf.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/netconf_config.py b/zuul/ansible/2.7/action/netconf_config.py
new file mode 120000
index 000000000..4d13bb82c
--- /dev/null
+++ b/zuul/ansible/2.7/action/netconf_config.py
@@ -0,0 +1 @@
+../../base/action/netconf_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/netconf_config.pyi b/zuul/ansible/2.7/action/netconf_config.pyi
new file mode 120000
index 000000000..c75a746b4
--- /dev/null
+++ b/zuul/ansible/2.7/action/netconf_config.pyi
@@ -0,0 +1 @@
+../../base/action/netconf_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/network.py b/zuul/ansible/2.7/action/network.py
new file mode 120000
index 000000000..9e2d1baa4
--- /dev/null
+++ b/zuul/ansible/2.7/action/network.py
@@ -0,0 +1 @@
+../../base/action/network.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/network.pyi b/zuul/ansible/2.7/action/network.pyi
new file mode 120000
index 000000000..e1842d197
--- /dev/null
+++ b/zuul/ansible/2.7/action/network.pyi
@@ -0,0 +1 @@
+../../base/action/network.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/normal.py b/zuul/ansible/2.7/action/normal.py
new file mode 120000
index 000000000..4e131d98d
--- /dev/null
+++ b/zuul/ansible/2.7/action/normal.py
@@ -0,0 +1 @@
+../../base/action/normal.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/normal.pyi b/zuul/ansible/2.7/action/normal.pyi
new file mode 120000
index 000000000..bbbe0704c
--- /dev/null
+++ b/zuul/ansible/2.7/action/normal.pyi
@@ -0,0 +1 @@
+../../base/action/normal.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/nxos_config.py b/zuul/ansible/2.7/action/nxos_config.py
new file mode 120000
index 000000000..0cc233c34
--- /dev/null
+++ b/zuul/ansible/2.7/action/nxos_config.py
@@ -0,0 +1 @@
+../../base/action/nxos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/nxos_config.pyi b/zuul/ansible/2.7/action/nxos_config.pyi
new file mode 120000
index 000000000..b2e63b6e3
--- /dev/null
+++ b/zuul/ansible/2.7/action/nxos_config.pyi
@@ -0,0 +1 @@
+../../base/action/nxos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/nxos_template.py b/zuul/ansible/2.7/action/nxos_template.py
new file mode 120000
index 000000000..3d599062a
--- /dev/null
+++ b/zuul/ansible/2.7/action/nxos_template.py
@@ -0,0 +1 @@
+../../base/action/nxos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/nxos_template.pyi b/zuul/ansible/2.7/action/nxos_template.pyi
new file mode 120000
index 000000000..e36fa4e90
--- /dev/null
+++ b/zuul/ansible/2.7/action/nxos_template.pyi
@@ -0,0 +1 @@
+../../base/action/nxos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ops_config.py b/zuul/ansible/2.7/action/ops_config.py
new file mode 120000
index 000000000..2abe0669d
--- /dev/null
+++ b/zuul/ansible/2.7/action/ops_config.py
@@ -0,0 +1 @@
+../../base/action/ops_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ops_config.pyi b/zuul/ansible/2.7/action/ops_config.pyi
new file mode 120000
index 000000000..7517f9c7b
--- /dev/null
+++ b/zuul/ansible/2.7/action/ops_config.pyi
@@ -0,0 +1 @@
+../../base/action/ops_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ops_template.py b/zuul/ansible/2.7/action/ops_template.py
new file mode 120000
index 000000000..5c841ca57
--- /dev/null
+++ b/zuul/ansible/2.7/action/ops_template.py
@@ -0,0 +1 @@
+../../base/action/ops_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/ops_template.pyi b/zuul/ansible/2.7/action/ops_template.pyi
new file mode 120000
index 000000000..4baa28a3f
--- /dev/null
+++ b/zuul/ansible/2.7/action/ops_template.pyi
@@ -0,0 +1 @@
+../../base/action/ops_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/patch.py b/zuul/ansible/2.7/action/patch.py
new file mode 120000
index 000000000..8996710ba
--- /dev/null
+++ b/zuul/ansible/2.7/action/patch.py
@@ -0,0 +1 @@
+../../base/action/patch.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/patch.pyi b/zuul/ansible/2.7/action/patch.pyi
new file mode 120000
index 000000000..577e43600
--- /dev/null
+++ b/zuul/ansible/2.7/action/patch.pyi
@@ -0,0 +1 @@
+../../base/action/patch.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/raw.py b/zuul/ansible/2.7/action/raw.py
new file mode 120000
index 000000000..e4962dd8a
--- /dev/null
+++ b/zuul/ansible/2.7/action/raw.py
@@ -0,0 +1 @@
+../../base/action/raw.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/raw.pyi b/zuul/ansible/2.7/action/raw.pyi
new file mode 120000
index 000000000..741945ef2
--- /dev/null
+++ b/zuul/ansible/2.7/action/raw.pyi
@@ -0,0 +1 @@
+../../base/action/raw.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/script.py b/zuul/ansible/2.7/action/script.py
new file mode 120000
index 000000000..1cccf5805
--- /dev/null
+++ b/zuul/ansible/2.7/action/script.py
@@ -0,0 +1 @@
+../../base/action/script.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/script.pyi b/zuul/ansible/2.7/action/script.pyi
new file mode 120000
index 000000000..aff69744b
--- /dev/null
+++ b/zuul/ansible/2.7/action/script.pyi
@@ -0,0 +1 @@
+../../base/action/script.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/sros_config.py b/zuul/ansible/2.7/action/sros_config.py
new file mode 120000
index 000000000..1762874e4
--- /dev/null
+++ b/zuul/ansible/2.7/action/sros_config.py
@@ -0,0 +1 @@
+../../base/action/sros_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/sros_config.pyi b/zuul/ansible/2.7/action/sros_config.pyi
new file mode 120000
index 000000000..453e4b8e1
--- /dev/null
+++ b/zuul/ansible/2.7/action/sros_config.pyi
@@ -0,0 +1 @@
+../../base/action/sros_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/synchronize.py b/zuul/ansible/2.7/action/synchronize.py
new file mode 120000
index 000000000..f2126166c
--- /dev/null
+++ b/zuul/ansible/2.7/action/synchronize.py
@@ -0,0 +1 @@
+../../base/action/synchronize.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/synchronize.pyi b/zuul/ansible/2.7/action/synchronize.pyi
new file mode 120000
index 000000000..4ff1a2ee9
--- /dev/null
+++ b/zuul/ansible/2.7/action/synchronize.pyi
@@ -0,0 +1 @@
+../../base/action/synchronize.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/template.py b/zuul/ansible/2.7/action/template.py
new file mode 120000
index 000000000..720717d83
--- /dev/null
+++ b/zuul/ansible/2.7/action/template.py
@@ -0,0 +1 @@
+../../base/action/template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/template.pyi b/zuul/ansible/2.7/action/template.pyi
new file mode 120000
index 000000000..aed7fb07a
--- /dev/null
+++ b/zuul/ansible/2.7/action/template.pyi
@@ -0,0 +1 @@
+../../base/action/template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/unarchive.py b/zuul/ansible/2.7/action/unarchive.py
new file mode 120000
index 000000000..2d7ce5aed
--- /dev/null
+++ b/zuul/ansible/2.7/action/unarchive.py
@@ -0,0 +1 @@
+../../base/action/unarchive.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/unarchive.pyi b/zuul/ansible/2.7/action/unarchive.pyi
new file mode 120000
index 000000000..fead9ca55
--- /dev/null
+++ b/zuul/ansible/2.7/action/unarchive.pyi
@@ -0,0 +1 @@
+../../base/action/unarchive.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/uri.py b/zuul/ansible/2.7/action/uri.py
new file mode 120000
index 000000000..7c4b15f45
--- /dev/null
+++ b/zuul/ansible/2.7/action/uri.py
@@ -0,0 +1 @@
+../../base/action/uri.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/uri.pyi b/zuul/ansible/2.7/action/uri.pyi
new file mode 120000
index 000000000..015bb9fe3
--- /dev/null
+++ b/zuul/ansible/2.7/action/uri.pyi
@@ -0,0 +1 @@
+../../base/action/uri.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/vyos_config.py b/zuul/ansible/2.7/action/vyos_config.py
new file mode 120000
index 000000000..2732fd7a1
--- /dev/null
+++ b/zuul/ansible/2.7/action/vyos_config.py
@@ -0,0 +1 @@
+../../base/action/vyos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/vyos_config.pyi b/zuul/ansible/2.7/action/vyos_config.pyi
new file mode 120000
index 000000000..ac5d76632
--- /dev/null
+++ b/zuul/ansible/2.7/action/vyos_config.pyi
@@ -0,0 +1 @@
+../../base/action/vyos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/win_copy.py b/zuul/ansible/2.7/action/win_copy.py
new file mode 120000
index 000000000..80c3f3846
--- /dev/null
+++ b/zuul/ansible/2.7/action/win_copy.py
@@ -0,0 +1 @@
+../../base/action/win_copy.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/win_copy.pyi b/zuul/ansible/2.7/action/win_copy.pyi
new file mode 120000
index 000000000..017c792ff
--- /dev/null
+++ b/zuul/ansible/2.7/action/win_copy.pyi
@@ -0,0 +1 @@
+../../base/action/win_copy.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/win_template.py b/zuul/ansible/2.7/action/win_template.py
new file mode 120000
index 000000000..f2a8b2d63
--- /dev/null
+++ b/zuul/ansible/2.7/action/win_template.py
@@ -0,0 +1 @@
+../../base/action/win_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/action/win_template.pyi b/zuul/ansible/2.7/action/win_template.pyi
new file mode 120000
index 000000000..40825895b
--- /dev/null
+++ b/zuul/ansible/2.7/action/win_template.pyi
@@ -0,0 +1 @@
+../../base/action/win_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/actiongeneral/__init__.py b/zuul/ansible/2.7/actiongeneral/__init__.py
new file mode 120000
index 000000000..38d887448
--- /dev/null
+++ b/zuul/ansible/2.7/actiongeneral/__init__.py
@@ -0,0 +1 @@
+../../base/actiongeneral/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/actiongeneral/command.py b/zuul/ansible/2.7/actiongeneral/command.py
new file mode 120000
index 000000000..f190db2cc
--- /dev/null
+++ b/zuul/ansible/2.7/actiongeneral/command.py
@@ -0,0 +1 @@
+../../base/actiongeneral/command.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/actiongeneral/command.pyi b/zuul/ansible/2.7/actiongeneral/command.pyi
new file mode 120000
index 000000000..81305dd03
--- /dev/null
+++ b/zuul/ansible/2.7/actiongeneral/command.pyi
@@ -0,0 +1 @@
+../../base/actiongeneral/command.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/actiongeneral/zuul_return.py b/zuul/ansible/2.7/actiongeneral/zuul_return.py
new file mode 120000
index 000000000..2f5b2559e
--- /dev/null
+++ b/zuul/ansible/2.7/actiongeneral/zuul_return.py
@@ -0,0 +1 @@
+../../base/actiongeneral/zuul_return.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/callback/__init__.py b/zuul/ansible/2.7/callback/__init__.py
new file mode 120000
index 000000000..00b974388
--- /dev/null
+++ b/zuul/ansible/2.7/callback/__init__.py
@@ -0,0 +1 @@
+../../base/callback/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/callback/zuul_json.py b/zuul/ansible/2.7/callback/zuul_json.py
new file mode 120000
index 000000000..b0a07779b
--- /dev/null
+++ b/zuul/ansible/2.7/callback/zuul_json.py
@@ -0,0 +1 @@
+../../base/callback/zuul_json.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/callback/zuul_stream.py b/zuul/ansible/2.7/callback/zuul_stream.py
new file mode 120000
index 000000000..f75561bf4
--- /dev/null
+++ b/zuul/ansible/2.7/callback/zuul_stream.py
@@ -0,0 +1 @@
+../../base/callback/zuul_stream.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/callback/zuul_unreachable.py b/zuul/ansible/2.7/callback/zuul_unreachable.py
new file mode 120000
index 000000000..205baca6f
--- /dev/null
+++ b/zuul/ansible/2.7/callback/zuul_unreachable.py
@@ -0,0 +1 @@
+../../base/callback/zuul_unreachable.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/filter/__init__.py b/zuul/ansible/2.7/filter/__init__.py
new file mode 120000
index 000000000..f80a4da61
--- /dev/null
+++ b/zuul/ansible/2.7/filter/__init__.py
@@ -0,0 +1 @@
+../../base/filter/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/filter/zuul_filters.py b/zuul/ansible/2.7/filter/zuul_filters.py
new file mode 120000
index 000000000..d406e5fe6
--- /dev/null
+++ b/zuul/ansible/2.7/filter/zuul_filters.py
@@ -0,0 +1 @@
+../../base/filter/zuul_filters.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/library/__init__.py b/zuul/ansible/2.7/library/__init__.py
new file mode 120000
index 000000000..0b68ce0f4
--- /dev/null
+++ b/zuul/ansible/2.7/library/__init__.py
@@ -0,0 +1 @@
+../../base/library/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/library/command.py b/zuul/ansible/2.7/library/command.py
new file mode 120000
index 000000000..9c7633169
--- /dev/null
+++ b/zuul/ansible/2.7/library/command.py
@@ -0,0 +1 @@
+../../base/library/command.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/library/zuul_console.py b/zuul/ansible/2.7/library/zuul_console.py
new file mode 120000
index 000000000..7c905e0f9
--- /dev/null
+++ b/zuul/ansible/2.7/library/zuul_console.py
@@ -0,0 +1 @@
+../../base/library/zuul_console.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/logconfig.py b/zuul/ansible/2.7/logconfig.py
new file mode 120000
index 000000000..767cb2e81
--- /dev/null
+++ b/zuul/ansible/2.7/logconfig.py
@@ -0,0 +1 @@
+../logconfig.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/__init__.py b/zuul/ansible/2.7/lookup/__init__.py
new file mode 120000
index 000000000..b008ecb3b
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/__init__.py
@@ -0,0 +1 @@
+../../base/lookup/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/_banned.py b/zuul/ansible/2.7/lookup/_banned.py
new file mode 120000
index 000000000..2e127f4e7
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/_banned.py
@@ -0,0 +1 @@
+../../base/lookup/_banned.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/_banned.pyi b/zuul/ansible/2.7/lookup/_banned.pyi
new file mode 120000
index 000000000..d7909135d
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/_banned.pyi
@@ -0,0 +1 @@
+../../base/lookup/_banned.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/chef_databag.py b/zuul/ansible/2.7/lookup/chef_databag.py
new file mode 120000
index 000000000..d4efe7e85
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/chef_databag.py
@@ -0,0 +1 @@
+../../base/lookup/chef_databag.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/chef_databag.pyi b/zuul/ansible/2.7/lookup/chef_databag.pyi
new file mode 120000
index 000000000..c06fc3001
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/chef_databag.pyi
@@ -0,0 +1 @@
+../../base/lookup/chef_databag.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/consul_kv.py b/zuul/ansible/2.7/lookup/consul_kv.py
new file mode 120000
index 000000000..66b6f7617
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/consul_kv.py
@@ -0,0 +1 @@
+../../base/lookup/consul_kv.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/consul_kv.pyi b/zuul/ansible/2.7/lookup/consul_kv.pyi
new file mode 120000
index 000000000..33d848347
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/consul_kv.pyi
@@ -0,0 +1 @@
+../../base/lookup/consul_kv.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/credstash.py b/zuul/ansible/2.7/lookup/credstash.py
new file mode 120000
index 000000000..2c343a27e
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/credstash.py
@@ -0,0 +1 @@
+../../base/lookup/credstash.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/credstash.pyi b/zuul/ansible/2.7/lookup/credstash.pyi
new file mode 120000
index 000000000..071af9d1a
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/credstash.pyi
@@ -0,0 +1 @@
+../../base/lookup/credstash.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/csvfile.py b/zuul/ansible/2.7/lookup/csvfile.py
new file mode 120000
index 000000000..981754791
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/csvfile.py
@@ -0,0 +1 @@
+../../base/lookup/csvfile.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/csvfile.pyi b/zuul/ansible/2.7/lookup/csvfile.pyi
new file mode 120000
index 000000000..18ded3684
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/csvfile.pyi
@@ -0,0 +1 @@
+../../base/lookup/csvfile.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/cyberarkpassword.py b/zuul/ansible/2.7/lookup/cyberarkpassword.py
new file mode 120000
index 000000000..a573c0cf3
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/cyberarkpassword.py
@@ -0,0 +1 @@
+../../base/lookup/cyberarkpassword.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/cyberarkpassword.pyi b/zuul/ansible/2.7/lookup/cyberarkpassword.pyi
new file mode 120000
index 000000000..01543847e
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/cyberarkpassword.pyi
@@ -0,0 +1 @@
+../../base/lookup/cyberarkpassword.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/dig.py b/zuul/ansible/2.7/lookup/dig.py
new file mode 120000
index 000000000..92a628c4a
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/dig.py
@@ -0,0 +1 @@
+../../base/lookup/dig.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/dig.pyi b/zuul/ansible/2.7/lookup/dig.pyi
new file mode 120000
index 000000000..7268b42c3
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/dig.pyi
@@ -0,0 +1 @@
+../../base/lookup/dig.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/dnstxt.py b/zuul/ansible/2.7/lookup/dnstxt.py
new file mode 120000
index 000000000..aa3e0f2d9
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/dnstxt.py
@@ -0,0 +1 @@
+../../base/lookup/dnstxt.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/dnstxt.pyi b/zuul/ansible/2.7/lookup/dnstxt.pyi
new file mode 120000
index 000000000..1c221784c
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/dnstxt.pyi
@@ -0,0 +1 @@
+../../base/lookup/dnstxt.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/env.py b/zuul/ansible/2.7/lookup/env.py
new file mode 120000
index 000000000..124393630
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/env.py
@@ -0,0 +1 @@
+../../base/lookup/env.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/env.pyi b/zuul/ansible/2.7/lookup/env.pyi
new file mode 120000
index 000000000..e0ecae07a
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/env.pyi
@@ -0,0 +1 @@
+../../base/lookup/env.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/etcd.py b/zuul/ansible/2.7/lookup/etcd.py
new file mode 120000
index 000000000..c42007aa6
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/etcd.py
@@ -0,0 +1 @@
+../../base/lookup/etcd.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/etcd.pyi b/zuul/ansible/2.7/lookup/etcd.pyi
new file mode 120000
index 000000000..a1d4e0458
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/etcd.pyi
@@ -0,0 +1 @@
+../../base/lookup/etcd.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/file.py b/zuul/ansible/2.7/lookup/file.py
new file mode 120000
index 000000000..d1c0692d7
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/file.py
@@ -0,0 +1 @@
+../../base/lookup/file.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/file.pyi b/zuul/ansible/2.7/lookup/file.pyi
new file mode 120000
index 000000000..588dc50c6
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/file.pyi
@@ -0,0 +1 @@
+../../base/lookup/file.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/fileglob.py b/zuul/ansible/2.7/lookup/fileglob.py
new file mode 120000
index 000000000..0249540ac
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/fileglob.py
@@ -0,0 +1 @@
+../../base/lookup/fileglob.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/fileglob.pyi b/zuul/ansible/2.7/lookup/fileglob.pyi
new file mode 120000
index 000000000..ffce6462b
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/fileglob.pyi
@@ -0,0 +1 @@
+../../base/lookup/fileglob.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/filetree.py b/zuul/ansible/2.7/lookup/filetree.py
new file mode 120000
index 000000000..96cc789ac
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/filetree.py
@@ -0,0 +1 @@
+../../base/lookup/filetree.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/filetree.pyi b/zuul/ansible/2.7/lookup/filetree.pyi
new file mode 120000
index 000000000..ca38966f5
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/filetree.pyi
@@ -0,0 +1 @@
+../../base/lookup/filetree.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/first_found.py b/zuul/ansible/2.7/lookup/first_found.py
new file mode 120000
index 000000000..0a01ced20
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/first_found.py
@@ -0,0 +1 @@
+../../base/lookup/first_found.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/first_found.pyi b/zuul/ansible/2.7/lookup/first_found.pyi
new file mode 120000
index 000000000..a3a92f250
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/first_found.pyi
@@ -0,0 +1 @@
+../../base/lookup/first_found.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/hashi_valut.py b/zuul/ansible/2.7/lookup/hashi_valut.py
new file mode 120000
index 000000000..5a13b3c0e
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/hashi_valut.py
@@ -0,0 +1 @@
+../../base/lookup/hashi_valut.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/hashi_valut.pyi b/zuul/ansible/2.7/lookup/hashi_valut.pyi
new file mode 120000
index 000000000..be0d600fe
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/hashi_valut.pyi
@@ -0,0 +1 @@
+../../base/lookup/hashi_valut.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/hiera.py b/zuul/ansible/2.7/lookup/hiera.py
new file mode 120000
index 000000000..01e1883e3
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/hiera.py
@@ -0,0 +1 @@
+../../base/lookup/hiera.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/hiera.pyi b/zuul/ansible/2.7/lookup/hiera.pyi
new file mode 120000
index 000000000..b7756855a
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/hiera.pyi
@@ -0,0 +1 @@
+../../base/lookup/hiera.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/ini.py b/zuul/ansible/2.7/lookup/ini.py
new file mode 120000
index 000000000..6453943b9
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/ini.py
@@ -0,0 +1 @@
+../../base/lookup/ini.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/ini.pyi b/zuul/ansible/2.7/lookup/ini.pyi
new file mode 120000
index 000000000..b66fe999a
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/ini.pyi
@@ -0,0 +1 @@
+../../base/lookup/ini.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/keyring.py b/zuul/ansible/2.7/lookup/keyring.py
new file mode 120000
index 000000000..864d62d6f
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/keyring.py
@@ -0,0 +1 @@
+../../base/lookup/keyring.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/keyring.pyi b/zuul/ansible/2.7/lookup/keyring.pyi
new file mode 120000
index 000000000..9a0c24b55
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/keyring.pyi
@@ -0,0 +1 @@
+../../base/lookup/keyring.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/lastpass.py b/zuul/ansible/2.7/lookup/lastpass.py
new file mode 120000
index 000000000..a28abff20
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/lastpass.py
@@ -0,0 +1 @@
+../../base/lookup/lastpass.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/lastpass.pyi b/zuul/ansible/2.7/lookup/lastpass.pyi
new file mode 120000
index 000000000..dfd6e6b31
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/lastpass.pyi
@@ -0,0 +1 @@
+../../base/lookup/lastpass.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/lines.py b/zuul/ansible/2.7/lookup/lines.py
new file mode 120000
index 000000000..c2cae632b
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/lines.py
@@ -0,0 +1 @@
+../../base/lookup/lines.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/lines.pyi b/zuul/ansible/2.7/lookup/lines.pyi
new file mode 120000
index 000000000..3ddc687f9
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/lines.pyi
@@ -0,0 +1 @@
+../../base/lookup/lines.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/mongodb.py b/zuul/ansible/2.7/lookup/mongodb.py
new file mode 120000
index 000000000..737037fa1
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/mongodb.py
@@ -0,0 +1 @@
+../../base/lookup/mongodb.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/mongodb.pyi b/zuul/ansible/2.7/lookup/mongodb.pyi
new file mode 120000
index 000000000..4c8f754ef
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/mongodb.pyi
@@ -0,0 +1 @@
+../../base/lookup/mongodb.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/password.py b/zuul/ansible/2.7/lookup/password.py
new file mode 120000
index 000000000..478e6bee6
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/password.py
@@ -0,0 +1 @@
+../../base/lookup/password.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/password.pyi b/zuul/ansible/2.7/lookup/password.pyi
new file mode 120000
index 000000000..370986cbc
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/password.pyi
@@ -0,0 +1 @@
+../../base/lookup/password.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/passwordstore.py b/zuul/ansible/2.7/lookup/passwordstore.py
new file mode 120000
index 000000000..af4c4aa92
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/passwordstore.py
@@ -0,0 +1 @@
+../../base/lookup/passwordstore.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/passwordstore.pyi b/zuul/ansible/2.7/lookup/passwordstore.pyi
new file mode 120000
index 000000000..9ba9b718a
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/passwordstore.pyi
@@ -0,0 +1 @@
+../../base/lookup/passwordstore.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/pipe.py b/zuul/ansible/2.7/lookup/pipe.py
new file mode 120000
index 000000000..ea688c3a3
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/pipe.py
@@ -0,0 +1 @@
+../../base/lookup/pipe.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/pipe.pyi b/zuul/ansible/2.7/lookup/pipe.pyi
new file mode 120000
index 000000000..01d6b935d
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/pipe.pyi
@@ -0,0 +1 @@
+../../base/lookup/pipe.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/redis_kv.py b/zuul/ansible/2.7/lookup/redis_kv.py
new file mode 120000
index 000000000..a711e2651
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/redis_kv.py
@@ -0,0 +1 @@
+../../base/lookup/redis_kv.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/redis_kv.pyi b/zuul/ansible/2.7/lookup/redis_kv.pyi
new file mode 120000
index 000000000..da9acca45
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/redis_kv.pyi
@@ -0,0 +1 @@
+../../base/lookup/redis_kv.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/shelvefile.py b/zuul/ansible/2.7/lookup/shelvefile.py
new file mode 120000
index 000000000..2c76ec937
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/shelvefile.py
@@ -0,0 +1 @@
+../../base/lookup/shelvefile.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/shelvefile.pyi b/zuul/ansible/2.7/lookup/shelvefile.pyi
new file mode 120000
index 000000000..827f4b076
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/shelvefile.pyi
@@ -0,0 +1 @@
+../../base/lookup/shelvefile.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/template.py b/zuul/ansible/2.7/lookup/template.py
new file mode 120000
index 000000000..ef6565ceb
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/template.py
@@ -0,0 +1 @@
+../../base/lookup/template.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/template.pyi b/zuul/ansible/2.7/lookup/template.pyi
new file mode 120000
index 000000000..f03685d5c
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/template.pyi
@@ -0,0 +1 @@
+../../base/lookup/template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/url.py b/zuul/ansible/2.7/lookup/url.py
new file mode 120000
index 000000000..f936b748e
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/url.py
@@ -0,0 +1 @@
+../../base/lookup/url.py \ No newline at end of file
diff --git a/zuul/ansible/2.7/lookup/url.pyi b/zuul/ansible/2.7/lookup/url.pyi
new file mode 120000
index 000000000..fc13f47c5
--- /dev/null
+++ b/zuul/ansible/2.7/lookup/url.pyi
@@ -0,0 +1 @@
+../../base/lookup/url.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.7/paths.py b/zuul/ansible/2.7/paths.py
new file mode 120000
index 000000000..dbdb1858e
--- /dev/null
+++ b/zuul/ansible/2.7/paths.py
@@ -0,0 +1 @@
+../paths.py \ No newline at end of file
diff --git a/zuul/ansible/base/action/uri.py b/zuul/ansible/base/action/uri.py
new file mode 100644
index 000000000..2030554a8
--- /dev/null
+++ b/zuul/ansible/base/action/uri.py
@@ -0,0 +1,35 @@
+# Copyright 2016 Red Hat, Inc.
+#
+# This module 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.
+#
+# This software 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 this software. If not, see <http://www.gnu.org/licenses/>.
+
+
+from zuul.ansible import paths
+uri = paths._import_ansible_action_plugin("uri")
+
+
+class ActionModule(uri.ActionModule):
+
+ def _find_needle(self, dirname, needle):
+ return paths._safe_find_needle(
+ super(ActionModule, self), dirname, needle)
+
+ def run(self, tmp=None, task_vars=None):
+
+ if not paths._is_official_module(self):
+ return paths._fail_module_dict(self._task.action)
+
+ if paths._is_localhost_task(self):
+ paths._fail_if_unsafe(self._task.args['path'])
+
+ return super(ActionModule, self).run(tmp, task_vars)
diff --git a/zuul/ansible/base/action/uri.pyi b/zuul/ansible/base/action/uri.pyi
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/zuul/ansible/base/action/uri.pyi
diff --git a/zuul/ansible/base/callback/zuul_stream.py b/zuul/ansible/base/callback/zuul_stream.py
index 966c9008c..b63e440c2 100644
--- a/zuul/ansible/base/callback/zuul_stream.py
+++ b/zuul/ansible/base/callback/zuul_stream.py
@@ -324,7 +324,7 @@ class CallbackModule(default.CallbackModule):
if result._task.loop and 'results' in result_dict:
# items have their own events
pass
- elif (result_dict.get('msg') == 'MODULE FAILURE'):
+ elif result_dict.get('msg', '').startswith('MODULE FAILURE'):
self._log_module_failure(result, result_dict)
else:
self._log_message(
@@ -390,7 +390,7 @@ class CallbackModule(default.CallbackModule):
# items have their own events
pass
- elif (result_dict.get('msg') == 'MODULE FAILURE'):
+ elif result_dict.get('msg', '').startswith('MODULE FAILURE'):
self._log_module_failure(result, result_dict)
elif result._task.action == 'debug':
# this is a debug statement, handle it special
@@ -446,7 +446,7 @@ class CallbackModule(default.CallbackModule):
else:
status = 'ok'
- if result_dict.get('msg') == 'MODULE FAILURE':
+ if result_dict.get('msg', '').startswith('MODULE FAILURE'):
self._log_module_failure(result, result_dict)
elif result._task.action not in ('command', 'shell',
'win_command', 'win_shell'):
@@ -482,7 +482,7 @@ class CallbackModule(default.CallbackModule):
result_dict = dict(result._result)
self._process_result_for_localhost(result, is_task=False)
- if result_dict.get('msg') == 'MODULE FAILURE':
+ if result_dict.get('msg', '').startswith('MODULE FAILURE'):
self._log_module_failure(result, result_dict)
elif result._task.action not in ('command', 'shell',
'win_command', 'win_shell'):
diff --git a/zuul/lib/ansible-config.conf b/zuul/lib/ansible-config.conf
index 3f0907d92..35d2dec08 100644
--- a/zuul/lib/ansible-config.conf
+++ b/zuul/lib/ansible-config.conf
@@ -7,3 +7,6 @@ requirements = ansible>=2.5.1,<2.6 ara
[2.6]
requirements = ansible>=2.6,<2.7 ara
+
+[2.7]
+requirements = ansible>=2.7,<2.8 ara