summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Henkel <tobias.henkel@bmw.de>2019-01-19 13:33:39 +0100
committerTobias Henkel <tobias.henkel@bmw.de>2019-03-15 09:09:16 +0100
commitcd9827e6649b7f14513c2f201afc9e9d46998ddb (patch)
treef89c2370385812fa82b64bd61a63a34a508d19c0
parentc91335b5279872d90b285b087a0c2ddb85fc4f77 (diff)
downloadzuul-cd9827e6649b7f14513c2f201afc9e9d46998ddb.tar.gz
Manage ansible installations within zuul
As a first step towards supporting multiple ansible versions we need tooling to manage ansible installations. This moves the installation of ansible from the requirements.txt into zuul. This is called as a setup hook to install the ansible versions into <prefix>/lib/zuul/ansible. Further this tooling abstracts knowledge that the executor must know in order to actually run the correct version of ansible. The actual usage of multiple ansible versions will be done in follow-ups. For better maintainability the ansible plugins live in zuul/ansible/base where plugins can be kept in different versions if necessary. For each supported ansible version there is a specific folder that symlinks the according plugins. Change-Id: I5ce1385245c76818777aa34230786a9dbaf723e5 Depends-On: https://review.openstack.org/623927
-rw-r--r--.zuul.yaml14
-rw-r--r--Dockerfile7
-rw-r--r--bindep.txt3
-rw-r--r--doc/requirements.txt1
-rw-r--r--doc/source/admin/examples/docker-compose.yaml11
-rwxr-xr-xdoc/source/admin/examples/playbooks/wait-to-start-gearman.sh17
-rwxr-xr-xdoc/source/admin/examples/playbooks/wait-to-start.sh29
-rw-r--r--doc/source/admin/examples/playbooks/wait-to-start.yaml24
-rw-r--r--doc/source/admin/installation.rst3
-rw-r--r--doc/source/admin/zuul_install.rst1
-rw-r--r--doc/source/developer/ansible.rst12
-rw-r--r--playbooks/zuul-stream/fixtures/test-stream.yaml4
-rw-r--r--playbooks/zuul-stream/functional.yaml14
-rw-r--r--playbooks/zuul-stream/post-ara.yaml2
-rw-r--r--playbooks/zuul-stream/pre.yaml6
-rw-r--r--playbooks/zuul-stream/templates/ansible.cfg.j29
-rw-r--r--requirements.txt1
-rw-r--r--setup.cfg1
-rw-r--r--tox.ini5
l---------zuul/ansible/2.5/action/__init__.py1
l---------zuul/ansible/2.5/action/add_host.py1
l---------zuul/ansible/2.5/action/add_host.pyi1
l---------zuul/ansible/2.5/action/aireos.py1
l---------zuul/ansible/2.5/action/aireos.pyi1
l---------zuul/ansible/2.5/action/aireos_config.py1
l---------zuul/ansible/2.5/action/aireos_config.pyi1
l---------zuul/ansible/2.5/action/aruba.py1
l---------zuul/ansible/2.5/action/aruba.pyi1
l---------zuul/ansible/2.5/action/aruba_config.py1
l---------zuul/ansible/2.5/action/aruba_config.pyi1
l---------zuul/ansible/2.5/action/asa.py1
l---------zuul/ansible/2.5/action/asa.pyi1
l---------zuul/ansible/2.5/action/asa_config.py1
l---------zuul/ansible/2.5/action/asa_config.pyi1
l---------zuul/ansible/2.5/action/asa_template.py1
l---------zuul/ansible/2.5/action/asa_template.pyi1
l---------zuul/ansible/2.5/action/assemble.py1
l---------zuul/ansible/2.5/action/assemble.pyi1
l---------zuul/ansible/2.5/action/ce.py1
l---------zuul/ansible/2.5/action/ce.pyi1
l---------zuul/ansible/2.5/action/ce_config.py1
l---------zuul/ansible/2.5/action/ce_config.pyi1
l---------zuul/ansible/2.5/action/ce_template.py1
l---------zuul/ansible/2.5/action/ce_template.pyi1
l---------zuul/ansible/2.5/action/copy.py1
l---------zuul/ansible/2.5/action/copy.pyi1
l---------zuul/ansible/2.5/action/dellos10_config.py1
l---------zuul/ansible/2.5/action/dellos10_config.pyi1
l---------zuul/ansible/2.5/action/dellos6_config.py1
l---------zuul/ansible/2.5/action/dellos6_config.pyi1
l---------zuul/ansible/2.5/action/dellos9_config.py1
l---------zuul/ansible/2.5/action/dellos9_config.pyi1
l---------zuul/ansible/2.5/action/eos_config.py1
l---------zuul/ansible/2.5/action/eos_config.pyi1
l---------zuul/ansible/2.5/action/eos_template.py1
l---------zuul/ansible/2.5/action/eos_template.pyi1
l---------zuul/ansible/2.5/action/fetch.py1
l---------zuul/ansible/2.5/action/fetch.pyi1
l---------zuul/ansible/2.5/action/fortios_config.py1
l---------zuul/ansible/2.5/action/fortios_config.pyi1
l---------zuul/ansible/2.5/action/include_vars.py1
l---------zuul/ansible/2.5/action/include_vars.pyi1
l---------zuul/ansible/2.5/action/ios_config.py1
l---------zuul/ansible/2.5/action/ios_config.pyi1
l---------zuul/ansible/2.5/action/ios_template.py1
l---------zuul/ansible/2.5/action/ios_template.pyi1
l---------zuul/ansible/2.5/action/iosxr_config.py1
l---------zuul/ansible/2.5/action/iosxr_config.pyi1
l---------zuul/ansible/2.5/action/iosxr_template.py1
l---------zuul/ansible/2.5/action/iosxr_template.pyi1
l---------zuul/ansible/2.5/action/junos_config.py1
l---------zuul/ansible/2.5/action/junos_config.pyi1
l---------zuul/ansible/2.5/action/junos_template.py1
l---------zuul/ansible/2.5/action/junos_template.pyi1
l---------zuul/ansible/2.5/action/net_banner.py1
l---------zuul/ansible/2.5/action/net_banner.pyi1
l---------zuul/ansible/2.5/action/net_base.py1
l---------zuul/ansible/2.5/action/net_base.pyi1
l---------zuul/ansible/2.5/action/net_config.py1
l---------zuul/ansible/2.5/action/net_config.pyi1
l---------zuul/ansible/2.5/action/net_interface.py1
l---------zuul/ansible/2.5/action/net_interface.pyi1
l---------zuul/ansible/2.5/action/net_l2_interface.py1
l---------zuul/ansible/2.5/action/net_l2_interface.pyi1
l---------zuul/ansible/2.5/action/net_l3_interface.py1
l---------zuul/ansible/2.5/action/net_l3_interface.pyi1
l---------zuul/ansible/2.5/action/net_linkagg.py1
l---------zuul/ansible/2.5/action/net_linkagg.pyi1
l---------zuul/ansible/2.5/action/net_lldp.py1
l---------zuul/ansible/2.5/action/net_lldp.pyi1
l---------zuul/ansible/2.5/action/net_lldp_interface.py1
l---------zuul/ansible/2.5/action/net_lldp_interface.pyi1
l---------zuul/ansible/2.5/action/net_logging.py1
l---------zuul/ansible/2.5/action/net_logging.pyi1
l---------zuul/ansible/2.5/action/net_ping.py1
l---------zuul/ansible/2.5/action/net_ping.pyi1
l---------zuul/ansible/2.5/action/net_static_route.py1
l---------zuul/ansible/2.5/action/net_static_route.pyi1
l---------zuul/ansible/2.5/action/net_system.py1
l---------zuul/ansible/2.5/action/net_system.pyi1
l---------zuul/ansible/2.5/action/net_template.py1
l---------zuul/ansible/2.5/action/net_template.pyi1
l---------zuul/ansible/2.5/action/net_user.py1
l---------zuul/ansible/2.5/action/net_user.pyi1
l---------zuul/ansible/2.5/action/net_vlan.py1
l---------zuul/ansible/2.5/action/net_vlan.pyi1
l---------zuul/ansible/2.5/action/net_vrf.py1
l---------zuul/ansible/2.5/action/net_vrf.pyi1
l---------zuul/ansible/2.5/action/netconf_config.py1
l---------zuul/ansible/2.5/action/netconf_config.pyi1
l---------zuul/ansible/2.5/action/network.py1
l---------zuul/ansible/2.5/action/network.pyi1
l---------zuul/ansible/2.5/action/normal.py1
l---------zuul/ansible/2.5/action/normal.pyi1
l---------zuul/ansible/2.5/action/nxos_config.py1
l---------zuul/ansible/2.5/action/nxos_config.pyi1
l---------zuul/ansible/2.5/action/nxos_template.py1
l---------zuul/ansible/2.5/action/nxos_template.pyi1
l---------zuul/ansible/2.5/action/ops_config.py1
l---------zuul/ansible/2.5/action/ops_config.pyi1
l---------zuul/ansible/2.5/action/ops_template.py1
l---------zuul/ansible/2.5/action/ops_template.pyi1
l---------zuul/ansible/2.5/action/patch.py1
l---------zuul/ansible/2.5/action/patch.pyi1
l---------zuul/ansible/2.5/action/raw.py1
l---------zuul/ansible/2.5/action/raw.pyi1
l---------zuul/ansible/2.5/action/script.py1
l---------zuul/ansible/2.5/action/script.pyi1
l---------zuul/ansible/2.5/action/sros_config.py1
l---------zuul/ansible/2.5/action/sros_config.pyi1
l---------zuul/ansible/2.5/action/synchronize.py1
l---------zuul/ansible/2.5/action/synchronize.pyi1
l---------zuul/ansible/2.5/action/template.py1
l---------zuul/ansible/2.5/action/template.pyi1
l---------zuul/ansible/2.5/action/unarchive.py1
l---------zuul/ansible/2.5/action/unarchive.pyi1
l---------zuul/ansible/2.5/action/vyos_config.py1
l---------zuul/ansible/2.5/action/vyos_config.pyi1
l---------zuul/ansible/2.5/action/win_copy.py1
l---------zuul/ansible/2.5/action/win_copy.pyi1
l---------zuul/ansible/2.5/action/win_template.py1
l---------zuul/ansible/2.5/action/win_template.pyi1
l---------zuul/ansible/2.5/actiongeneral/__init__.py1
l---------zuul/ansible/2.5/actiongeneral/command.py1
l---------zuul/ansible/2.5/actiongeneral/command.pyi1
l---------zuul/ansible/2.5/actiongeneral/zuul_return.py1
l---------zuul/ansible/2.5/callback/__init__.py1
l---------zuul/ansible/2.5/callback/zuul_json.py1
l---------zuul/ansible/2.5/callback/zuul_stream.py1
l---------zuul/ansible/2.5/callback/zuul_unreachable.py1
l---------zuul/ansible/2.5/filter/__init__.py1
l---------zuul/ansible/2.5/filter/zuul_filters.py1
l---------zuul/ansible/2.5/library/__init__.py1
l---------zuul/ansible/2.5/library/command.py1
l---------zuul/ansible/2.5/library/zuul_console.py1
l---------zuul/ansible/2.5/logconfig.py1
l---------zuul/ansible/2.5/lookup/__init__.py1
l---------zuul/ansible/2.5/lookup/_banned.py1
l---------zuul/ansible/2.5/lookup/_banned.pyi1
l---------zuul/ansible/2.5/lookup/chef_databag.py1
l---------zuul/ansible/2.5/lookup/chef_databag.pyi1
l---------zuul/ansible/2.5/lookup/consul_kv.py1
l---------zuul/ansible/2.5/lookup/consul_kv.pyi1
l---------zuul/ansible/2.5/lookup/credstash.py1
l---------zuul/ansible/2.5/lookup/credstash.pyi1
l---------zuul/ansible/2.5/lookup/csvfile.py1
l---------zuul/ansible/2.5/lookup/csvfile.pyi1
l---------zuul/ansible/2.5/lookup/cyberarkpassword.py1
l---------zuul/ansible/2.5/lookup/cyberarkpassword.pyi1
l---------zuul/ansible/2.5/lookup/dig.py1
l---------zuul/ansible/2.5/lookup/dig.pyi1
l---------zuul/ansible/2.5/lookup/dnstxt.py1
l---------zuul/ansible/2.5/lookup/dnstxt.pyi1
l---------zuul/ansible/2.5/lookup/env.py1
l---------zuul/ansible/2.5/lookup/env.pyi1
l---------zuul/ansible/2.5/lookup/etcd.py1
l---------zuul/ansible/2.5/lookup/etcd.pyi1
l---------zuul/ansible/2.5/lookup/file.py1
l---------zuul/ansible/2.5/lookup/file.pyi1
l---------zuul/ansible/2.5/lookup/fileglob.py1
l---------zuul/ansible/2.5/lookup/fileglob.pyi1
l---------zuul/ansible/2.5/lookup/filetree.py1
l---------zuul/ansible/2.5/lookup/filetree.pyi1
l---------zuul/ansible/2.5/lookup/first_found.py1
l---------zuul/ansible/2.5/lookup/first_found.pyi1
l---------zuul/ansible/2.5/lookup/hashi_valut.py1
l---------zuul/ansible/2.5/lookup/hashi_valut.pyi1
l---------zuul/ansible/2.5/lookup/hiera.py1
l---------zuul/ansible/2.5/lookup/hiera.pyi1
l---------zuul/ansible/2.5/lookup/ini.py1
l---------zuul/ansible/2.5/lookup/ini.pyi1
l---------zuul/ansible/2.5/lookup/keyring.py1
l---------zuul/ansible/2.5/lookup/keyring.pyi1
l---------zuul/ansible/2.5/lookup/lastpass.py1
l---------zuul/ansible/2.5/lookup/lastpass.pyi1
l---------zuul/ansible/2.5/lookup/lines.py1
l---------zuul/ansible/2.5/lookup/lines.pyi1
l---------zuul/ansible/2.5/lookup/mongodb.py1
l---------zuul/ansible/2.5/lookup/mongodb.pyi1
l---------zuul/ansible/2.5/lookup/password.py1
l---------zuul/ansible/2.5/lookup/password.pyi1
l---------zuul/ansible/2.5/lookup/passwordstore.py1
l---------zuul/ansible/2.5/lookup/passwordstore.pyi1
l---------zuul/ansible/2.5/lookup/pipe.py1
l---------zuul/ansible/2.5/lookup/pipe.pyi1
l---------zuul/ansible/2.5/lookup/redis_kv.py1
l---------zuul/ansible/2.5/lookup/redis_kv.pyi1
l---------zuul/ansible/2.5/lookup/shelvefile.py1
l---------zuul/ansible/2.5/lookup/shelvefile.pyi1
l---------zuul/ansible/2.5/lookup/template.py1
l---------zuul/ansible/2.5/lookup/template.pyi1
l---------zuul/ansible/2.5/lookup/url.py1
l---------zuul/ansible/2.5/lookup/url.pyi1
l---------zuul/ansible/2.5/paths.py1
-rw-r--r--zuul/ansible/base/__init__.py (renamed from zuul/ansible/action/__init__.py)0
-rw-r--r--zuul/ansible/base/action/__init__.py (renamed from zuul/ansible/actiongeneral/__init__.py)0
-rw-r--r--zuul/ansible/base/action/add_host.py (renamed from zuul/ansible/action/add_host.py)0
-rw-r--r--zuul/ansible/base/action/add_host.pyi (renamed from zuul/ansible/action/add_host.pyi)0
l---------zuul/ansible/base/action/aireos.py (renamed from zuul/ansible/action/aireos.py)0
-rw-r--r--zuul/ansible/base/action/aireos.pyi (renamed from zuul/ansible/action/aireos.pyi)0
l---------zuul/ansible/base/action/aireos_config.py (renamed from zuul/ansible/action/aireos_config.py)0
-rw-r--r--zuul/ansible/base/action/aireos_config.pyi (renamed from zuul/ansible/action/aireos_config.pyi)0
l---------zuul/ansible/base/action/aruba.py (renamed from zuul/ansible/action/aruba.py)0
-rw-r--r--zuul/ansible/base/action/aruba.pyi (renamed from zuul/ansible/action/aruba.pyi)0
l---------zuul/ansible/base/action/aruba_config.py (renamed from zuul/ansible/action/aruba_config.py)0
-rw-r--r--zuul/ansible/base/action/aruba_config.pyi (renamed from zuul/ansible/action/aruba_config.pyi)0
l---------zuul/ansible/base/action/asa.py (renamed from zuul/ansible/action/asa.py)0
-rw-r--r--zuul/ansible/base/action/asa.pyi (renamed from zuul/ansible/action/asa.pyi)0
l---------zuul/ansible/base/action/asa_config.py (renamed from zuul/ansible/action/asa_config.py)0
-rw-r--r--zuul/ansible/base/action/asa_config.pyi (renamed from zuul/ansible/action/asa_config.pyi)0
l---------zuul/ansible/base/action/asa_template.py (renamed from zuul/ansible/action/asa_template.py)0
-rw-r--r--zuul/ansible/base/action/asa_template.pyi (renamed from zuul/ansible/action/asa_template.pyi)0
-rw-r--r--zuul/ansible/base/action/assemble.py (renamed from zuul/ansible/action/assemble.py)0
-rw-r--r--zuul/ansible/base/action/assemble.pyi (renamed from zuul/ansible/action/assemble.pyi)0
l---------zuul/ansible/base/action/ce.py (renamed from zuul/ansible/action/ce.py)0
-rw-r--r--zuul/ansible/base/action/ce.pyi (renamed from zuul/ansible/action/ce.pyi)0
l---------zuul/ansible/base/action/ce_config.py (renamed from zuul/ansible/action/ce_config.py)0
-rw-r--r--zuul/ansible/base/action/ce_config.pyi (renamed from zuul/ansible/action/ce_config.pyi)0
l---------zuul/ansible/base/action/ce_template.py (renamed from zuul/ansible/action/ce_template.py)0
-rw-r--r--zuul/ansible/base/action/ce_template.pyi (renamed from zuul/ansible/action/ce_template.pyi)0
-rw-r--r--zuul/ansible/base/action/copy.py (renamed from zuul/ansible/action/copy.py)0
-rw-r--r--zuul/ansible/base/action/copy.pyi (renamed from zuul/ansible/action/copy.pyi)0
l---------zuul/ansible/base/action/dellos10_config.py (renamed from zuul/ansible/action/dellos10_config.py)0
-rw-r--r--zuul/ansible/base/action/dellos10_config.pyi (renamed from zuul/ansible/action/dellos10_config.pyi)0
l---------zuul/ansible/base/action/dellos6_config.py (renamed from zuul/ansible/action/dellos6_config.py)0
-rw-r--r--zuul/ansible/base/action/dellos6_config.pyi (renamed from zuul/ansible/action/dellos6_config.pyi)0
l---------zuul/ansible/base/action/dellos9_config.py (renamed from zuul/ansible/action/dellos9_config.py)0
-rw-r--r--zuul/ansible/base/action/dellos9_config.pyi (renamed from zuul/ansible/action/dellos9_config.pyi)0
l---------zuul/ansible/base/action/eos_config.py (renamed from zuul/ansible/action/eos_config.py)0
-rw-r--r--zuul/ansible/base/action/eos_config.pyi (renamed from zuul/ansible/action/eos_config.pyi)0
l---------zuul/ansible/base/action/eos_template.py (renamed from zuul/ansible/action/eos_template.py)0
-rw-r--r--zuul/ansible/base/action/eos_template.pyi (renamed from zuul/ansible/action/eos_template.pyi)0
-rw-r--r--zuul/ansible/base/action/fetch.py (renamed from zuul/ansible/action/fetch.py)0
-rw-r--r--zuul/ansible/base/action/fetch.pyi (renamed from zuul/ansible/action/fetch.pyi)0
l---------zuul/ansible/base/action/fortios_config.py (renamed from zuul/ansible/action/fortios_config.py)0
-rw-r--r--zuul/ansible/base/action/fortios_config.pyi (renamed from zuul/ansible/action/fortios_config.pyi)0
-rw-r--r--zuul/ansible/base/action/include_vars.py (renamed from zuul/ansible/action/include_vars.py)0
-rw-r--r--zuul/ansible/base/action/include_vars.pyi (renamed from zuul/ansible/action/include_vars.pyi)0
l---------zuul/ansible/base/action/ios_config.py (renamed from zuul/ansible/action/ios_config.py)0
-rw-r--r--zuul/ansible/base/action/ios_config.pyi (renamed from zuul/ansible/action/ios_config.pyi)0
l---------zuul/ansible/base/action/ios_template.py (renamed from zuul/ansible/action/ios_template.py)0
-rw-r--r--zuul/ansible/base/action/ios_template.pyi (renamed from zuul/ansible/action/ios_template.pyi)0
l---------zuul/ansible/base/action/iosxr_config.py (renamed from zuul/ansible/action/iosxr_config.py)0
-rw-r--r--zuul/ansible/base/action/iosxr_config.pyi (renamed from zuul/ansible/action/iosxr_config.pyi)0
l---------zuul/ansible/base/action/iosxr_template.py (renamed from zuul/ansible/action/iosxr_template.py)0
-rw-r--r--zuul/ansible/base/action/iosxr_template.pyi (renamed from zuul/ansible/action/iosxr_template.pyi)0
l---------zuul/ansible/base/action/junos_config.py (renamed from zuul/ansible/action/junos_config.py)0
-rw-r--r--zuul/ansible/base/action/junos_config.pyi (renamed from zuul/ansible/action/junos_config.pyi)0
l---------zuul/ansible/base/action/junos_template.py (renamed from zuul/ansible/action/junos_template.py)0
-rw-r--r--zuul/ansible/base/action/junos_template.pyi (renamed from zuul/ansible/action/junos_template.pyi)0
l---------zuul/ansible/base/action/net_banner.py (renamed from zuul/ansible/action/net_banner.py)0
-rw-r--r--zuul/ansible/base/action/net_banner.pyi (renamed from zuul/ansible/action/net_banner.pyi)0
l---------zuul/ansible/base/action/net_base.py (renamed from zuul/ansible/action/net_base.py)0
-rw-r--r--zuul/ansible/base/action/net_base.pyi (renamed from zuul/ansible/action/net_base.pyi)0
l---------zuul/ansible/base/action/net_config.py (renamed from zuul/ansible/action/net_config.py)0
-rw-r--r--zuul/ansible/base/action/net_config.pyi (renamed from zuul/ansible/action/net_config.pyi)0
l---------zuul/ansible/base/action/net_interface.py (renamed from zuul/ansible/action/net_interface.py)0
-rw-r--r--zuul/ansible/base/action/net_interface.pyi (renamed from zuul/ansible/action/net_interface.pyi)0
l---------zuul/ansible/base/action/net_l2_interface.py (renamed from zuul/ansible/action/net_l2_interface.py)0
-rw-r--r--zuul/ansible/base/action/net_l2_interface.pyi (renamed from zuul/ansible/action/net_l2_interface.pyi)0
l---------zuul/ansible/base/action/net_l3_interface.py (renamed from zuul/ansible/action/net_l3_interface.py)0
-rw-r--r--zuul/ansible/base/action/net_l3_interface.pyi (renamed from zuul/ansible/action/net_l3_interface.pyi)0
l---------zuul/ansible/base/action/net_linkagg.py (renamed from zuul/ansible/action/net_linkagg.py)0
-rw-r--r--zuul/ansible/base/action/net_linkagg.pyi (renamed from zuul/ansible/action/net_linkagg.pyi)0
l---------zuul/ansible/base/action/net_lldp.py (renamed from zuul/ansible/action/net_lldp.py)0
-rw-r--r--zuul/ansible/base/action/net_lldp.pyi (renamed from zuul/ansible/action/net_lldp.pyi)0
l---------zuul/ansible/base/action/net_lldp_interface.py (renamed from zuul/ansible/action/net_lldp_interface.py)0
-rw-r--r--zuul/ansible/base/action/net_lldp_interface.pyi (renamed from zuul/ansible/action/net_lldp_interface.pyi)0
l---------zuul/ansible/base/action/net_logging.py (renamed from zuul/ansible/action/net_logging.py)0
-rw-r--r--zuul/ansible/base/action/net_logging.pyi (renamed from zuul/ansible/action/net_logging.pyi)0
l---------zuul/ansible/base/action/net_ping.py (renamed from zuul/ansible/action/net_ping.py)0
-rw-r--r--zuul/ansible/base/action/net_ping.pyi (renamed from zuul/ansible/action/net_ping.pyi)0
l---------zuul/ansible/base/action/net_static_route.py (renamed from zuul/ansible/action/net_static_route.py)0
-rw-r--r--zuul/ansible/base/action/net_static_route.pyi (renamed from zuul/ansible/action/net_static_route.pyi)0
l---------zuul/ansible/base/action/net_system.py (renamed from zuul/ansible/action/net_system.py)0
-rw-r--r--zuul/ansible/base/action/net_system.pyi (renamed from zuul/ansible/action/net_system.pyi)0
l---------zuul/ansible/base/action/net_template.py (renamed from zuul/ansible/action/net_template.py)0
-rw-r--r--zuul/ansible/base/action/net_template.pyi (renamed from zuul/ansible/action/net_template.pyi)0
l---------zuul/ansible/base/action/net_user.py (renamed from zuul/ansible/action/net_user.py)0
-rw-r--r--zuul/ansible/base/action/net_user.pyi (renamed from zuul/ansible/action/net_user.pyi)0
l---------zuul/ansible/base/action/net_vlan.py (renamed from zuul/ansible/action/net_vlan.py)0
-rw-r--r--zuul/ansible/base/action/net_vlan.pyi (renamed from zuul/ansible/action/net_vlan.pyi)0
l---------zuul/ansible/base/action/net_vrf.py (renamed from zuul/ansible/action/net_vrf.py)0
-rw-r--r--zuul/ansible/base/action/net_vrf.pyi (renamed from zuul/ansible/action/net_vrf.pyi)0
l---------zuul/ansible/base/action/netconf_config.py (renamed from zuul/ansible/action/netconf_config.py)0
-rw-r--r--zuul/ansible/base/action/netconf_config.pyi (renamed from zuul/ansible/action/netconf_config.pyi)0
-rw-r--r--zuul/ansible/base/action/network.py (renamed from zuul/ansible/action/network.py)0
-rw-r--r--zuul/ansible/base/action/network.pyi (renamed from zuul/ansible/action/network.pyi)0
-rw-r--r--zuul/ansible/base/action/normal.py (renamed from zuul/ansible/action/normal.py)0
-rw-r--r--zuul/ansible/base/action/normal.pyi (renamed from zuul/ansible/action/normal.pyi)0
l---------zuul/ansible/base/action/nxos_config.py (renamed from zuul/ansible/action/nxos_config.py)0
-rw-r--r--zuul/ansible/base/action/nxos_config.pyi (renamed from zuul/ansible/action/nxos_config.pyi)0
l---------zuul/ansible/base/action/nxos_template.py (renamed from zuul/ansible/action/nxos_template.py)0
-rw-r--r--zuul/ansible/base/action/nxos_template.pyi (renamed from zuul/ansible/action/nxos_template.pyi)0
l---------zuul/ansible/base/action/ops_config.py (renamed from zuul/ansible/action/ops_config.py)0
-rw-r--r--zuul/ansible/base/action/ops_config.pyi (renamed from zuul/ansible/action/ops_config.pyi)0
l---------zuul/ansible/base/action/ops_template.py (renamed from zuul/ansible/action/ops_template.py)0
-rw-r--r--zuul/ansible/base/action/ops_template.pyi (renamed from zuul/ansible/action/ops_template.pyi)0
-rw-r--r--zuul/ansible/base/action/patch.py (renamed from zuul/ansible/action/patch.py)0
-rw-r--r--zuul/ansible/base/action/patch.pyi (renamed from zuul/ansible/action/patch.pyi)0
-rw-r--r--zuul/ansible/base/action/raw.py (renamed from zuul/ansible/action/raw.py)0
-rw-r--r--zuul/ansible/base/action/raw.pyi (renamed from zuul/ansible/action/raw.pyi)0
-rw-r--r--zuul/ansible/base/action/script.py (renamed from zuul/ansible/action/script.py)0
-rw-r--r--zuul/ansible/base/action/script.pyi (renamed from zuul/ansible/action/script.pyi)0
l---------zuul/ansible/base/action/sros_config.py (renamed from zuul/ansible/action/sros_config.py)0
-rw-r--r--zuul/ansible/base/action/sros_config.pyi (renamed from zuul/ansible/action/sros_config.pyi)0
-rw-r--r--zuul/ansible/base/action/synchronize.py (renamed from zuul/ansible/action/synchronize.py)0
-rw-r--r--zuul/ansible/base/action/synchronize.pyi (renamed from zuul/ansible/action/synchronize.pyi)0
-rw-r--r--zuul/ansible/base/action/template.py (renamed from zuul/ansible/action/template.py)0
-rw-r--r--zuul/ansible/base/action/template.pyi (renamed from zuul/ansible/action/template.pyi)0
-rw-r--r--zuul/ansible/base/action/unarchive.py (renamed from zuul/ansible/action/unarchive.py)0
-rw-r--r--zuul/ansible/base/action/unarchive.pyi (renamed from zuul/ansible/action/unarchive.pyi)0
l---------zuul/ansible/base/action/vyos_config.py (renamed from zuul/ansible/action/vyos_config.py)0
-rw-r--r--zuul/ansible/base/action/vyos_config.pyi (renamed from zuul/ansible/action/vyos_config.pyi)0
-rw-r--r--zuul/ansible/base/action/win_copy.py (renamed from zuul/ansible/action/win_copy.py)0
-rw-r--r--zuul/ansible/base/action/win_copy.pyi (renamed from zuul/ansible/action/win_copy.pyi)0
-rw-r--r--zuul/ansible/base/action/win_template.py (renamed from zuul/ansible/action/win_template.py)0
-rw-r--r--zuul/ansible/base/action/win_template.pyi (renamed from zuul/ansible/action/win_template.pyi)0
-rw-r--r--zuul/ansible/base/actiongeneral/__init__.py (renamed from zuul/ansible/callback/__init__.py)0
-rw-r--r--zuul/ansible/base/actiongeneral/command.py (renamed from zuul/ansible/actiongeneral/command.py)0
-rw-r--r--zuul/ansible/base/actiongeneral/command.pyi (renamed from zuul/ansible/actiongeneral/command.pyi)0
-rw-r--r--zuul/ansible/base/actiongeneral/zuul_return.py (renamed from zuul/ansible/actiongeneral/zuul_return.py)0
-rw-r--r--zuul/ansible/base/callback/__init__.py (renamed from zuul/ansible/filter/__init__.py)0
-rw-r--r--zuul/ansible/base/callback/zuul_json.py (renamed from zuul/ansible/callback/zuul_json.py)0
-rw-r--r--zuul/ansible/base/callback/zuul_stream.py (renamed from zuul/ansible/callback/zuul_stream.py)0
-rw-r--r--zuul/ansible/base/callback/zuul_unreachable.py (renamed from zuul/ansible/callback/zuul_unreachable.py)0
-rw-r--r--zuul/ansible/base/filter/__init__.py (renamed from zuul/ansible/library/__init__.py)0
-rw-r--r--zuul/ansible/base/filter/zuul_filters.py (renamed from zuul/ansible/filter/zuul_filters.py)0
-rw-r--r--zuul/ansible/base/library/__init__.py (renamed from zuul/ansible/lookup/__init__.py)0
-rwxr-xr-xzuul/ansible/base/library/command.py (renamed from zuul/ansible/library/command.py)0
-rw-r--r--zuul/ansible/base/library/zuul_console.py (renamed from zuul/ansible/library/zuul_console.py)0
-rw-r--r--zuul/ansible/base/lookup/__init__.py (renamed from zuul/ansible/lookup/_banned.pyi)0
-rw-r--r--zuul/ansible/base/lookup/_banned.py (renamed from zuul/ansible/lookup/_banned.py)0
-rw-r--r--zuul/ansible/base/lookup/_banned.pyi (renamed from zuul/ansible/lookup/chef_databag.pyi)0
l---------zuul/ansible/base/lookup/chef_databag.py (renamed from zuul/ansible/lookup/chef_databag.py)0
-rw-r--r--zuul/ansible/base/lookup/chef_databag.pyi (renamed from zuul/ansible/lookup/consul_kv.pyi)0
l---------zuul/ansible/base/lookup/consul_kv.py (renamed from zuul/ansible/lookup/consul_kv.py)0
-rw-r--r--zuul/ansible/base/lookup/consul_kv.pyi (renamed from zuul/ansible/lookup/credstash.pyi)0
l---------zuul/ansible/base/lookup/credstash.py (renamed from zuul/ansible/lookup/credstash.py)0
-rw-r--r--zuul/ansible/base/lookup/credstash.pyi (renamed from zuul/ansible/lookup/csvfile.pyi)0
-rw-r--r--zuul/ansible/base/lookup/csvfile.py (renamed from zuul/ansible/lookup/csvfile.py)0
-rw-r--r--zuul/ansible/base/lookup/csvfile.pyi (renamed from zuul/ansible/lookup/cyberarkpassword.pyi)0
l---------zuul/ansible/base/lookup/cyberarkpassword.py (renamed from zuul/ansible/lookup/cyberarkpassword.py)0
-rw-r--r--zuul/ansible/base/lookup/cyberarkpassword.pyi (renamed from zuul/ansible/lookup/dig.pyi)0
l---------zuul/ansible/base/lookup/dig.py (renamed from zuul/ansible/lookup/dig.py)0
-rw-r--r--zuul/ansible/base/lookup/dig.pyi (renamed from zuul/ansible/lookup/dnstxt.pyi)0
l---------zuul/ansible/base/lookup/dnstxt.py (renamed from zuul/ansible/lookup/dnstxt.py)0
-rw-r--r--zuul/ansible/base/lookup/dnstxt.pyi (renamed from zuul/ansible/lookup/env.pyi)0
l---------zuul/ansible/base/lookup/env.py (renamed from zuul/ansible/lookup/env.py)0
-rw-r--r--zuul/ansible/base/lookup/env.pyi (renamed from zuul/ansible/lookup/etcd.pyi)0
l---------zuul/ansible/base/lookup/etcd.py (renamed from zuul/ansible/lookup/etcd.py)0
-rw-r--r--zuul/ansible/base/lookup/etcd.pyi (renamed from zuul/ansible/lookup/file.pyi)0
-rw-r--r--zuul/ansible/base/lookup/file.py (renamed from zuul/ansible/lookup/file.py)0
-rw-r--r--zuul/ansible/base/lookup/file.pyi (renamed from zuul/ansible/lookup/fileglob.pyi)0
-rw-r--r--zuul/ansible/base/lookup/fileglob.py (renamed from zuul/ansible/lookup/fileglob.py)0
-rw-r--r--zuul/ansible/base/lookup/fileglob.pyi (renamed from zuul/ansible/lookup/filetree.pyi)0
-rw-r--r--zuul/ansible/base/lookup/filetree.py (renamed from zuul/ansible/lookup/filetree.py)0
-rw-r--r--zuul/ansible/base/lookup/filetree.pyi (renamed from zuul/ansible/lookup/first_found.pyi)0
-rw-r--r--zuul/ansible/base/lookup/first_found.py (renamed from zuul/ansible/lookup/first_found.py)0
-rw-r--r--zuul/ansible/base/lookup/first_found.pyi (renamed from zuul/ansible/lookup/hashi_valut.pyi)0
l---------zuul/ansible/base/lookup/hashi_valut.py (renamed from zuul/ansible/lookup/hashi_valut.py)0
-rw-r--r--zuul/ansible/base/lookup/hashi_valut.pyi (renamed from zuul/ansible/lookup/hiera.pyi)0
l---------zuul/ansible/base/lookup/hiera.py (renamed from zuul/ansible/lookup/hiera.py)0
-rw-r--r--zuul/ansible/base/lookup/hiera.pyi (renamed from zuul/ansible/lookup/ini.pyi)0
-rw-r--r--zuul/ansible/base/lookup/ini.py (renamed from zuul/ansible/lookup/ini.py)0
-rw-r--r--zuul/ansible/base/lookup/ini.pyi (renamed from zuul/ansible/lookup/keyring.pyi)0
l---------zuul/ansible/base/lookup/keyring.py (renamed from zuul/ansible/lookup/keyring.py)0
-rw-r--r--zuul/ansible/base/lookup/keyring.pyi (renamed from zuul/ansible/lookup/lastpass.pyi)0
l---------zuul/ansible/base/lookup/lastpass.py (renamed from zuul/ansible/lookup/lastpass.py)0
-rw-r--r--zuul/ansible/base/lookup/lastpass.pyi (renamed from zuul/ansible/lookup/lines.pyi)0
l---------zuul/ansible/base/lookup/lines.py (renamed from zuul/ansible/lookup/lines.py)0
-rw-r--r--zuul/ansible/base/lookup/lines.pyi (renamed from zuul/ansible/lookup/mongodb.pyi)0
l---------zuul/ansible/base/lookup/mongodb.py (renamed from zuul/ansible/lookup/mongodb.py)0
-rw-r--r--zuul/ansible/base/lookup/mongodb.pyi (renamed from zuul/ansible/lookup/password.pyi)0
l---------zuul/ansible/base/lookup/password.py (renamed from zuul/ansible/lookup/password.py)0
-rw-r--r--zuul/ansible/base/lookup/password.pyi (renamed from zuul/ansible/lookup/passwordstore.pyi)0
l---------zuul/ansible/base/lookup/passwordstore.py (renamed from zuul/ansible/lookup/passwordstore.py)0
-rw-r--r--zuul/ansible/base/lookup/passwordstore.pyi (renamed from zuul/ansible/lookup/pipe.pyi)0
l---------zuul/ansible/base/lookup/pipe.py (renamed from zuul/ansible/lookup/pipe.py)0
-rw-r--r--zuul/ansible/base/lookup/pipe.pyi (renamed from zuul/ansible/lookup/redis_kv.pyi)0
l---------zuul/ansible/base/lookup/redis_kv.py (renamed from zuul/ansible/lookup/redis_kv.py)0
-rw-r--r--zuul/ansible/base/lookup/redis_kv.pyi (renamed from zuul/ansible/lookup/shelvefile.pyi)0
l---------zuul/ansible/base/lookup/shelvefile.py (renamed from zuul/ansible/lookup/shelvefile.py)0
-rw-r--r--zuul/ansible/base/lookup/shelvefile.pyi (renamed from zuul/ansible/lookup/template.pyi)0
l---------zuul/ansible/base/lookup/template.py (renamed from zuul/ansible/lookup/template.py)0
-rw-r--r--zuul/ansible/base/lookup/template.pyi (renamed from zuul/ansible/lookup/url.pyi)0
l---------zuul/ansible/base/lookup/url.py (renamed from zuul/ansible/lookup/url.py)0
-rw-r--r--zuul/ansible/base/lookup/url.pyi0
-rw-r--r--zuul/cmd/manage_ansible.py62
-rw-r--r--zuul/executor/server.py71
-rw-r--r--zuul/lib/ansible-config.conf6
-rw-r--r--zuul/lib/ansible.py215
412 files changed, 627 insertions, 86 deletions
diff --git a/.zuul.yaml b/.zuul.yaml
index 211138207..ec009534b 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -22,12 +22,16 @@
post-run:
- playbooks/zuul-stream/post.yaml
- playbooks/zuul-stream/post-ara.yaml
- required-projects:
- - openstack/ara
files:
- zuul/ansible/.*
+ - zuul/lib/ansible*
- playbooks/zuul-stream/.*
- - requirements.txt
+
+- job:
+ name: zuul-stream-functional-2.5
+ parent: zuul-stream-functional
+ vars:
+ zuul_ansible_version: 2.5
- job:
name: zuul-tox-remote
@@ -192,7 +196,7 @@
success-url: 'npm/reports/bundle.html'
files:
- web/.*
- - zuul-stream-functional
+ - zuul-stream-functional-2.5
- zuul-tox-remote
- zuul-quick-start
- nodepool-zuul-functional:
@@ -223,7 +227,7 @@
success-url: 'npm/reports/bundle.html'
files:
- web/.*
- - zuul-stream-functional
+ - zuul-stream-functional-2.5
- zuul-tox-remote
- zuul-quick-start
- zuul-upload-image
diff --git a/Dockerfile b/Dockerfile
index a859675c8..1cc85b3cb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -24,6 +24,11 @@ COPY . /tmp/src
RUN /tmp/src/tools/install-js-tools.sh
RUN assemble
+# The wheel install method doesn't run the setup hooks as the source based
+# installations do so we have to call zuul-manage-ansible here.
+RUN /output/install-from-bindep && zuul-manage-ansible
+
+
FROM opendevorg/python-base as zuul
COPY --from=builder /output/ /output
@@ -40,8 +45,10 @@ CMD ["/usr/local/bin/zuul"]
FROM zuul as zuul-executor
COPY --from=builder /output/ /output
+COPY --from=builder /usr/local/lib/zuul/ /usr/local/lib/zuul
RUN pip install --cache-dir=/output/wheels -r /output/zuul_executor/requirements.txt \
&& rm -rf /output
+
CMD ["/usr/local/bin/zuul-executor"]
FROM zuul as zuul-fingergw
diff --git a/bindep.txt b/bindep.txt
index 0a5545fff..b63dcdc20 100644
--- a/bindep.txt
+++ b/bindep.txt
@@ -30,6 +30,9 @@ libffi6 [platform:dpkg]
libffi-devel [compile test platform:rpm]
python3-dev [compile test platform:dpkg platform:apk]
python3-devel [compile test platform:rpm]
+python-virtualenv [platform:dpkg]
+python3-virtualenv [platform:rpm]
+py3-virtualenv [compile test platform:apk]
bubblewrap [!platform:ubuntu-xenial]
libre2-dev [compile test platform:dpkg]
libre2-4 [platform:ubuntu-bionic]
diff --git a/doc/requirements.txt b/doc/requirements.txt
index 64e444d1b..ebbfd358a 100644
--- a/doc/requirements.txt
+++ b/doc/requirements.txt
@@ -1,3 +1,4 @@
+ansible
sphinx>=1.6.1
sphinxcontrib-blockdiag>=1.1.0
sphinxcontrib-programoutput
diff --git a/doc/source/admin/examples/docker-compose.yaml b/doc/source/admin/examples/docker-compose.yaml
index 1b7f8d371..ef9d826c3 100644
--- a/doc/source/admin/examples/docker-compose.yaml
+++ b/doc/source/admin/examples/docker-compose.yaml
@@ -16,7 +16,7 @@ services:
git config -f /var/gerrit/etc/gerrit.config noteDb.changes.autoMigrate true && \
/var/gerrit/bin/gerrit.sh run'
gerritconfig:
- image: zuul/zuul
+ image: zuul/zuul-executor
environment:
no_proxy: "${no_proxy},gerrit"
depends_on:
@@ -25,7 +25,7 @@ services:
- "sshkey:/var/ssh:z"
- "nodessh:/var/node:z"
- "./playbooks/:/var/playbooks/:z"
- command: "ansible-playbook /var/playbooks/setup.yaml"
+ command: "/usr/local/lib/zuul/ansible/2.5/bin/ansible-playbook /var/playbooks/setup.yaml"
zk:
image: zookeeper
mysql:
@@ -42,7 +42,9 @@ services:
- mysql
environment:
no_proxy: "${no_proxy},gerrit"
- command: "sh -c 'ansible-playbook /var/playbooks/wait-to-start.yaml; zuul-scheduler -d'"
+ command: "sh -c '/var/playbooks/wait-to-start.sh && zuul-scheduler -d'"
+ # FIXME: The scheduler has no ansible anymore so use the executor image.
+ # This needs to be changes such that ansible is not required for startup.
image: zuul/zuul-scheduler
volumes:
- "./etc_zuul/:/etc/zuul/:z"
@@ -50,7 +52,7 @@ services:
- "sshkey:/var/ssh:z"
- /var/lib/zuul
web:
- command: "sh -c 'ansible-playbook /var/playbooks/wait-to-start.yaml; zuul-web -d'"
+ command: "sh -c '/var/playbooks/wait-to-start-gearman.sh && zuul-web -d'"
depends_on:
- scheduler
- mysql
@@ -59,6 +61,7 @@ services:
image: zuul/zuul-web
volumes:
- "./etc_zuul/:/etc/zuul/:z"
+ - "./playbooks/:/var/playbooks/:z"
executor:
privileged: true
environment:
diff --git a/doc/source/admin/examples/playbooks/wait-to-start-gearman.sh b/doc/source/admin/examples/playbooks/wait-to-start-gearman.sh
new file mode 100755
index 000000000..af11d705e
--- /dev/null
+++ b/doc/source/admin/examples/playbooks/wait-to-start-gearman.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# Zuul needs to be able to connect to the remote systems in order to
+# start.
+
+wait_for_gearman() {
+ echo "Wait for gearman to start"
+ for i in $(seq 1 120); do
+ cat < /dev/null > /dev/tcp/scheduler/4730 && return
+ sleep 1
+ done
+
+ echo "Timeout waiting for mysql"
+ exit 1
+}
+
+wait_for_gearman
diff --git a/doc/source/admin/examples/playbooks/wait-to-start.sh b/doc/source/admin/examples/playbooks/wait-to-start.sh
new file mode 100755
index 000000000..1154fcf44
--- /dev/null
+++ b/doc/source/admin/examples/playbooks/wait-to-start.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+# Zuul needs to be able to connect to the remote systems in order to
+# start.
+
+wait_for_mysql() {
+ echo "Wait for mysql to start"
+ for i in $(seq 1 120); do
+ cat < /dev/null > /dev/tcp/mysql/3306 && return
+ sleep 1
+ done
+
+ echo "Timeout waiting for mysql"
+ exit 1
+}
+
+wait_for_gerrit() {
+ echo "Wait for zuul user to be created"
+ for i in $(seq 1 120); do
+ [ $(curl -s -o /dev/null -w "%{http_code}" http://admin:secret@gerrit:8080/a/accounts/zuul/sshkeys) = "200" ] && return
+ sleep 1
+ done
+
+ echo "Timeout waiting for gerrit"
+ exit 1
+}
+
+wait_for_mysql
+wait_for_gerrit
diff --git a/doc/source/admin/examples/playbooks/wait-to-start.yaml b/doc/source/admin/examples/playbooks/wait-to-start.yaml
deleted file mode 100644
index ac5a1e3b5..000000000
--- a/doc/source/admin/examples/playbooks/wait-to-start.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-# Zuul needs to be able to connect to the remote systems in order to
-# start.
-
-- hosts: localhost
- gather_facts: false
- tasks:
- - name: Wait for Gerrit to start
- wait_for:
- host: gerrit
- port: 29418
- - name: Wait for mysql to start
- wait_for:
- host: mysql
- port: 3306
- - name: Wait for zuul user to be created
- uri:
- url: http://gerrit:8080/a/accounts/zuul/sshkeys
- method: GET
- user: admin
- password: secret
- register: result
- until: result.status == 200 and result.redirected == false
- delay: 1
- retries: 120
diff --git a/doc/source/admin/installation.rst b/doc/source/admin/installation.rst
index 900d2ffa8..760c4428d 100644
--- a/doc/source/admin/installation.rst
+++ b/doc/source/admin/installation.rst
@@ -20,6 +20,9 @@ Zuul has several system-level dependencies as well. You can find a
list of operating system packages in ``bindep.txt`` in Zuul's source
directory.
+It is further required to run ``zuul-manage-ansible`` on the zuul-executor
+in order to install all supported ansible versions so zuul can use them.
+
Zuul Components
---------------
diff --git a/doc/source/admin/zuul_install.rst b/doc/source/admin/zuul_install.rst
index 83976e70d..a9cb9c6aa 100644
--- a/doc/source/admin/zuul_install.rst
+++ b/doc/source/admin/zuul_install.rst
@@ -43,6 +43,7 @@ required.
# All:
$ sudo pip3 install .
+ $ sudo zuul-manage-ansible
$ popd
Service Files
diff --git a/doc/source/developer/ansible.rst b/doc/source/developer/ansible.rst
index c5fcbb442..6e588ed0f 100644
--- a/doc/source/developer/ansible.rst
+++ b/doc/source/developer/ansible.rst
@@ -23,7 +23,7 @@ execution to ensure local actions are not executed or that for operations that
are desirable to allow locally that they only interact with files in the zuul
work directory.
-.. autoclass:: zuul.ansible.action.normal.ActionModule
+.. autoclass:: zuul.ansible.base.action.normal.ActionModule
:members:
Build Log Support
@@ -38,16 +38,16 @@ for the command to finish.
Zuul contains a modified version of the :ansible:module:`command`
that starts a log streaming daemon on the build node.
-.. automodule:: zuul.ansible.library.command
+.. automodule:: zuul.ansible.base.library.command
-All jobs run with the :py:mod:`zuul.ansible.callback.zuul_stream` callback
+All jobs run with the :py:mod:`zuul.ansible.base.callback.zuul_stream` callback
plugin enabled, which writes the build log to a file so that the
:py:class:`zuul.lib.log_streamer.LogStreamer` can provide the data on demand
over the finger protocol. Finally, :py:class:`zuul.web.LogStreamHandler`
exposes that log stream over a websocket connection as part of
:py:class:`zuul.web.ZuulWeb`.
-.. autoclass:: zuul.ansible.callback.zuul_stream.CallbackModule
+.. autoclass:: zuul.ansible.base.callback.zuul_stream.CallbackModule
:members:
.. autoclass:: zuul.lib.log_streamer.LogStreamer
@@ -55,7 +55,7 @@ exposes that log stream over a websocket connection as part of
.. autoclass:: zuul.web.ZuulWeb
In addition to real-time streaming, Zuul also installs another callback module,
-:py:mod:`zuul.ansible.callback.zuul_json.CallbackModule` that collects all
+:py:mod:`zuul.ansible.base.callback.zuul_json.CallbackModule` that collects all
of the information about a given run into a json file which is written to the
work dir so that it can be published along with build logs. Since the streaming
log is by necessity a single text stream, choices have to be made for
@@ -63,4 +63,4 @@ readability about what data is shown and what is not shown. The json log file
is intended to allow for a richer more interactive set of data to be displayed
to the user.
-.. autoclass:: zuul.ansible.callback.zuul_json.CallbackModule
+.. autoclass:: zuul.ansible.base.callback.zuul_json.CallbackModule
diff --git a/playbooks/zuul-stream/fixtures/test-stream.yaml b/playbooks/zuul-stream/fixtures/test-stream.yaml
index c4946e845..413fdee60 100644
--- a/playbooks/zuul-stream/fixtures/test-stream.yaml
+++ b/playbooks/zuul-stream/fixtures/test-stream.yaml
@@ -6,6 +6,10 @@
setup:
register: setupvar
+ - name: Output ansible version
+ debug:
+ var: ansible_version
+
- name: Output debug for a var
debug:
var: setupvar
diff --git a/playbooks/zuul-stream/functional.yaml b/playbooks/zuul-stream/functional.yaml
index a9535cd9f..9cf97e265 100644
--- a/playbooks/zuul-stream/functional.yaml
+++ b/playbooks/zuul-stream/functional.yaml
@@ -1,21 +1,31 @@
- hosts: controller
tasks:
+ - name: Set python path fact
+ set_fact:
+ python_path: "/usr/local/lib/python3.5/dist-packages"
+
- name: Run ansible that should succeed
- command: ansible-playbook src/git.openstack.org/openstack-infra/zuul/playbooks/zuul-stream/fixtures/test-stream.yaml
+ command: >
+ /usr/lib/zuul/ansible/{{ zuul_ansible_version }}/bin/ansible-playbook
+ src/git.openstack.org/openstack-infra/zuul/playbooks/zuul-stream/fixtures/test-stream.yaml
environment:
ZUUL_JOB_LOG_CONFIG: "{{ ansible_user_dir}}/logging.json"
ZUUL_JOBDIR: "{{ ansible_user_dir}}"
ARA_LOG_CONFIG: "{{ ansible_user_dir}}/logging.json"
+ PYTHONPATH: "{{ python_path }}"
- name: Run ansible playbook that should fail
- command: ansible-playbook src/git.openstack.org/openstack-infra/zuul/playbooks/zuul-stream/fixtures/test-stream-failure.yaml
+ command: >
+ /usr/lib/zuul/ansible/{{ zuul_ansible_version }}/bin/ansible-playbook
+ src/git.openstack.org/openstack-infra/zuul/playbooks/zuul-stream/fixtures/test-stream-failure.yaml
register: failed_results
failed_when: "failed_results.rc != 2"
environment:
ZUUL_JOB_LOG_CONFIG: "{{ ansible_user_dir}}/logging.json"
ZUUL_JOBDIR: "{{ ansible_user_dir}}"
ARA_LOG_CONFIG: "{{ ansible_user_dir}}/logging.json"
+ PYTHONPATH: "{{ python_path }}"
- name: Validate output - setupvar
shell: |
diff --git a/playbooks/zuul-stream/post-ara.yaml b/playbooks/zuul-stream/post-ara.yaml
index e666d21ea..dca633179 100644
--- a/playbooks/zuul-stream/post-ara.yaml
+++ b/playbooks/zuul-stream/post-ara.yaml
@@ -2,7 +2,7 @@
tasks:
- name: Generate ARA html
- command: ara generate html ara-output
+ command: /usr/lib/zuul/ansible/{{ zuul_ansible_version }}/bin/ara generate html ara-output
- name: Compress ARA html
command: gzip --recursive --best ara-output
diff --git a/playbooks/zuul-stream/pre.yaml b/playbooks/zuul-stream/pre.yaml
index 34cabcea3..5fc2e0dc9 100644
--- a/playbooks/zuul-stream/pre.yaml
+++ b/playbooks/zuul-stream/pre.yaml
@@ -11,7 +11,11 @@
post_tasks:
- name: Install software
- command: python3 -m pip install src/git.openstack.org/openstack-infra/zuul src/git.openstack.org/openstack/ara
+ command: python3 -m pip install src/git.openstack.org/openstack-infra/zuul
+ become: yes
+
+ - name: Install managed ansible versions
+ command: /usr/local/bin/zuul-manage-ansible -v
become: yes
- name: Copy inventory
diff --git a/playbooks/zuul-stream/templates/ansible.cfg.j2 b/playbooks/zuul-stream/templates/ansible.cfg.j2
index 03dff15bb..4cbc40369 100644
--- a/playbooks/zuul-stream/templates/ansible.cfg.j2
+++ b/playbooks/zuul-stream/templates/ansible.cfg.j2
@@ -2,10 +2,9 @@
inventory = {{ ansible_user_dir }}/inventory.yaml
gathering = smart
gather_subset = !all
-lookup_plugins = {{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/lookup
-action_plugins = {{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/actiongeneral:{{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/action
-callback_plugins = {{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/callback:{{ ansible_user_dir }}/src/git.openstack.org/openstack/ara/ara/plugins/callbacks
-module_utils = {{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/module_utils
+lookup_plugins = {{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/{{ zuul_ansible_version }}/lookup
+action_plugins = {{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/{{ zuul_ansible_version }}/actiongeneral:{{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/action
+callback_plugins = {{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/{{ zuul_ansible_version }}/callback:/usr/lib/zuul/ansible/{{ zuul_ansible_version }}/lib/python3.5/site-packages/ara/plugins/callbacks
stdout_callback = zuul_stream
-library = {{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/library
+library = {{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/zuul/zuul/ansible/{{ zuul_ansible_version }}/library
retry_files_enabled = False
diff --git a/requirements.txt b/requirements.txt
index bcfb3c762..d24072886 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -12,7 +12,6 @@ gear>=0.13.0,<1.0.0
apscheduler>=3.0
PrettyTable>=0.6,<0.8
babel>=1.0
-ansible>=2.5.1,<2.6
netaddr
kazoo
sqlalchemy
diff --git a/setup.cfg b/setup.cfg
index 50f53e51a..95b33f0f2 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -33,6 +33,7 @@ console_scripts =
zuul-web = zuul.cmd.web:main
zuul-migrate = zuul.cmd.migrate:main
zuul-fingergw = zuul.cmd.fingergw:main
+ zuul-manage-ansible = zuul.cmd.manage_ansible:main
[build_sphinx]
source-dir = doc/source
diff --git a/tox.ini b/tox.ini
index 600184200..a60009c72 100644
--- a/tox.ini
+++ b/tox.ini
@@ -25,6 +25,7 @@ install_command = pip install {opts} {packages}
whitelist_externals = bash
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
+commands_pre = zuul-manage-ansible -v
commands = stestr run {posargs}
stestr slowest
@@ -49,6 +50,7 @@ commands = bindep test
# --ignore-missing-imports tells mypy to not try to follow imported modules
# out of the current tree. As you might expect, we don't want to run static
# type checking on the world - just on ourselves.
+commands_pre =
commands =
flake8 {posargs}
mypy --ignore-missing-imports zuul
@@ -67,6 +69,7 @@ commands =
[testenv:docs]
deps = -r{toxinidir}/doc/requirements.txt
-r{toxinidir}/test-requirements.txt
+commands_pre =
commands =
sphinx-build -E -W -d doc/build/doctrees -b html doc/source/ doc/build/html
@@ -74,10 +77,12 @@ commands =
commands = {posargs}
[testenv:nodepool]
+commands_pre =
install_command = {[nodeenv]install_command}
commands = stestr run --concurrency=1 --test-path ./tests/nodepool {posargs}
[testenv:remote]
+commands_pre = zuul-manage-ansible -v
commands = stestr run --concurrency=1 --test-path ./tests/remote {posargs}
passenv = ZUUL_TEST_ROOT OS_STDOUT_CAPTURE OS_STDERR_CAPTURE OS_LOG_CAPTURE OS_LOG_DEFAULTS ZUUL_REMOTE_IPV4 ZUUL_SSH_KEY NODEPOOL_ZK_HOST
install_command = {[nodeenv]install_command}
diff --git a/zuul/ansible/2.5/action/__init__.py b/zuul/ansible/2.5/action/__init__.py
new file mode 120000
index 000000000..4048e7ac1
--- /dev/null
+++ b/zuul/ansible/2.5/action/__init__.py
@@ -0,0 +1 @@
+../../base/action/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/add_host.py b/zuul/ansible/2.5/action/add_host.py
new file mode 120000
index 000000000..fdb7f466b
--- /dev/null
+++ b/zuul/ansible/2.5/action/add_host.py
@@ -0,0 +1 @@
+../../base/action/add_host.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/add_host.pyi b/zuul/ansible/2.5/action/add_host.pyi
new file mode 120000
index 000000000..9257939ce
--- /dev/null
+++ b/zuul/ansible/2.5/action/add_host.pyi
@@ -0,0 +1 @@
+../../base/action/add_host.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/aireos.py b/zuul/ansible/2.5/action/aireos.py
new file mode 120000
index 000000000..f2459ab86
--- /dev/null
+++ b/zuul/ansible/2.5/action/aireos.py
@@ -0,0 +1 @@
+../../base/action/aireos.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/aireos.pyi b/zuul/ansible/2.5/action/aireos.pyi
new file mode 120000
index 000000000..f58722a86
--- /dev/null
+++ b/zuul/ansible/2.5/action/aireos.pyi
@@ -0,0 +1 @@
+../../base/action/aireos.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/aireos_config.py b/zuul/ansible/2.5/action/aireos_config.py
new file mode 120000
index 000000000..acc0dd85e
--- /dev/null
+++ b/zuul/ansible/2.5/action/aireos_config.py
@@ -0,0 +1 @@
+../../base/action/aireos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/aireos_config.pyi b/zuul/ansible/2.5/action/aireos_config.pyi
new file mode 120000
index 000000000..fc7b16cf6
--- /dev/null
+++ b/zuul/ansible/2.5/action/aireos_config.pyi
@@ -0,0 +1 @@
+../../base/action/aireos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/aruba.py b/zuul/ansible/2.5/action/aruba.py
new file mode 120000
index 000000000..8784b92ed
--- /dev/null
+++ b/zuul/ansible/2.5/action/aruba.py
@@ -0,0 +1 @@
+../../base/action/aruba.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/aruba.pyi b/zuul/ansible/2.5/action/aruba.pyi
new file mode 120000
index 000000000..228b3ecfe
--- /dev/null
+++ b/zuul/ansible/2.5/action/aruba.pyi
@@ -0,0 +1 @@
+../../base/action/aruba.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/aruba_config.py b/zuul/ansible/2.5/action/aruba_config.py
new file mode 120000
index 000000000..f50d9082b
--- /dev/null
+++ b/zuul/ansible/2.5/action/aruba_config.py
@@ -0,0 +1 @@
+../../base/action/aruba_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/aruba_config.pyi b/zuul/ansible/2.5/action/aruba_config.pyi
new file mode 120000
index 000000000..bab9d28fd
--- /dev/null
+++ b/zuul/ansible/2.5/action/aruba_config.pyi
@@ -0,0 +1 @@
+../../base/action/aruba_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/asa.py b/zuul/ansible/2.5/action/asa.py
new file mode 120000
index 000000000..3e7e93dc0
--- /dev/null
+++ b/zuul/ansible/2.5/action/asa.py
@@ -0,0 +1 @@
+../../base/action/asa.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/asa.pyi b/zuul/ansible/2.5/action/asa.pyi
new file mode 120000
index 000000000..e0cdc24b5
--- /dev/null
+++ b/zuul/ansible/2.5/action/asa.pyi
@@ -0,0 +1 @@
+../../base/action/asa.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/asa_config.py b/zuul/ansible/2.5/action/asa_config.py
new file mode 120000
index 000000000..598f400d5
--- /dev/null
+++ b/zuul/ansible/2.5/action/asa_config.py
@@ -0,0 +1 @@
+../../base/action/asa_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/asa_config.pyi b/zuul/ansible/2.5/action/asa_config.pyi
new file mode 120000
index 000000000..86fe03484
--- /dev/null
+++ b/zuul/ansible/2.5/action/asa_config.pyi
@@ -0,0 +1 @@
+../../base/action/asa_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/asa_template.py b/zuul/ansible/2.5/action/asa_template.py
new file mode 120000
index 000000000..e1e8eecbe
--- /dev/null
+++ b/zuul/ansible/2.5/action/asa_template.py
@@ -0,0 +1 @@
+../../base/action/asa_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/asa_template.pyi b/zuul/ansible/2.5/action/asa_template.pyi
new file mode 120000
index 000000000..0753101f1
--- /dev/null
+++ b/zuul/ansible/2.5/action/asa_template.pyi
@@ -0,0 +1 @@
+../../base/action/asa_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/assemble.py b/zuul/ansible/2.5/action/assemble.py
new file mode 120000
index 000000000..22273b123
--- /dev/null
+++ b/zuul/ansible/2.5/action/assemble.py
@@ -0,0 +1 @@
+../../base/action/assemble.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/assemble.pyi b/zuul/ansible/2.5/action/assemble.pyi
new file mode 120000
index 000000000..3a7074ec7
--- /dev/null
+++ b/zuul/ansible/2.5/action/assemble.pyi
@@ -0,0 +1 @@
+../../base/action/assemble.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ce.py b/zuul/ansible/2.5/action/ce.py
new file mode 120000
index 000000000..db95d9121
--- /dev/null
+++ b/zuul/ansible/2.5/action/ce.py
@@ -0,0 +1 @@
+../../base/action/ce.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ce.pyi b/zuul/ansible/2.5/action/ce.pyi
new file mode 120000
index 000000000..ba2365f2b
--- /dev/null
+++ b/zuul/ansible/2.5/action/ce.pyi
@@ -0,0 +1 @@
+../../base/action/ce.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ce_config.py b/zuul/ansible/2.5/action/ce_config.py
new file mode 120000
index 000000000..ec0319843
--- /dev/null
+++ b/zuul/ansible/2.5/action/ce_config.py
@@ -0,0 +1 @@
+../../base/action/ce_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ce_config.pyi b/zuul/ansible/2.5/action/ce_config.pyi
new file mode 120000
index 000000000..b762785d1
--- /dev/null
+++ b/zuul/ansible/2.5/action/ce_config.pyi
@@ -0,0 +1 @@
+../../base/action/ce_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ce_template.py b/zuul/ansible/2.5/action/ce_template.py
new file mode 120000
index 000000000..aa59e80a0
--- /dev/null
+++ b/zuul/ansible/2.5/action/ce_template.py
@@ -0,0 +1 @@
+../../base/action/ce_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ce_template.pyi b/zuul/ansible/2.5/action/ce_template.pyi
new file mode 120000
index 000000000..75ba2250c
--- /dev/null
+++ b/zuul/ansible/2.5/action/ce_template.pyi
@@ -0,0 +1 @@
+../../base/action/ce_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/copy.py b/zuul/ansible/2.5/action/copy.py
new file mode 120000
index 000000000..1c0c2291f
--- /dev/null
+++ b/zuul/ansible/2.5/action/copy.py
@@ -0,0 +1 @@
+../../base/action/copy.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/copy.pyi b/zuul/ansible/2.5/action/copy.pyi
new file mode 120000
index 000000000..189722f2a
--- /dev/null
+++ b/zuul/ansible/2.5/action/copy.pyi
@@ -0,0 +1 @@
+../../base/action/copy.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/dellos10_config.py b/zuul/ansible/2.5/action/dellos10_config.py
new file mode 120000
index 000000000..caf6ce6c3
--- /dev/null
+++ b/zuul/ansible/2.5/action/dellos10_config.py
@@ -0,0 +1 @@
+../../base/action/dellos10_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/dellos10_config.pyi b/zuul/ansible/2.5/action/dellos10_config.pyi
new file mode 120000
index 000000000..ede9a927e
--- /dev/null
+++ b/zuul/ansible/2.5/action/dellos10_config.pyi
@@ -0,0 +1 @@
+../../base/action/dellos10_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/dellos6_config.py b/zuul/ansible/2.5/action/dellos6_config.py
new file mode 120000
index 000000000..080fcce4c
--- /dev/null
+++ b/zuul/ansible/2.5/action/dellos6_config.py
@@ -0,0 +1 @@
+../../base/action/dellos6_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/dellos6_config.pyi b/zuul/ansible/2.5/action/dellos6_config.pyi
new file mode 120000
index 000000000..d5cf3ce15
--- /dev/null
+++ b/zuul/ansible/2.5/action/dellos6_config.pyi
@@ -0,0 +1 @@
+../../base/action/dellos6_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/dellos9_config.py b/zuul/ansible/2.5/action/dellos9_config.py
new file mode 120000
index 000000000..c2e79870c
--- /dev/null
+++ b/zuul/ansible/2.5/action/dellos9_config.py
@@ -0,0 +1 @@
+../../base/action/dellos9_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/dellos9_config.pyi b/zuul/ansible/2.5/action/dellos9_config.pyi
new file mode 120000
index 000000000..b50389ab4
--- /dev/null
+++ b/zuul/ansible/2.5/action/dellos9_config.pyi
@@ -0,0 +1 @@
+../../base/action/dellos9_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/eos_config.py b/zuul/ansible/2.5/action/eos_config.py
new file mode 120000
index 000000000..4d1ab53bb
--- /dev/null
+++ b/zuul/ansible/2.5/action/eos_config.py
@@ -0,0 +1 @@
+../../base/action/eos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/eos_config.pyi b/zuul/ansible/2.5/action/eos_config.pyi
new file mode 120000
index 000000000..f6d058ba1
--- /dev/null
+++ b/zuul/ansible/2.5/action/eos_config.pyi
@@ -0,0 +1 @@
+../../base/action/eos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/eos_template.py b/zuul/ansible/2.5/action/eos_template.py
new file mode 120000
index 000000000..a108bf66f
--- /dev/null
+++ b/zuul/ansible/2.5/action/eos_template.py
@@ -0,0 +1 @@
+../../base/action/eos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/eos_template.pyi b/zuul/ansible/2.5/action/eos_template.pyi
new file mode 120000
index 000000000..b9cac42e8
--- /dev/null
+++ b/zuul/ansible/2.5/action/eos_template.pyi
@@ -0,0 +1 @@
+../../base/action/eos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/fetch.py b/zuul/ansible/2.5/action/fetch.py
new file mode 120000
index 000000000..d53e02548
--- /dev/null
+++ b/zuul/ansible/2.5/action/fetch.py
@@ -0,0 +1 @@
+../../base/action/fetch.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/fetch.pyi b/zuul/ansible/2.5/action/fetch.pyi
new file mode 120000
index 000000000..b3ae31523
--- /dev/null
+++ b/zuul/ansible/2.5/action/fetch.pyi
@@ -0,0 +1 @@
+../../base/action/fetch.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/fortios_config.py b/zuul/ansible/2.5/action/fortios_config.py
new file mode 120000
index 000000000..ef38743bc
--- /dev/null
+++ b/zuul/ansible/2.5/action/fortios_config.py
@@ -0,0 +1 @@
+../../base/action/fortios_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/fortios_config.pyi b/zuul/ansible/2.5/action/fortios_config.pyi
new file mode 120000
index 000000000..fa334a059
--- /dev/null
+++ b/zuul/ansible/2.5/action/fortios_config.pyi
@@ -0,0 +1 @@
+../../base/action/fortios_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/include_vars.py b/zuul/ansible/2.5/action/include_vars.py
new file mode 120000
index 000000000..832d5a27a
--- /dev/null
+++ b/zuul/ansible/2.5/action/include_vars.py
@@ -0,0 +1 @@
+../../base/action/include_vars.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/include_vars.pyi b/zuul/ansible/2.5/action/include_vars.pyi
new file mode 120000
index 000000000..4099c1ae6
--- /dev/null
+++ b/zuul/ansible/2.5/action/include_vars.pyi
@@ -0,0 +1 @@
+../../base/action/include_vars.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ios_config.py b/zuul/ansible/2.5/action/ios_config.py
new file mode 120000
index 000000000..f1495d47e
--- /dev/null
+++ b/zuul/ansible/2.5/action/ios_config.py
@@ -0,0 +1 @@
+../../base/action/ios_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ios_config.pyi b/zuul/ansible/2.5/action/ios_config.pyi
new file mode 120000
index 000000000..e6af5e34c
--- /dev/null
+++ b/zuul/ansible/2.5/action/ios_config.pyi
@@ -0,0 +1 @@
+../../base/action/ios_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ios_template.py b/zuul/ansible/2.5/action/ios_template.py
new file mode 120000
index 000000000..ef863cedf
--- /dev/null
+++ b/zuul/ansible/2.5/action/ios_template.py
@@ -0,0 +1 @@
+../../base/action/ios_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ios_template.pyi b/zuul/ansible/2.5/action/ios_template.pyi
new file mode 120000
index 000000000..c37247812
--- /dev/null
+++ b/zuul/ansible/2.5/action/ios_template.pyi
@@ -0,0 +1 @@
+../../base/action/ios_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/iosxr_config.py b/zuul/ansible/2.5/action/iosxr_config.py
new file mode 120000
index 000000000..4eb293626
--- /dev/null
+++ b/zuul/ansible/2.5/action/iosxr_config.py
@@ -0,0 +1 @@
+../../base/action/iosxr_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/iosxr_config.pyi b/zuul/ansible/2.5/action/iosxr_config.pyi
new file mode 120000
index 000000000..70a2d67a3
--- /dev/null
+++ b/zuul/ansible/2.5/action/iosxr_config.pyi
@@ -0,0 +1 @@
+../../base/action/iosxr_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/iosxr_template.py b/zuul/ansible/2.5/action/iosxr_template.py
new file mode 120000
index 000000000..6a60fa49e
--- /dev/null
+++ b/zuul/ansible/2.5/action/iosxr_template.py
@@ -0,0 +1 @@
+../../base/action/iosxr_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/iosxr_template.pyi b/zuul/ansible/2.5/action/iosxr_template.pyi
new file mode 120000
index 000000000..918f5a113
--- /dev/null
+++ b/zuul/ansible/2.5/action/iosxr_template.pyi
@@ -0,0 +1 @@
+../../base/action/iosxr_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/junos_config.py b/zuul/ansible/2.5/action/junos_config.py
new file mode 120000
index 000000000..c50f3bc67
--- /dev/null
+++ b/zuul/ansible/2.5/action/junos_config.py
@@ -0,0 +1 @@
+../../base/action/junos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/junos_config.pyi b/zuul/ansible/2.5/action/junos_config.pyi
new file mode 120000
index 000000000..31cbba451
--- /dev/null
+++ b/zuul/ansible/2.5/action/junos_config.pyi
@@ -0,0 +1 @@
+../../base/action/junos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/junos_template.py b/zuul/ansible/2.5/action/junos_template.py
new file mode 120000
index 000000000..a2119b7cd
--- /dev/null
+++ b/zuul/ansible/2.5/action/junos_template.py
@@ -0,0 +1 @@
+../../base/action/junos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/junos_template.pyi b/zuul/ansible/2.5/action/junos_template.pyi
new file mode 120000
index 000000000..e6ef22ba9
--- /dev/null
+++ b/zuul/ansible/2.5/action/junos_template.pyi
@@ -0,0 +1 @@
+../../base/action/junos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_banner.py b/zuul/ansible/2.5/action/net_banner.py
new file mode 120000
index 000000000..69cc6d5a4
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_banner.py
@@ -0,0 +1 @@
+../../base/action/net_banner.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_banner.pyi b/zuul/ansible/2.5/action/net_banner.pyi
new file mode 120000
index 000000000..f926dbf70
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_banner.pyi
@@ -0,0 +1 @@
+../../base/action/net_banner.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_base.py b/zuul/ansible/2.5/action/net_base.py
new file mode 120000
index 000000000..f36b6ecc7
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_base.py
@@ -0,0 +1 @@
+../../base/action/net_base.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_base.pyi b/zuul/ansible/2.5/action/net_base.pyi
new file mode 120000
index 000000000..9f6ce1b7d
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_base.pyi
@@ -0,0 +1 @@
+../../base/action/net_base.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_config.py b/zuul/ansible/2.5/action/net_config.py
new file mode 120000
index 000000000..a817ca518
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_config.py
@@ -0,0 +1 @@
+../../base/action/net_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_config.pyi b/zuul/ansible/2.5/action/net_config.pyi
new file mode 120000
index 000000000..412b8110e
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_config.pyi
@@ -0,0 +1 @@
+../../base/action/net_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_interface.py b/zuul/ansible/2.5/action/net_interface.py
new file mode 120000
index 000000000..1d24f7821
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_interface.py
@@ -0,0 +1 @@
+../../base/action/net_interface.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_interface.pyi b/zuul/ansible/2.5/action/net_interface.pyi
new file mode 120000
index 000000000..57bb45316
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_interface.pyi
@@ -0,0 +1 @@
+../../base/action/net_interface.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_l2_interface.py b/zuul/ansible/2.5/action/net_l2_interface.py
new file mode 120000
index 000000000..1f44192c8
--- /dev/null
+++ b/zuul/ansible/2.5/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.5/action/net_l2_interface.pyi b/zuul/ansible/2.5/action/net_l2_interface.pyi
new file mode 120000
index 000000000..2b780821d
--- /dev/null
+++ b/zuul/ansible/2.5/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.5/action/net_l3_interface.py b/zuul/ansible/2.5/action/net_l3_interface.py
new file mode 120000
index 000000000..97017f4e3
--- /dev/null
+++ b/zuul/ansible/2.5/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.5/action/net_l3_interface.pyi b/zuul/ansible/2.5/action/net_l3_interface.pyi
new file mode 120000
index 000000000..9317599a2
--- /dev/null
+++ b/zuul/ansible/2.5/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.5/action/net_linkagg.py b/zuul/ansible/2.5/action/net_linkagg.py
new file mode 120000
index 000000000..d3fc53dd1
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_linkagg.py
@@ -0,0 +1 @@
+../../base/action/net_linkagg.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_linkagg.pyi b/zuul/ansible/2.5/action/net_linkagg.pyi
new file mode 120000
index 000000000..b5fac56b6
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_linkagg.pyi
@@ -0,0 +1 @@
+../../base/action/net_linkagg.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_lldp.py b/zuul/ansible/2.5/action/net_lldp.py
new file mode 120000
index 000000000..15fc3a859
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_lldp.py
@@ -0,0 +1 @@
+../../base/action/net_lldp.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_lldp.pyi b/zuul/ansible/2.5/action/net_lldp.pyi
new file mode 120000
index 000000000..a627fdec7
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_lldp.pyi
@@ -0,0 +1 @@
+../../base/action/net_lldp.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_lldp_interface.py b/zuul/ansible/2.5/action/net_lldp_interface.py
new file mode 120000
index 000000000..f57ec137f
--- /dev/null
+++ b/zuul/ansible/2.5/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.5/action/net_lldp_interface.pyi b/zuul/ansible/2.5/action/net_lldp_interface.pyi
new file mode 120000
index 000000000..fdd97b078
--- /dev/null
+++ b/zuul/ansible/2.5/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.5/action/net_logging.py b/zuul/ansible/2.5/action/net_logging.py
new file mode 120000
index 000000000..57d9766aa
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_logging.py
@@ -0,0 +1 @@
+../../base/action/net_logging.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_logging.pyi b/zuul/ansible/2.5/action/net_logging.pyi
new file mode 120000
index 000000000..1d6f1b029
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_logging.pyi
@@ -0,0 +1 @@
+../../base/action/net_logging.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_ping.py b/zuul/ansible/2.5/action/net_ping.py
new file mode 120000
index 000000000..696d9f526
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_ping.py
@@ -0,0 +1 @@
+../../base/action/net_ping.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_ping.pyi b/zuul/ansible/2.5/action/net_ping.pyi
new file mode 120000
index 000000000..03f84e975
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_ping.pyi
@@ -0,0 +1 @@
+../../base/action/net_ping.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_static_route.py b/zuul/ansible/2.5/action/net_static_route.py
new file mode 120000
index 000000000..c22b7f0e0
--- /dev/null
+++ b/zuul/ansible/2.5/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.5/action/net_static_route.pyi b/zuul/ansible/2.5/action/net_static_route.pyi
new file mode 120000
index 000000000..859c20fec
--- /dev/null
+++ b/zuul/ansible/2.5/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.5/action/net_system.py b/zuul/ansible/2.5/action/net_system.py
new file mode 120000
index 000000000..a03dd93c9
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_system.py
@@ -0,0 +1 @@
+../../base/action/net_system.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_system.pyi b/zuul/ansible/2.5/action/net_system.pyi
new file mode 120000
index 000000000..cc159053b
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_system.pyi
@@ -0,0 +1 @@
+../../base/action/net_system.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_template.py b/zuul/ansible/2.5/action/net_template.py
new file mode 120000
index 000000000..18ba965e4
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_template.py
@@ -0,0 +1 @@
+../../base/action/net_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_template.pyi b/zuul/ansible/2.5/action/net_template.pyi
new file mode 120000
index 000000000..3bfbb6f0f
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_template.pyi
@@ -0,0 +1 @@
+../../base/action/net_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_user.py b/zuul/ansible/2.5/action/net_user.py
new file mode 120000
index 000000000..fcfb3f55a
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_user.py
@@ -0,0 +1 @@
+../../base/action/net_user.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_user.pyi b/zuul/ansible/2.5/action/net_user.pyi
new file mode 120000
index 000000000..267f5da34
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_user.pyi
@@ -0,0 +1 @@
+../../base/action/net_user.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_vlan.py b/zuul/ansible/2.5/action/net_vlan.py
new file mode 120000
index 000000000..df275656f
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_vlan.py
@@ -0,0 +1 @@
+../../base/action/net_vlan.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_vlan.pyi b/zuul/ansible/2.5/action/net_vlan.pyi
new file mode 120000
index 000000000..718074899
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_vlan.pyi
@@ -0,0 +1 @@
+../../base/action/net_vlan.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_vrf.py b/zuul/ansible/2.5/action/net_vrf.py
new file mode 120000
index 000000000..c757d2100
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_vrf.py
@@ -0,0 +1 @@
+../../base/action/net_vrf.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/net_vrf.pyi b/zuul/ansible/2.5/action/net_vrf.pyi
new file mode 120000
index 000000000..df043a0cd
--- /dev/null
+++ b/zuul/ansible/2.5/action/net_vrf.pyi
@@ -0,0 +1 @@
+../../base/action/net_vrf.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/netconf_config.py b/zuul/ansible/2.5/action/netconf_config.py
new file mode 120000
index 000000000..4d13bb82c
--- /dev/null
+++ b/zuul/ansible/2.5/action/netconf_config.py
@@ -0,0 +1 @@
+../../base/action/netconf_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/netconf_config.pyi b/zuul/ansible/2.5/action/netconf_config.pyi
new file mode 120000
index 000000000..c75a746b4
--- /dev/null
+++ b/zuul/ansible/2.5/action/netconf_config.pyi
@@ -0,0 +1 @@
+../../base/action/netconf_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/network.py b/zuul/ansible/2.5/action/network.py
new file mode 120000
index 000000000..9e2d1baa4
--- /dev/null
+++ b/zuul/ansible/2.5/action/network.py
@@ -0,0 +1 @@
+../../base/action/network.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/network.pyi b/zuul/ansible/2.5/action/network.pyi
new file mode 120000
index 000000000..e1842d197
--- /dev/null
+++ b/zuul/ansible/2.5/action/network.pyi
@@ -0,0 +1 @@
+../../base/action/network.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/normal.py b/zuul/ansible/2.5/action/normal.py
new file mode 120000
index 000000000..4e131d98d
--- /dev/null
+++ b/zuul/ansible/2.5/action/normal.py
@@ -0,0 +1 @@
+../../base/action/normal.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/normal.pyi b/zuul/ansible/2.5/action/normal.pyi
new file mode 120000
index 000000000..bbbe0704c
--- /dev/null
+++ b/zuul/ansible/2.5/action/normal.pyi
@@ -0,0 +1 @@
+../../base/action/normal.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/nxos_config.py b/zuul/ansible/2.5/action/nxos_config.py
new file mode 120000
index 000000000..0cc233c34
--- /dev/null
+++ b/zuul/ansible/2.5/action/nxos_config.py
@@ -0,0 +1 @@
+../../base/action/nxos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/nxos_config.pyi b/zuul/ansible/2.5/action/nxos_config.pyi
new file mode 120000
index 000000000..b2e63b6e3
--- /dev/null
+++ b/zuul/ansible/2.5/action/nxos_config.pyi
@@ -0,0 +1 @@
+../../base/action/nxos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/nxos_template.py b/zuul/ansible/2.5/action/nxos_template.py
new file mode 120000
index 000000000..3d599062a
--- /dev/null
+++ b/zuul/ansible/2.5/action/nxos_template.py
@@ -0,0 +1 @@
+../../base/action/nxos_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/nxos_template.pyi b/zuul/ansible/2.5/action/nxos_template.pyi
new file mode 120000
index 000000000..e36fa4e90
--- /dev/null
+++ b/zuul/ansible/2.5/action/nxos_template.pyi
@@ -0,0 +1 @@
+../../base/action/nxos_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ops_config.py b/zuul/ansible/2.5/action/ops_config.py
new file mode 120000
index 000000000..2abe0669d
--- /dev/null
+++ b/zuul/ansible/2.5/action/ops_config.py
@@ -0,0 +1 @@
+../../base/action/ops_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ops_config.pyi b/zuul/ansible/2.5/action/ops_config.pyi
new file mode 120000
index 000000000..7517f9c7b
--- /dev/null
+++ b/zuul/ansible/2.5/action/ops_config.pyi
@@ -0,0 +1 @@
+../../base/action/ops_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ops_template.py b/zuul/ansible/2.5/action/ops_template.py
new file mode 120000
index 000000000..5c841ca57
--- /dev/null
+++ b/zuul/ansible/2.5/action/ops_template.py
@@ -0,0 +1 @@
+../../base/action/ops_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/ops_template.pyi b/zuul/ansible/2.5/action/ops_template.pyi
new file mode 120000
index 000000000..4baa28a3f
--- /dev/null
+++ b/zuul/ansible/2.5/action/ops_template.pyi
@@ -0,0 +1 @@
+../../base/action/ops_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/patch.py b/zuul/ansible/2.5/action/patch.py
new file mode 120000
index 000000000..8996710ba
--- /dev/null
+++ b/zuul/ansible/2.5/action/patch.py
@@ -0,0 +1 @@
+../../base/action/patch.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/patch.pyi b/zuul/ansible/2.5/action/patch.pyi
new file mode 120000
index 000000000..577e43600
--- /dev/null
+++ b/zuul/ansible/2.5/action/patch.pyi
@@ -0,0 +1 @@
+../../base/action/patch.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/raw.py b/zuul/ansible/2.5/action/raw.py
new file mode 120000
index 000000000..e4962dd8a
--- /dev/null
+++ b/zuul/ansible/2.5/action/raw.py
@@ -0,0 +1 @@
+../../base/action/raw.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/raw.pyi b/zuul/ansible/2.5/action/raw.pyi
new file mode 120000
index 000000000..741945ef2
--- /dev/null
+++ b/zuul/ansible/2.5/action/raw.pyi
@@ -0,0 +1 @@
+../../base/action/raw.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/script.py b/zuul/ansible/2.5/action/script.py
new file mode 120000
index 000000000..1cccf5805
--- /dev/null
+++ b/zuul/ansible/2.5/action/script.py
@@ -0,0 +1 @@
+../../base/action/script.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/script.pyi b/zuul/ansible/2.5/action/script.pyi
new file mode 120000
index 000000000..aff69744b
--- /dev/null
+++ b/zuul/ansible/2.5/action/script.pyi
@@ -0,0 +1 @@
+../../base/action/script.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/sros_config.py b/zuul/ansible/2.5/action/sros_config.py
new file mode 120000
index 000000000..1762874e4
--- /dev/null
+++ b/zuul/ansible/2.5/action/sros_config.py
@@ -0,0 +1 @@
+../../base/action/sros_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/sros_config.pyi b/zuul/ansible/2.5/action/sros_config.pyi
new file mode 120000
index 000000000..453e4b8e1
--- /dev/null
+++ b/zuul/ansible/2.5/action/sros_config.pyi
@@ -0,0 +1 @@
+../../base/action/sros_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/synchronize.py b/zuul/ansible/2.5/action/synchronize.py
new file mode 120000
index 000000000..f2126166c
--- /dev/null
+++ b/zuul/ansible/2.5/action/synchronize.py
@@ -0,0 +1 @@
+../../base/action/synchronize.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/synchronize.pyi b/zuul/ansible/2.5/action/synchronize.pyi
new file mode 120000
index 000000000..4ff1a2ee9
--- /dev/null
+++ b/zuul/ansible/2.5/action/synchronize.pyi
@@ -0,0 +1 @@
+../../base/action/synchronize.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/template.py b/zuul/ansible/2.5/action/template.py
new file mode 120000
index 000000000..720717d83
--- /dev/null
+++ b/zuul/ansible/2.5/action/template.py
@@ -0,0 +1 @@
+../../base/action/template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/template.pyi b/zuul/ansible/2.5/action/template.pyi
new file mode 120000
index 000000000..aed7fb07a
--- /dev/null
+++ b/zuul/ansible/2.5/action/template.pyi
@@ -0,0 +1 @@
+../../base/action/template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/unarchive.py b/zuul/ansible/2.5/action/unarchive.py
new file mode 120000
index 000000000..2d7ce5aed
--- /dev/null
+++ b/zuul/ansible/2.5/action/unarchive.py
@@ -0,0 +1 @@
+../../base/action/unarchive.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/unarchive.pyi b/zuul/ansible/2.5/action/unarchive.pyi
new file mode 120000
index 000000000..fead9ca55
--- /dev/null
+++ b/zuul/ansible/2.5/action/unarchive.pyi
@@ -0,0 +1 @@
+../../base/action/unarchive.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/vyos_config.py b/zuul/ansible/2.5/action/vyos_config.py
new file mode 120000
index 000000000..2732fd7a1
--- /dev/null
+++ b/zuul/ansible/2.5/action/vyos_config.py
@@ -0,0 +1 @@
+../../base/action/vyos_config.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/vyos_config.pyi b/zuul/ansible/2.5/action/vyos_config.pyi
new file mode 120000
index 000000000..ac5d76632
--- /dev/null
+++ b/zuul/ansible/2.5/action/vyos_config.pyi
@@ -0,0 +1 @@
+../../base/action/vyos_config.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/win_copy.py b/zuul/ansible/2.5/action/win_copy.py
new file mode 120000
index 000000000..80c3f3846
--- /dev/null
+++ b/zuul/ansible/2.5/action/win_copy.py
@@ -0,0 +1 @@
+../../base/action/win_copy.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/win_copy.pyi b/zuul/ansible/2.5/action/win_copy.pyi
new file mode 120000
index 000000000..017c792ff
--- /dev/null
+++ b/zuul/ansible/2.5/action/win_copy.pyi
@@ -0,0 +1 @@
+../../base/action/win_copy.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/win_template.py b/zuul/ansible/2.5/action/win_template.py
new file mode 120000
index 000000000..f2a8b2d63
--- /dev/null
+++ b/zuul/ansible/2.5/action/win_template.py
@@ -0,0 +1 @@
+../../base/action/win_template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/action/win_template.pyi b/zuul/ansible/2.5/action/win_template.pyi
new file mode 120000
index 000000000..40825895b
--- /dev/null
+++ b/zuul/ansible/2.5/action/win_template.pyi
@@ -0,0 +1 @@
+../../base/action/win_template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/actiongeneral/__init__.py b/zuul/ansible/2.5/actiongeneral/__init__.py
new file mode 120000
index 000000000..38d887448
--- /dev/null
+++ b/zuul/ansible/2.5/actiongeneral/__init__.py
@@ -0,0 +1 @@
+../../base/actiongeneral/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/actiongeneral/command.py b/zuul/ansible/2.5/actiongeneral/command.py
new file mode 120000
index 000000000..f190db2cc
--- /dev/null
+++ b/zuul/ansible/2.5/actiongeneral/command.py
@@ -0,0 +1 @@
+../../base/actiongeneral/command.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/actiongeneral/command.pyi b/zuul/ansible/2.5/actiongeneral/command.pyi
new file mode 120000
index 000000000..81305dd03
--- /dev/null
+++ b/zuul/ansible/2.5/actiongeneral/command.pyi
@@ -0,0 +1 @@
+../../base/actiongeneral/command.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/actiongeneral/zuul_return.py b/zuul/ansible/2.5/actiongeneral/zuul_return.py
new file mode 120000
index 000000000..2f5b2559e
--- /dev/null
+++ b/zuul/ansible/2.5/actiongeneral/zuul_return.py
@@ -0,0 +1 @@
+../../base/actiongeneral/zuul_return.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/callback/__init__.py b/zuul/ansible/2.5/callback/__init__.py
new file mode 120000
index 000000000..00b974388
--- /dev/null
+++ b/zuul/ansible/2.5/callback/__init__.py
@@ -0,0 +1 @@
+../../base/callback/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/callback/zuul_json.py b/zuul/ansible/2.5/callback/zuul_json.py
new file mode 120000
index 000000000..b0a07779b
--- /dev/null
+++ b/zuul/ansible/2.5/callback/zuul_json.py
@@ -0,0 +1 @@
+../../base/callback/zuul_json.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/callback/zuul_stream.py b/zuul/ansible/2.5/callback/zuul_stream.py
new file mode 120000
index 000000000..f75561bf4
--- /dev/null
+++ b/zuul/ansible/2.5/callback/zuul_stream.py
@@ -0,0 +1 @@
+../../base/callback/zuul_stream.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/callback/zuul_unreachable.py b/zuul/ansible/2.5/callback/zuul_unreachable.py
new file mode 120000
index 000000000..205baca6f
--- /dev/null
+++ b/zuul/ansible/2.5/callback/zuul_unreachable.py
@@ -0,0 +1 @@
+../../base/callback/zuul_unreachable.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/filter/__init__.py b/zuul/ansible/2.5/filter/__init__.py
new file mode 120000
index 000000000..f80a4da61
--- /dev/null
+++ b/zuul/ansible/2.5/filter/__init__.py
@@ -0,0 +1 @@
+../../base/filter/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/filter/zuul_filters.py b/zuul/ansible/2.5/filter/zuul_filters.py
new file mode 120000
index 000000000..d406e5fe6
--- /dev/null
+++ b/zuul/ansible/2.5/filter/zuul_filters.py
@@ -0,0 +1 @@
+../../base/filter/zuul_filters.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/library/__init__.py b/zuul/ansible/2.5/library/__init__.py
new file mode 120000
index 000000000..0b68ce0f4
--- /dev/null
+++ b/zuul/ansible/2.5/library/__init__.py
@@ -0,0 +1 @@
+../../base/library/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/library/command.py b/zuul/ansible/2.5/library/command.py
new file mode 120000
index 000000000..9c7633169
--- /dev/null
+++ b/zuul/ansible/2.5/library/command.py
@@ -0,0 +1 @@
+../../base/library/command.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/library/zuul_console.py b/zuul/ansible/2.5/library/zuul_console.py
new file mode 120000
index 000000000..7c905e0f9
--- /dev/null
+++ b/zuul/ansible/2.5/library/zuul_console.py
@@ -0,0 +1 @@
+../../base/library/zuul_console.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/logconfig.py b/zuul/ansible/2.5/logconfig.py
new file mode 120000
index 000000000..767cb2e81
--- /dev/null
+++ b/zuul/ansible/2.5/logconfig.py
@@ -0,0 +1 @@
+../logconfig.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/__init__.py b/zuul/ansible/2.5/lookup/__init__.py
new file mode 120000
index 000000000..b008ecb3b
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/__init__.py
@@ -0,0 +1 @@
+../../base/lookup/__init__.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/_banned.py b/zuul/ansible/2.5/lookup/_banned.py
new file mode 120000
index 000000000..2e127f4e7
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/_banned.py
@@ -0,0 +1 @@
+../../base/lookup/_banned.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/_banned.pyi b/zuul/ansible/2.5/lookup/_banned.pyi
new file mode 120000
index 000000000..d7909135d
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/_banned.pyi
@@ -0,0 +1 @@
+../../base/lookup/_banned.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/chef_databag.py b/zuul/ansible/2.5/lookup/chef_databag.py
new file mode 120000
index 000000000..d4efe7e85
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/chef_databag.py
@@ -0,0 +1 @@
+../../base/lookup/chef_databag.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/chef_databag.pyi b/zuul/ansible/2.5/lookup/chef_databag.pyi
new file mode 120000
index 000000000..c06fc3001
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/chef_databag.pyi
@@ -0,0 +1 @@
+../../base/lookup/chef_databag.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/consul_kv.py b/zuul/ansible/2.5/lookup/consul_kv.py
new file mode 120000
index 000000000..66b6f7617
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/consul_kv.py
@@ -0,0 +1 @@
+../../base/lookup/consul_kv.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/consul_kv.pyi b/zuul/ansible/2.5/lookup/consul_kv.pyi
new file mode 120000
index 000000000..33d848347
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/consul_kv.pyi
@@ -0,0 +1 @@
+../../base/lookup/consul_kv.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/credstash.py b/zuul/ansible/2.5/lookup/credstash.py
new file mode 120000
index 000000000..2c343a27e
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/credstash.py
@@ -0,0 +1 @@
+../../base/lookup/credstash.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/credstash.pyi b/zuul/ansible/2.5/lookup/credstash.pyi
new file mode 120000
index 000000000..071af9d1a
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/credstash.pyi
@@ -0,0 +1 @@
+../../base/lookup/credstash.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/csvfile.py b/zuul/ansible/2.5/lookup/csvfile.py
new file mode 120000
index 000000000..981754791
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/csvfile.py
@@ -0,0 +1 @@
+../../base/lookup/csvfile.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/csvfile.pyi b/zuul/ansible/2.5/lookup/csvfile.pyi
new file mode 120000
index 000000000..18ded3684
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/csvfile.pyi
@@ -0,0 +1 @@
+../../base/lookup/csvfile.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/cyberarkpassword.py b/zuul/ansible/2.5/lookup/cyberarkpassword.py
new file mode 120000
index 000000000..a573c0cf3
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/cyberarkpassword.py
@@ -0,0 +1 @@
+../../base/lookup/cyberarkpassword.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/cyberarkpassword.pyi b/zuul/ansible/2.5/lookup/cyberarkpassword.pyi
new file mode 120000
index 000000000..01543847e
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/cyberarkpassword.pyi
@@ -0,0 +1 @@
+../../base/lookup/cyberarkpassword.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/dig.py b/zuul/ansible/2.5/lookup/dig.py
new file mode 120000
index 000000000..92a628c4a
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/dig.py
@@ -0,0 +1 @@
+../../base/lookup/dig.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/dig.pyi b/zuul/ansible/2.5/lookup/dig.pyi
new file mode 120000
index 000000000..7268b42c3
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/dig.pyi
@@ -0,0 +1 @@
+../../base/lookup/dig.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/dnstxt.py b/zuul/ansible/2.5/lookup/dnstxt.py
new file mode 120000
index 000000000..aa3e0f2d9
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/dnstxt.py
@@ -0,0 +1 @@
+../../base/lookup/dnstxt.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/dnstxt.pyi b/zuul/ansible/2.5/lookup/dnstxt.pyi
new file mode 120000
index 000000000..1c221784c
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/dnstxt.pyi
@@ -0,0 +1 @@
+../../base/lookup/dnstxt.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/env.py b/zuul/ansible/2.5/lookup/env.py
new file mode 120000
index 000000000..124393630
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/env.py
@@ -0,0 +1 @@
+../../base/lookup/env.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/env.pyi b/zuul/ansible/2.5/lookup/env.pyi
new file mode 120000
index 000000000..e0ecae07a
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/env.pyi
@@ -0,0 +1 @@
+../../base/lookup/env.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/etcd.py b/zuul/ansible/2.5/lookup/etcd.py
new file mode 120000
index 000000000..c42007aa6
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/etcd.py
@@ -0,0 +1 @@
+../../base/lookup/etcd.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/etcd.pyi b/zuul/ansible/2.5/lookup/etcd.pyi
new file mode 120000
index 000000000..a1d4e0458
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/etcd.pyi
@@ -0,0 +1 @@
+../../base/lookup/etcd.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/file.py b/zuul/ansible/2.5/lookup/file.py
new file mode 120000
index 000000000..d1c0692d7
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/file.py
@@ -0,0 +1 @@
+../../base/lookup/file.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/file.pyi b/zuul/ansible/2.5/lookup/file.pyi
new file mode 120000
index 000000000..588dc50c6
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/file.pyi
@@ -0,0 +1 @@
+../../base/lookup/file.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/fileglob.py b/zuul/ansible/2.5/lookup/fileglob.py
new file mode 120000
index 000000000..0249540ac
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/fileglob.py
@@ -0,0 +1 @@
+../../base/lookup/fileglob.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/fileglob.pyi b/zuul/ansible/2.5/lookup/fileglob.pyi
new file mode 120000
index 000000000..ffce6462b
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/fileglob.pyi
@@ -0,0 +1 @@
+../../base/lookup/fileglob.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/filetree.py b/zuul/ansible/2.5/lookup/filetree.py
new file mode 120000
index 000000000..96cc789ac
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/filetree.py
@@ -0,0 +1 @@
+../../base/lookup/filetree.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/filetree.pyi b/zuul/ansible/2.5/lookup/filetree.pyi
new file mode 120000
index 000000000..ca38966f5
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/filetree.pyi
@@ -0,0 +1 @@
+../../base/lookup/filetree.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/first_found.py b/zuul/ansible/2.5/lookup/first_found.py
new file mode 120000
index 000000000..0a01ced20
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/first_found.py
@@ -0,0 +1 @@
+../../base/lookup/first_found.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/first_found.pyi b/zuul/ansible/2.5/lookup/first_found.pyi
new file mode 120000
index 000000000..a3a92f250
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/first_found.pyi
@@ -0,0 +1 @@
+../../base/lookup/first_found.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/hashi_valut.py b/zuul/ansible/2.5/lookup/hashi_valut.py
new file mode 120000
index 000000000..5a13b3c0e
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/hashi_valut.py
@@ -0,0 +1 @@
+../../base/lookup/hashi_valut.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/hashi_valut.pyi b/zuul/ansible/2.5/lookup/hashi_valut.pyi
new file mode 120000
index 000000000..be0d600fe
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/hashi_valut.pyi
@@ -0,0 +1 @@
+../../base/lookup/hashi_valut.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/hiera.py b/zuul/ansible/2.5/lookup/hiera.py
new file mode 120000
index 000000000..01e1883e3
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/hiera.py
@@ -0,0 +1 @@
+../../base/lookup/hiera.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/hiera.pyi b/zuul/ansible/2.5/lookup/hiera.pyi
new file mode 120000
index 000000000..b7756855a
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/hiera.pyi
@@ -0,0 +1 @@
+../../base/lookup/hiera.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/ini.py b/zuul/ansible/2.5/lookup/ini.py
new file mode 120000
index 000000000..6453943b9
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/ini.py
@@ -0,0 +1 @@
+../../base/lookup/ini.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/ini.pyi b/zuul/ansible/2.5/lookup/ini.pyi
new file mode 120000
index 000000000..b66fe999a
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/ini.pyi
@@ -0,0 +1 @@
+../../base/lookup/ini.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/keyring.py b/zuul/ansible/2.5/lookup/keyring.py
new file mode 120000
index 000000000..864d62d6f
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/keyring.py
@@ -0,0 +1 @@
+../../base/lookup/keyring.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/keyring.pyi b/zuul/ansible/2.5/lookup/keyring.pyi
new file mode 120000
index 000000000..9a0c24b55
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/keyring.pyi
@@ -0,0 +1 @@
+../../base/lookup/keyring.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/lastpass.py b/zuul/ansible/2.5/lookup/lastpass.py
new file mode 120000
index 000000000..a28abff20
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/lastpass.py
@@ -0,0 +1 @@
+../../base/lookup/lastpass.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/lastpass.pyi b/zuul/ansible/2.5/lookup/lastpass.pyi
new file mode 120000
index 000000000..dfd6e6b31
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/lastpass.pyi
@@ -0,0 +1 @@
+../../base/lookup/lastpass.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/lines.py b/zuul/ansible/2.5/lookup/lines.py
new file mode 120000
index 000000000..c2cae632b
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/lines.py
@@ -0,0 +1 @@
+../../base/lookup/lines.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/lines.pyi b/zuul/ansible/2.5/lookup/lines.pyi
new file mode 120000
index 000000000..3ddc687f9
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/lines.pyi
@@ -0,0 +1 @@
+../../base/lookup/lines.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/mongodb.py b/zuul/ansible/2.5/lookup/mongodb.py
new file mode 120000
index 000000000..737037fa1
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/mongodb.py
@@ -0,0 +1 @@
+../../base/lookup/mongodb.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/mongodb.pyi b/zuul/ansible/2.5/lookup/mongodb.pyi
new file mode 120000
index 000000000..4c8f754ef
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/mongodb.pyi
@@ -0,0 +1 @@
+../../base/lookup/mongodb.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/password.py b/zuul/ansible/2.5/lookup/password.py
new file mode 120000
index 000000000..478e6bee6
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/password.py
@@ -0,0 +1 @@
+../../base/lookup/password.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/password.pyi b/zuul/ansible/2.5/lookup/password.pyi
new file mode 120000
index 000000000..370986cbc
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/password.pyi
@@ -0,0 +1 @@
+../../base/lookup/password.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/passwordstore.py b/zuul/ansible/2.5/lookup/passwordstore.py
new file mode 120000
index 000000000..af4c4aa92
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/passwordstore.py
@@ -0,0 +1 @@
+../../base/lookup/passwordstore.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/passwordstore.pyi b/zuul/ansible/2.5/lookup/passwordstore.pyi
new file mode 120000
index 000000000..9ba9b718a
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/passwordstore.pyi
@@ -0,0 +1 @@
+../../base/lookup/passwordstore.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/pipe.py b/zuul/ansible/2.5/lookup/pipe.py
new file mode 120000
index 000000000..ea688c3a3
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/pipe.py
@@ -0,0 +1 @@
+../../base/lookup/pipe.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/pipe.pyi b/zuul/ansible/2.5/lookup/pipe.pyi
new file mode 120000
index 000000000..01d6b935d
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/pipe.pyi
@@ -0,0 +1 @@
+../../base/lookup/pipe.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/redis_kv.py b/zuul/ansible/2.5/lookup/redis_kv.py
new file mode 120000
index 000000000..a711e2651
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/redis_kv.py
@@ -0,0 +1 @@
+../../base/lookup/redis_kv.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/redis_kv.pyi b/zuul/ansible/2.5/lookup/redis_kv.pyi
new file mode 120000
index 000000000..da9acca45
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/redis_kv.pyi
@@ -0,0 +1 @@
+../../base/lookup/redis_kv.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/shelvefile.py b/zuul/ansible/2.5/lookup/shelvefile.py
new file mode 120000
index 000000000..2c76ec937
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/shelvefile.py
@@ -0,0 +1 @@
+../../base/lookup/shelvefile.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/shelvefile.pyi b/zuul/ansible/2.5/lookup/shelvefile.pyi
new file mode 120000
index 000000000..827f4b076
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/shelvefile.pyi
@@ -0,0 +1 @@
+../../base/lookup/shelvefile.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/template.py b/zuul/ansible/2.5/lookup/template.py
new file mode 120000
index 000000000..ef6565ceb
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/template.py
@@ -0,0 +1 @@
+../../base/lookup/template.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/template.pyi b/zuul/ansible/2.5/lookup/template.pyi
new file mode 120000
index 000000000..f03685d5c
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/template.pyi
@@ -0,0 +1 @@
+../../base/lookup/template.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/url.py b/zuul/ansible/2.5/lookup/url.py
new file mode 120000
index 000000000..f936b748e
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/url.py
@@ -0,0 +1 @@
+../../base/lookup/url.py \ No newline at end of file
diff --git a/zuul/ansible/2.5/lookup/url.pyi b/zuul/ansible/2.5/lookup/url.pyi
new file mode 120000
index 000000000..fc13f47c5
--- /dev/null
+++ b/zuul/ansible/2.5/lookup/url.pyi
@@ -0,0 +1 @@
+../../base/lookup/url.pyi \ No newline at end of file
diff --git a/zuul/ansible/2.5/paths.py b/zuul/ansible/2.5/paths.py
new file mode 120000
index 000000000..dbdb1858e
--- /dev/null
+++ b/zuul/ansible/2.5/paths.py
@@ -0,0 +1 @@
+../paths.py \ No newline at end of file
diff --git a/zuul/ansible/action/__init__.py b/zuul/ansible/base/__init__.py
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/__init__.py
+++ b/zuul/ansible/base/__init__.py
diff --git a/zuul/ansible/actiongeneral/__init__.py b/zuul/ansible/base/action/__init__.py
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/actiongeneral/__init__.py
+++ b/zuul/ansible/base/action/__init__.py
diff --git a/zuul/ansible/action/add_host.py b/zuul/ansible/base/action/add_host.py
index 28e74b155..28e74b155 100644
--- a/zuul/ansible/action/add_host.py
+++ b/zuul/ansible/base/action/add_host.py
diff --git a/zuul/ansible/action/add_host.pyi b/zuul/ansible/base/action/add_host.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/add_host.pyi
+++ b/zuul/ansible/base/action/add_host.pyi
diff --git a/zuul/ansible/action/aireos.py b/zuul/ansible/base/action/aireos.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/aireos.py
+++ b/zuul/ansible/base/action/aireos.py
diff --git a/zuul/ansible/action/aireos.pyi b/zuul/ansible/base/action/aireos.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/aireos.pyi
+++ b/zuul/ansible/base/action/aireos.pyi
diff --git a/zuul/ansible/action/aireos_config.py b/zuul/ansible/base/action/aireos_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/aireos_config.py
+++ b/zuul/ansible/base/action/aireos_config.py
diff --git a/zuul/ansible/action/aireos_config.pyi b/zuul/ansible/base/action/aireos_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/aireos_config.pyi
+++ b/zuul/ansible/base/action/aireos_config.pyi
diff --git a/zuul/ansible/action/aruba.py b/zuul/ansible/base/action/aruba.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/aruba.py
+++ b/zuul/ansible/base/action/aruba.py
diff --git a/zuul/ansible/action/aruba.pyi b/zuul/ansible/base/action/aruba.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/aruba.pyi
+++ b/zuul/ansible/base/action/aruba.pyi
diff --git a/zuul/ansible/action/aruba_config.py b/zuul/ansible/base/action/aruba_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/aruba_config.py
+++ b/zuul/ansible/base/action/aruba_config.py
diff --git a/zuul/ansible/action/aruba_config.pyi b/zuul/ansible/base/action/aruba_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/aruba_config.pyi
+++ b/zuul/ansible/base/action/aruba_config.pyi
diff --git a/zuul/ansible/action/asa.py b/zuul/ansible/base/action/asa.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/asa.py
+++ b/zuul/ansible/base/action/asa.py
diff --git a/zuul/ansible/action/asa.pyi b/zuul/ansible/base/action/asa.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/asa.pyi
+++ b/zuul/ansible/base/action/asa.pyi
diff --git a/zuul/ansible/action/asa_config.py b/zuul/ansible/base/action/asa_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/asa_config.py
+++ b/zuul/ansible/base/action/asa_config.py
diff --git a/zuul/ansible/action/asa_config.pyi b/zuul/ansible/base/action/asa_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/asa_config.pyi
+++ b/zuul/ansible/base/action/asa_config.pyi
diff --git a/zuul/ansible/action/asa_template.py b/zuul/ansible/base/action/asa_template.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/asa_template.py
+++ b/zuul/ansible/base/action/asa_template.py
diff --git a/zuul/ansible/action/asa_template.pyi b/zuul/ansible/base/action/asa_template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/asa_template.pyi
+++ b/zuul/ansible/base/action/asa_template.pyi
diff --git a/zuul/ansible/action/assemble.py b/zuul/ansible/base/action/assemble.py
index 139ed7da4..139ed7da4 100644
--- a/zuul/ansible/action/assemble.py
+++ b/zuul/ansible/base/action/assemble.py
diff --git a/zuul/ansible/action/assemble.pyi b/zuul/ansible/base/action/assemble.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/assemble.pyi
+++ b/zuul/ansible/base/action/assemble.pyi
diff --git a/zuul/ansible/action/ce.py b/zuul/ansible/base/action/ce.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/ce.py
+++ b/zuul/ansible/base/action/ce.py
diff --git a/zuul/ansible/action/ce.pyi b/zuul/ansible/base/action/ce.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/ce.pyi
+++ b/zuul/ansible/base/action/ce.pyi
diff --git a/zuul/ansible/action/ce_config.py b/zuul/ansible/base/action/ce_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/ce_config.py
+++ b/zuul/ansible/base/action/ce_config.py
diff --git a/zuul/ansible/action/ce_config.pyi b/zuul/ansible/base/action/ce_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/ce_config.pyi
+++ b/zuul/ansible/base/action/ce_config.pyi
diff --git a/zuul/ansible/action/ce_template.py b/zuul/ansible/base/action/ce_template.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/ce_template.py
+++ b/zuul/ansible/base/action/ce_template.py
diff --git a/zuul/ansible/action/ce_template.pyi b/zuul/ansible/base/action/ce_template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/ce_template.pyi
+++ b/zuul/ansible/base/action/ce_template.pyi
diff --git a/zuul/ansible/action/copy.py b/zuul/ansible/base/action/copy.py
index e8927ce9e..e8927ce9e 100644
--- a/zuul/ansible/action/copy.py
+++ b/zuul/ansible/base/action/copy.py
diff --git a/zuul/ansible/action/copy.pyi b/zuul/ansible/base/action/copy.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/copy.pyi
+++ b/zuul/ansible/base/action/copy.pyi
diff --git a/zuul/ansible/action/dellos10_config.py b/zuul/ansible/base/action/dellos10_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/dellos10_config.py
+++ b/zuul/ansible/base/action/dellos10_config.py
diff --git a/zuul/ansible/action/dellos10_config.pyi b/zuul/ansible/base/action/dellos10_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/dellos10_config.pyi
+++ b/zuul/ansible/base/action/dellos10_config.pyi
diff --git a/zuul/ansible/action/dellos6_config.py b/zuul/ansible/base/action/dellos6_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/dellos6_config.py
+++ b/zuul/ansible/base/action/dellos6_config.py
diff --git a/zuul/ansible/action/dellos6_config.pyi b/zuul/ansible/base/action/dellos6_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/dellos6_config.pyi
+++ b/zuul/ansible/base/action/dellos6_config.pyi
diff --git a/zuul/ansible/action/dellos9_config.py b/zuul/ansible/base/action/dellos9_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/dellos9_config.py
+++ b/zuul/ansible/base/action/dellos9_config.py
diff --git a/zuul/ansible/action/dellos9_config.pyi b/zuul/ansible/base/action/dellos9_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/dellos9_config.pyi
+++ b/zuul/ansible/base/action/dellos9_config.pyi
diff --git a/zuul/ansible/action/eos_config.py b/zuul/ansible/base/action/eos_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/eos_config.py
+++ b/zuul/ansible/base/action/eos_config.py
diff --git a/zuul/ansible/action/eos_config.pyi b/zuul/ansible/base/action/eos_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/eos_config.pyi
+++ b/zuul/ansible/base/action/eos_config.pyi
diff --git a/zuul/ansible/action/eos_template.py b/zuul/ansible/base/action/eos_template.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/eos_template.py
+++ b/zuul/ansible/base/action/eos_template.py
diff --git a/zuul/ansible/action/eos_template.pyi b/zuul/ansible/base/action/eos_template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/eos_template.pyi
+++ b/zuul/ansible/base/action/eos_template.pyi
diff --git a/zuul/ansible/action/fetch.py b/zuul/ansible/base/action/fetch.py
index 0d35846e2..0d35846e2 100644
--- a/zuul/ansible/action/fetch.py
+++ b/zuul/ansible/base/action/fetch.py
diff --git a/zuul/ansible/action/fetch.pyi b/zuul/ansible/base/action/fetch.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/fetch.pyi
+++ b/zuul/ansible/base/action/fetch.pyi
diff --git a/zuul/ansible/action/fortios_config.py b/zuul/ansible/base/action/fortios_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/fortios_config.py
+++ b/zuul/ansible/base/action/fortios_config.py
diff --git a/zuul/ansible/action/fortios_config.pyi b/zuul/ansible/base/action/fortios_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/fortios_config.pyi
+++ b/zuul/ansible/base/action/fortios_config.pyi
diff --git a/zuul/ansible/action/include_vars.py b/zuul/ansible/base/action/include_vars.py
index 930e54d50..930e54d50 100644
--- a/zuul/ansible/action/include_vars.py
+++ b/zuul/ansible/base/action/include_vars.py
diff --git a/zuul/ansible/action/include_vars.pyi b/zuul/ansible/base/action/include_vars.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/include_vars.pyi
+++ b/zuul/ansible/base/action/include_vars.pyi
diff --git a/zuul/ansible/action/ios_config.py b/zuul/ansible/base/action/ios_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/ios_config.py
+++ b/zuul/ansible/base/action/ios_config.py
diff --git a/zuul/ansible/action/ios_config.pyi b/zuul/ansible/base/action/ios_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/ios_config.pyi
+++ b/zuul/ansible/base/action/ios_config.pyi
diff --git a/zuul/ansible/action/ios_template.py b/zuul/ansible/base/action/ios_template.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/ios_template.py
+++ b/zuul/ansible/base/action/ios_template.py
diff --git a/zuul/ansible/action/ios_template.pyi b/zuul/ansible/base/action/ios_template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/ios_template.pyi
+++ b/zuul/ansible/base/action/ios_template.pyi
diff --git a/zuul/ansible/action/iosxr_config.py b/zuul/ansible/base/action/iosxr_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/iosxr_config.py
+++ b/zuul/ansible/base/action/iosxr_config.py
diff --git a/zuul/ansible/action/iosxr_config.pyi b/zuul/ansible/base/action/iosxr_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/iosxr_config.pyi
+++ b/zuul/ansible/base/action/iosxr_config.pyi
diff --git a/zuul/ansible/action/iosxr_template.py b/zuul/ansible/base/action/iosxr_template.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/iosxr_template.py
+++ b/zuul/ansible/base/action/iosxr_template.py
diff --git a/zuul/ansible/action/iosxr_template.pyi b/zuul/ansible/base/action/iosxr_template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/iosxr_template.pyi
+++ b/zuul/ansible/base/action/iosxr_template.pyi
diff --git a/zuul/ansible/action/junos_config.py b/zuul/ansible/base/action/junos_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/junos_config.py
+++ b/zuul/ansible/base/action/junos_config.py
diff --git a/zuul/ansible/action/junos_config.pyi b/zuul/ansible/base/action/junos_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/junos_config.pyi
+++ b/zuul/ansible/base/action/junos_config.pyi
diff --git a/zuul/ansible/action/junos_template.py b/zuul/ansible/base/action/junos_template.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/junos_template.py
+++ b/zuul/ansible/base/action/junos_template.py
diff --git a/zuul/ansible/action/junos_template.pyi b/zuul/ansible/base/action/junos_template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/junos_template.pyi
+++ b/zuul/ansible/base/action/junos_template.pyi
diff --git a/zuul/ansible/action/net_banner.py b/zuul/ansible/base/action/net_banner.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_banner.py
+++ b/zuul/ansible/base/action/net_banner.py
diff --git a/zuul/ansible/action/net_banner.pyi b/zuul/ansible/base/action/net_banner.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_banner.pyi
+++ b/zuul/ansible/base/action/net_banner.pyi
diff --git a/zuul/ansible/action/net_base.py b/zuul/ansible/base/action/net_base.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_base.py
+++ b/zuul/ansible/base/action/net_base.py
diff --git a/zuul/ansible/action/net_base.pyi b/zuul/ansible/base/action/net_base.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_base.pyi
+++ b/zuul/ansible/base/action/net_base.pyi
diff --git a/zuul/ansible/action/net_config.py b/zuul/ansible/base/action/net_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_config.py
+++ b/zuul/ansible/base/action/net_config.py
diff --git a/zuul/ansible/action/net_config.pyi b/zuul/ansible/base/action/net_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_config.pyi
+++ b/zuul/ansible/base/action/net_config.pyi
diff --git a/zuul/ansible/action/net_interface.py b/zuul/ansible/base/action/net_interface.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_interface.py
+++ b/zuul/ansible/base/action/net_interface.py
diff --git a/zuul/ansible/action/net_interface.pyi b/zuul/ansible/base/action/net_interface.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_interface.pyi
+++ b/zuul/ansible/base/action/net_interface.pyi
diff --git a/zuul/ansible/action/net_l2_interface.py b/zuul/ansible/base/action/net_l2_interface.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_l2_interface.py
+++ b/zuul/ansible/base/action/net_l2_interface.py
diff --git a/zuul/ansible/action/net_l2_interface.pyi b/zuul/ansible/base/action/net_l2_interface.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_l2_interface.pyi
+++ b/zuul/ansible/base/action/net_l2_interface.pyi
diff --git a/zuul/ansible/action/net_l3_interface.py b/zuul/ansible/base/action/net_l3_interface.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_l3_interface.py
+++ b/zuul/ansible/base/action/net_l3_interface.py
diff --git a/zuul/ansible/action/net_l3_interface.pyi b/zuul/ansible/base/action/net_l3_interface.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_l3_interface.pyi
+++ b/zuul/ansible/base/action/net_l3_interface.pyi
diff --git a/zuul/ansible/action/net_linkagg.py b/zuul/ansible/base/action/net_linkagg.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_linkagg.py
+++ b/zuul/ansible/base/action/net_linkagg.py
diff --git a/zuul/ansible/action/net_linkagg.pyi b/zuul/ansible/base/action/net_linkagg.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_linkagg.pyi
+++ b/zuul/ansible/base/action/net_linkagg.pyi
diff --git a/zuul/ansible/action/net_lldp.py b/zuul/ansible/base/action/net_lldp.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_lldp.py
+++ b/zuul/ansible/base/action/net_lldp.py
diff --git a/zuul/ansible/action/net_lldp.pyi b/zuul/ansible/base/action/net_lldp.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_lldp.pyi
+++ b/zuul/ansible/base/action/net_lldp.pyi
diff --git a/zuul/ansible/action/net_lldp_interface.py b/zuul/ansible/base/action/net_lldp_interface.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_lldp_interface.py
+++ b/zuul/ansible/base/action/net_lldp_interface.py
diff --git a/zuul/ansible/action/net_lldp_interface.pyi b/zuul/ansible/base/action/net_lldp_interface.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_lldp_interface.pyi
+++ b/zuul/ansible/base/action/net_lldp_interface.pyi
diff --git a/zuul/ansible/action/net_logging.py b/zuul/ansible/base/action/net_logging.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_logging.py
+++ b/zuul/ansible/base/action/net_logging.py
diff --git a/zuul/ansible/action/net_logging.pyi b/zuul/ansible/base/action/net_logging.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_logging.pyi
+++ b/zuul/ansible/base/action/net_logging.pyi
diff --git a/zuul/ansible/action/net_ping.py b/zuul/ansible/base/action/net_ping.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_ping.py
+++ b/zuul/ansible/base/action/net_ping.py
diff --git a/zuul/ansible/action/net_ping.pyi b/zuul/ansible/base/action/net_ping.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_ping.pyi
+++ b/zuul/ansible/base/action/net_ping.pyi
diff --git a/zuul/ansible/action/net_static_route.py b/zuul/ansible/base/action/net_static_route.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_static_route.py
+++ b/zuul/ansible/base/action/net_static_route.py
diff --git a/zuul/ansible/action/net_static_route.pyi b/zuul/ansible/base/action/net_static_route.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_static_route.pyi
+++ b/zuul/ansible/base/action/net_static_route.pyi
diff --git a/zuul/ansible/action/net_system.py b/zuul/ansible/base/action/net_system.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_system.py
+++ b/zuul/ansible/base/action/net_system.py
diff --git a/zuul/ansible/action/net_system.pyi b/zuul/ansible/base/action/net_system.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_system.pyi
+++ b/zuul/ansible/base/action/net_system.pyi
diff --git a/zuul/ansible/action/net_template.py b/zuul/ansible/base/action/net_template.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_template.py
+++ b/zuul/ansible/base/action/net_template.py
diff --git a/zuul/ansible/action/net_template.pyi b/zuul/ansible/base/action/net_template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_template.pyi
+++ b/zuul/ansible/base/action/net_template.pyi
diff --git a/zuul/ansible/action/net_user.py b/zuul/ansible/base/action/net_user.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_user.py
+++ b/zuul/ansible/base/action/net_user.py
diff --git a/zuul/ansible/action/net_user.pyi b/zuul/ansible/base/action/net_user.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_user.pyi
+++ b/zuul/ansible/base/action/net_user.pyi
diff --git a/zuul/ansible/action/net_vlan.py b/zuul/ansible/base/action/net_vlan.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_vlan.py
+++ b/zuul/ansible/base/action/net_vlan.py
diff --git a/zuul/ansible/action/net_vlan.pyi b/zuul/ansible/base/action/net_vlan.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_vlan.pyi
+++ b/zuul/ansible/base/action/net_vlan.pyi
diff --git a/zuul/ansible/action/net_vrf.py b/zuul/ansible/base/action/net_vrf.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/net_vrf.py
+++ b/zuul/ansible/base/action/net_vrf.py
diff --git a/zuul/ansible/action/net_vrf.pyi b/zuul/ansible/base/action/net_vrf.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/net_vrf.pyi
+++ b/zuul/ansible/base/action/net_vrf.pyi
diff --git a/zuul/ansible/action/netconf_config.py b/zuul/ansible/base/action/netconf_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/netconf_config.py
+++ b/zuul/ansible/base/action/netconf_config.py
diff --git a/zuul/ansible/action/netconf_config.pyi b/zuul/ansible/base/action/netconf_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/netconf_config.pyi
+++ b/zuul/ansible/base/action/netconf_config.pyi
diff --git a/zuul/ansible/action/network.py b/zuul/ansible/base/action/network.py
index 41fc56033..41fc56033 100644
--- a/zuul/ansible/action/network.py
+++ b/zuul/ansible/base/action/network.py
diff --git a/zuul/ansible/action/network.pyi b/zuul/ansible/base/action/network.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/network.pyi
+++ b/zuul/ansible/base/action/network.pyi
diff --git a/zuul/ansible/action/normal.py b/zuul/ansible/base/action/normal.py
index 3230a708c..3230a708c 100644
--- a/zuul/ansible/action/normal.py
+++ b/zuul/ansible/base/action/normal.py
diff --git a/zuul/ansible/action/normal.pyi b/zuul/ansible/base/action/normal.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/normal.pyi
+++ b/zuul/ansible/base/action/normal.pyi
diff --git a/zuul/ansible/action/nxos_config.py b/zuul/ansible/base/action/nxos_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/nxos_config.py
+++ b/zuul/ansible/base/action/nxos_config.py
diff --git a/zuul/ansible/action/nxos_config.pyi b/zuul/ansible/base/action/nxos_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/nxos_config.pyi
+++ b/zuul/ansible/base/action/nxos_config.pyi
diff --git a/zuul/ansible/action/nxos_template.py b/zuul/ansible/base/action/nxos_template.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/nxos_template.py
+++ b/zuul/ansible/base/action/nxos_template.py
diff --git a/zuul/ansible/action/nxos_template.pyi b/zuul/ansible/base/action/nxos_template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/nxos_template.pyi
+++ b/zuul/ansible/base/action/nxos_template.pyi
diff --git a/zuul/ansible/action/ops_config.py b/zuul/ansible/base/action/ops_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/ops_config.py
+++ b/zuul/ansible/base/action/ops_config.py
diff --git a/zuul/ansible/action/ops_config.pyi b/zuul/ansible/base/action/ops_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/ops_config.pyi
+++ b/zuul/ansible/base/action/ops_config.pyi
diff --git a/zuul/ansible/action/ops_template.py b/zuul/ansible/base/action/ops_template.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/ops_template.py
+++ b/zuul/ansible/base/action/ops_template.py
diff --git a/zuul/ansible/action/ops_template.pyi b/zuul/ansible/base/action/ops_template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/ops_template.pyi
+++ b/zuul/ansible/base/action/ops_template.pyi
diff --git a/zuul/ansible/action/patch.py b/zuul/ansible/base/action/patch.py
index 098d4819c..098d4819c 100644
--- a/zuul/ansible/action/patch.py
+++ b/zuul/ansible/base/action/patch.py
diff --git a/zuul/ansible/action/patch.pyi b/zuul/ansible/base/action/patch.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/patch.pyi
+++ b/zuul/ansible/base/action/patch.pyi
diff --git a/zuul/ansible/action/raw.py b/zuul/ansible/base/action/raw.py
index fb1e1a6e3..fb1e1a6e3 100644
--- a/zuul/ansible/action/raw.py
+++ b/zuul/ansible/base/action/raw.py
diff --git a/zuul/ansible/action/raw.pyi b/zuul/ansible/base/action/raw.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/raw.pyi
+++ b/zuul/ansible/base/action/raw.pyi
diff --git a/zuul/ansible/action/script.py b/zuul/ansible/base/action/script.py
index 9fc38cc96..9fc38cc96 100644
--- a/zuul/ansible/action/script.py
+++ b/zuul/ansible/base/action/script.py
diff --git a/zuul/ansible/action/script.pyi b/zuul/ansible/base/action/script.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/script.pyi
+++ b/zuul/ansible/base/action/script.pyi
diff --git a/zuul/ansible/action/sros_config.py b/zuul/ansible/base/action/sros_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/sros_config.py
+++ b/zuul/ansible/base/action/sros_config.py
diff --git a/zuul/ansible/action/sros_config.pyi b/zuul/ansible/base/action/sros_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/sros_config.pyi
+++ b/zuul/ansible/base/action/sros_config.pyi
diff --git a/zuul/ansible/action/synchronize.py b/zuul/ansible/base/action/synchronize.py
index b07ba79be..b07ba79be 100644
--- a/zuul/ansible/action/synchronize.py
+++ b/zuul/ansible/base/action/synchronize.py
diff --git a/zuul/ansible/action/synchronize.pyi b/zuul/ansible/base/action/synchronize.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/synchronize.pyi
+++ b/zuul/ansible/base/action/synchronize.pyi
diff --git a/zuul/ansible/action/template.py b/zuul/ansible/base/action/template.py
index 5f0e5602c..5f0e5602c 100644
--- a/zuul/ansible/action/template.py
+++ b/zuul/ansible/base/action/template.py
diff --git a/zuul/ansible/action/template.pyi b/zuul/ansible/base/action/template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/template.pyi
+++ b/zuul/ansible/base/action/template.pyi
diff --git a/zuul/ansible/action/unarchive.py b/zuul/ansible/base/action/unarchive.py
index 9eb9bb544..9eb9bb544 100644
--- a/zuul/ansible/action/unarchive.py
+++ b/zuul/ansible/base/action/unarchive.py
diff --git a/zuul/ansible/action/unarchive.pyi b/zuul/ansible/base/action/unarchive.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/unarchive.pyi
+++ b/zuul/ansible/base/action/unarchive.pyi
diff --git a/zuul/ansible/action/vyos_config.py b/zuul/ansible/base/action/vyos_config.py
index 7a739baa2..7a739baa2 120000
--- a/zuul/ansible/action/vyos_config.py
+++ b/zuul/ansible/base/action/vyos_config.py
diff --git a/zuul/ansible/action/vyos_config.pyi b/zuul/ansible/base/action/vyos_config.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/vyos_config.pyi
+++ b/zuul/ansible/base/action/vyos_config.pyi
diff --git a/zuul/ansible/action/win_copy.py b/zuul/ansible/base/action/win_copy.py
index d9dbe4dc8..d9dbe4dc8 100644
--- a/zuul/ansible/action/win_copy.py
+++ b/zuul/ansible/base/action/win_copy.py
diff --git a/zuul/ansible/action/win_copy.pyi b/zuul/ansible/base/action/win_copy.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/win_copy.pyi
+++ b/zuul/ansible/base/action/win_copy.pyi
diff --git a/zuul/ansible/action/win_template.py b/zuul/ansible/base/action/win_template.py
index 36b475aea..36b475aea 100644
--- a/zuul/ansible/action/win_template.py
+++ b/zuul/ansible/base/action/win_template.py
diff --git a/zuul/ansible/action/win_template.pyi b/zuul/ansible/base/action/win_template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/action/win_template.pyi
+++ b/zuul/ansible/base/action/win_template.pyi
diff --git a/zuul/ansible/callback/__init__.py b/zuul/ansible/base/actiongeneral/__init__.py
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/callback/__init__.py
+++ b/zuul/ansible/base/actiongeneral/__init__.py
diff --git a/zuul/ansible/actiongeneral/command.py b/zuul/ansible/base/actiongeneral/command.py
index f9b976ca0..f9b976ca0 100644
--- a/zuul/ansible/actiongeneral/command.py
+++ b/zuul/ansible/base/actiongeneral/command.py
diff --git a/zuul/ansible/actiongeneral/command.pyi b/zuul/ansible/base/actiongeneral/command.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/actiongeneral/command.pyi
+++ b/zuul/ansible/base/actiongeneral/command.pyi
diff --git a/zuul/ansible/actiongeneral/zuul_return.py b/zuul/ansible/base/actiongeneral/zuul_return.py
index badd03bb1..badd03bb1 100644
--- a/zuul/ansible/actiongeneral/zuul_return.py
+++ b/zuul/ansible/base/actiongeneral/zuul_return.py
diff --git a/zuul/ansible/filter/__init__.py b/zuul/ansible/base/callback/__init__.py
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/filter/__init__.py
+++ b/zuul/ansible/base/callback/__init__.py
diff --git a/zuul/ansible/callback/zuul_json.py b/zuul/ansible/base/callback/zuul_json.py
index e52e2e24d..e52e2e24d 100644
--- a/zuul/ansible/callback/zuul_json.py
+++ b/zuul/ansible/base/callback/zuul_json.py
diff --git a/zuul/ansible/callback/zuul_stream.py b/zuul/ansible/base/callback/zuul_stream.py
index 966c9008c..966c9008c 100644
--- a/zuul/ansible/callback/zuul_stream.py
+++ b/zuul/ansible/base/callback/zuul_stream.py
diff --git a/zuul/ansible/callback/zuul_unreachable.py b/zuul/ansible/base/callback/zuul_unreachable.py
index 8c7b85f43..8c7b85f43 100644
--- a/zuul/ansible/callback/zuul_unreachable.py
+++ b/zuul/ansible/base/callback/zuul_unreachable.py
diff --git a/zuul/ansible/library/__init__.py b/zuul/ansible/base/filter/__init__.py
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/library/__init__.py
+++ b/zuul/ansible/base/filter/__init__.py
diff --git a/zuul/ansible/filter/zuul_filters.py b/zuul/ansible/base/filter/zuul_filters.py
index fa21f6bd5..fa21f6bd5 100644
--- a/zuul/ansible/filter/zuul_filters.py
+++ b/zuul/ansible/base/filter/zuul_filters.py
diff --git a/zuul/ansible/lookup/__init__.py b/zuul/ansible/base/library/__init__.py
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/__init__.py
+++ b/zuul/ansible/base/library/__init__.py
diff --git a/zuul/ansible/library/command.py b/zuul/ansible/base/library/command.py
index db186788c..db186788c 100755
--- a/zuul/ansible/library/command.py
+++ b/zuul/ansible/base/library/command.py
diff --git a/zuul/ansible/library/zuul_console.py b/zuul/ansible/base/library/zuul_console.py
index d119c5259..d119c5259 100644
--- a/zuul/ansible/library/zuul_console.py
+++ b/zuul/ansible/base/library/zuul_console.py
diff --git a/zuul/ansible/lookup/_banned.pyi b/zuul/ansible/base/lookup/__init__.py
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/_banned.pyi
+++ b/zuul/ansible/base/lookup/__init__.py
diff --git a/zuul/ansible/lookup/_banned.py b/zuul/ansible/base/lookup/_banned.py
index 65708f80d..65708f80d 100644
--- a/zuul/ansible/lookup/_banned.py
+++ b/zuul/ansible/base/lookup/_banned.py
diff --git a/zuul/ansible/lookup/chef_databag.pyi b/zuul/ansible/base/lookup/_banned.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/chef_databag.pyi
+++ b/zuul/ansible/base/lookup/_banned.pyi
diff --git a/zuul/ansible/lookup/chef_databag.py b/zuul/ansible/base/lookup/chef_databag.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/chef_databag.py
+++ b/zuul/ansible/base/lookup/chef_databag.py
diff --git a/zuul/ansible/lookup/consul_kv.pyi b/zuul/ansible/base/lookup/chef_databag.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/consul_kv.pyi
+++ b/zuul/ansible/base/lookup/chef_databag.pyi
diff --git a/zuul/ansible/lookup/consul_kv.py b/zuul/ansible/base/lookup/consul_kv.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/consul_kv.py
+++ b/zuul/ansible/base/lookup/consul_kv.py
diff --git a/zuul/ansible/lookup/credstash.pyi b/zuul/ansible/base/lookup/consul_kv.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/credstash.pyi
+++ b/zuul/ansible/base/lookup/consul_kv.pyi
diff --git a/zuul/ansible/lookup/credstash.py b/zuul/ansible/base/lookup/credstash.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/credstash.py
+++ b/zuul/ansible/base/lookup/credstash.py
diff --git a/zuul/ansible/lookup/csvfile.pyi b/zuul/ansible/base/lookup/credstash.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/csvfile.pyi
+++ b/zuul/ansible/base/lookup/credstash.pyi
diff --git a/zuul/ansible/lookup/csvfile.py b/zuul/ansible/base/lookup/csvfile.py
index 0d5136931..0d5136931 100644
--- a/zuul/ansible/lookup/csvfile.py
+++ b/zuul/ansible/base/lookup/csvfile.py
diff --git a/zuul/ansible/lookup/cyberarkpassword.pyi b/zuul/ansible/base/lookup/csvfile.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/cyberarkpassword.pyi
+++ b/zuul/ansible/base/lookup/csvfile.pyi
diff --git a/zuul/ansible/lookup/cyberarkpassword.py b/zuul/ansible/base/lookup/cyberarkpassword.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/cyberarkpassword.py
+++ b/zuul/ansible/base/lookup/cyberarkpassword.py
diff --git a/zuul/ansible/lookup/dig.pyi b/zuul/ansible/base/lookup/cyberarkpassword.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/dig.pyi
+++ b/zuul/ansible/base/lookup/cyberarkpassword.pyi
diff --git a/zuul/ansible/lookup/dig.py b/zuul/ansible/base/lookup/dig.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/dig.py
+++ b/zuul/ansible/base/lookup/dig.py
diff --git a/zuul/ansible/lookup/dnstxt.pyi b/zuul/ansible/base/lookup/dig.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/dnstxt.pyi
+++ b/zuul/ansible/base/lookup/dig.pyi
diff --git a/zuul/ansible/lookup/dnstxt.py b/zuul/ansible/base/lookup/dnstxt.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/dnstxt.py
+++ b/zuul/ansible/base/lookup/dnstxt.py
diff --git a/zuul/ansible/lookup/env.pyi b/zuul/ansible/base/lookup/dnstxt.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/env.pyi
+++ b/zuul/ansible/base/lookup/dnstxt.pyi
diff --git a/zuul/ansible/lookup/env.py b/zuul/ansible/base/lookup/env.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/env.py
+++ b/zuul/ansible/base/lookup/env.py
diff --git a/zuul/ansible/lookup/etcd.pyi b/zuul/ansible/base/lookup/env.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/etcd.pyi
+++ b/zuul/ansible/base/lookup/env.pyi
diff --git a/zuul/ansible/lookup/etcd.py b/zuul/ansible/base/lookup/etcd.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/etcd.py
+++ b/zuul/ansible/base/lookup/etcd.py
diff --git a/zuul/ansible/lookup/file.pyi b/zuul/ansible/base/lookup/etcd.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/file.pyi
+++ b/zuul/ansible/base/lookup/etcd.pyi
diff --git a/zuul/ansible/lookup/file.py b/zuul/ansible/base/lookup/file.py
index 904837003..904837003 100644
--- a/zuul/ansible/lookup/file.py
+++ b/zuul/ansible/base/lookup/file.py
diff --git a/zuul/ansible/lookup/fileglob.pyi b/zuul/ansible/base/lookup/file.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/fileglob.pyi
+++ b/zuul/ansible/base/lookup/file.pyi
diff --git a/zuul/ansible/lookup/fileglob.py b/zuul/ansible/base/lookup/fileglob.py
index 8d6b88120..8d6b88120 100644
--- a/zuul/ansible/lookup/fileglob.py
+++ b/zuul/ansible/base/lookup/fileglob.py
diff --git a/zuul/ansible/lookup/filetree.pyi b/zuul/ansible/base/lookup/fileglob.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/filetree.pyi
+++ b/zuul/ansible/base/lookup/fileglob.pyi
diff --git a/zuul/ansible/lookup/filetree.py b/zuul/ansible/base/lookup/filetree.py
index 490dc384c..490dc384c 100644
--- a/zuul/ansible/lookup/filetree.py
+++ b/zuul/ansible/base/lookup/filetree.py
diff --git a/zuul/ansible/lookup/first_found.pyi b/zuul/ansible/base/lookup/filetree.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/first_found.pyi
+++ b/zuul/ansible/base/lookup/filetree.pyi
diff --git a/zuul/ansible/lookup/first_found.py b/zuul/ansible/base/lookup/first_found.py
index 264296ebf..264296ebf 100644
--- a/zuul/ansible/lookup/first_found.py
+++ b/zuul/ansible/base/lookup/first_found.py
diff --git a/zuul/ansible/lookup/hashi_valut.pyi b/zuul/ansible/base/lookup/first_found.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/hashi_valut.pyi
+++ b/zuul/ansible/base/lookup/first_found.pyi
diff --git a/zuul/ansible/lookup/hashi_valut.py b/zuul/ansible/base/lookup/hashi_valut.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/hashi_valut.py
+++ b/zuul/ansible/base/lookup/hashi_valut.py
diff --git a/zuul/ansible/lookup/hiera.pyi b/zuul/ansible/base/lookup/hashi_valut.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/hiera.pyi
+++ b/zuul/ansible/base/lookup/hashi_valut.pyi
diff --git a/zuul/ansible/lookup/hiera.py b/zuul/ansible/base/lookup/hiera.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/hiera.py
+++ b/zuul/ansible/base/lookup/hiera.py
diff --git a/zuul/ansible/lookup/ini.pyi b/zuul/ansible/base/lookup/hiera.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/ini.pyi
+++ b/zuul/ansible/base/lookup/hiera.pyi
diff --git a/zuul/ansible/lookup/ini.py b/zuul/ansible/base/lookup/ini.py
index 83d7b144a..83d7b144a 100644
--- a/zuul/ansible/lookup/ini.py
+++ b/zuul/ansible/base/lookup/ini.py
diff --git a/zuul/ansible/lookup/keyring.pyi b/zuul/ansible/base/lookup/ini.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/keyring.pyi
+++ b/zuul/ansible/base/lookup/ini.pyi
diff --git a/zuul/ansible/lookup/keyring.py b/zuul/ansible/base/lookup/keyring.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/keyring.py
+++ b/zuul/ansible/base/lookup/keyring.py
diff --git a/zuul/ansible/lookup/lastpass.pyi b/zuul/ansible/base/lookup/keyring.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/lastpass.pyi
+++ b/zuul/ansible/base/lookup/keyring.pyi
diff --git a/zuul/ansible/lookup/lastpass.py b/zuul/ansible/base/lookup/lastpass.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/lastpass.py
+++ b/zuul/ansible/base/lookup/lastpass.py
diff --git a/zuul/ansible/lookup/lines.pyi b/zuul/ansible/base/lookup/lastpass.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/lines.pyi
+++ b/zuul/ansible/base/lookup/lastpass.pyi
diff --git a/zuul/ansible/lookup/lines.py b/zuul/ansible/base/lookup/lines.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/lines.py
+++ b/zuul/ansible/base/lookup/lines.py
diff --git a/zuul/ansible/lookup/mongodb.pyi b/zuul/ansible/base/lookup/lines.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/mongodb.pyi
+++ b/zuul/ansible/base/lookup/lines.pyi
diff --git a/zuul/ansible/lookup/mongodb.py b/zuul/ansible/base/lookup/mongodb.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/mongodb.py
+++ b/zuul/ansible/base/lookup/mongodb.py
diff --git a/zuul/ansible/lookup/password.pyi b/zuul/ansible/base/lookup/mongodb.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/password.pyi
+++ b/zuul/ansible/base/lookup/mongodb.pyi
diff --git a/zuul/ansible/lookup/password.py b/zuul/ansible/base/lookup/password.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/password.py
+++ b/zuul/ansible/base/lookup/password.py
diff --git a/zuul/ansible/lookup/passwordstore.pyi b/zuul/ansible/base/lookup/password.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/passwordstore.pyi
+++ b/zuul/ansible/base/lookup/password.pyi
diff --git a/zuul/ansible/lookup/passwordstore.py b/zuul/ansible/base/lookup/passwordstore.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/passwordstore.py
+++ b/zuul/ansible/base/lookup/passwordstore.py
diff --git a/zuul/ansible/lookup/pipe.pyi b/zuul/ansible/base/lookup/passwordstore.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/pipe.pyi
+++ b/zuul/ansible/base/lookup/passwordstore.pyi
diff --git a/zuul/ansible/lookup/pipe.py b/zuul/ansible/base/lookup/pipe.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/pipe.py
+++ b/zuul/ansible/base/lookup/pipe.py
diff --git a/zuul/ansible/lookup/redis_kv.pyi b/zuul/ansible/base/lookup/pipe.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/redis_kv.pyi
+++ b/zuul/ansible/base/lookup/pipe.pyi
diff --git a/zuul/ansible/lookup/redis_kv.py b/zuul/ansible/base/lookup/redis_kv.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/redis_kv.py
+++ b/zuul/ansible/base/lookup/redis_kv.py
diff --git a/zuul/ansible/lookup/shelvefile.pyi b/zuul/ansible/base/lookup/redis_kv.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/shelvefile.pyi
+++ b/zuul/ansible/base/lookup/redis_kv.pyi
diff --git a/zuul/ansible/lookup/shelvefile.py b/zuul/ansible/base/lookup/shelvefile.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/shelvefile.py
+++ b/zuul/ansible/base/lookup/shelvefile.py
diff --git a/zuul/ansible/lookup/template.pyi b/zuul/ansible/base/lookup/shelvefile.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/template.pyi
+++ b/zuul/ansible/base/lookup/shelvefile.pyi
diff --git a/zuul/ansible/lookup/template.py b/zuul/ansible/base/lookup/template.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/template.py
+++ b/zuul/ansible/base/lookup/template.py
diff --git a/zuul/ansible/lookup/url.pyi b/zuul/ansible/base/lookup/template.pyi
index e69de29bb..e69de29bb 100644
--- a/zuul/ansible/lookup/url.pyi
+++ b/zuul/ansible/base/lookup/template.pyi
diff --git a/zuul/ansible/lookup/url.py b/zuul/ansible/base/lookup/url.py
index d45b9c405..d45b9c405 120000
--- a/zuul/ansible/lookup/url.py
+++ b/zuul/ansible/base/lookup/url.py
diff --git a/zuul/ansible/base/lookup/url.pyi b/zuul/ansible/base/lookup/url.pyi
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/zuul/ansible/base/lookup/url.pyi
diff --git a/zuul/cmd/manage_ansible.py b/zuul/cmd/manage_ansible.py
new file mode 100644
index 000000000..faea40400
--- /dev/null
+++ b/zuul/cmd/manage_ansible.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+# Copyright 2019 BMW Group
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import logging
+import zuul.cmd
+from zuul.lib.ansible import AnsibleManager
+
+
+class ManageAnsible(zuul.cmd.ZuulApp):
+
+ app_name = 'manage-ansible'
+ app_description = 'Zuul ansible maager'
+ log = logging.getLogger('zuul.ManageAnsible')
+
+ def createParser(self):
+ parser = super().createParser()
+ parser.add_argument('-v', dest='verbose', action='store_true',
+ help='verbose output')
+ parser.add_argument('-u', dest='upgrade', action='store_true',
+ help='upgrade ansible versions')
+ return parser
+
+ def _setup_logging(self):
+ """Manage ansible logging does not rely on conf file"""
+ if self.args.verbose:
+ logging.basicConfig(level=logging.DEBUG)
+ else:
+ logging.basicConfig(level=logging.INFO)
+
+ def main(self):
+ self.parseArguments()
+ try:
+ self.readConfig()
+ except Exception:
+ # This script must be able to run without config so this can be
+ # safely ignored here.
+ pass
+ self._setup_logging()
+
+ manager = AnsibleManager()
+
+ manager.install(upgrade=self.args.upgrade)
+
+
+def main():
+ ManageAnsible().main()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/zuul/executor/server.py b/zuul/executor/server.py
index de7647144..b3bf0119f 100644
--- a/zuul/executor/server.py
+++ b/zuul/executor/server.py
@@ -30,6 +30,7 @@ import traceback
import git
from urllib.parse import urlsplit
+from zuul.lib.ansible import AnsibleManager
from zuul.lib.yamlutil import yaml
from zuul.lib.config import get_default
from zuul.lib.statsd import get_statsd
@@ -567,7 +568,7 @@ class DeduplicateQueue(object):
def _copy_ansible_files(python_module, target_dir):
library_path = os.path.dirname(os.path.abspath(python_module.__file__))
for fn in os.listdir(library_path):
- if fn == "__pycache__":
+ if fn in ('__pycache__', 'base'):
continue
full_path = os.path.join(library_path, fn)
if os.path.isdir(full_path):
@@ -705,6 +706,15 @@ class AnsibleJob(object):
self.executor_variables_file = self.executor_server.config.get(
'executor', 'variables')
+ # TODO(tobiash): choose correct ansible version as specified by the job
+ plugin_dir = self.executor_server.ansible_manager.getAnsiblePluginDir()
+ self.library_dir = os.path.join(plugin_dir, 'library')
+ self.action_dir = os.path.join(plugin_dir, 'action')
+ self.action_dir_general = os.path.join(plugin_dir, 'actiongeneral')
+ self.callback_dir = os.path.join(plugin_dir, 'callback')
+ self.lookup_dir = os.path.join(plugin_dir, 'lookup')
+ self.filter_dir = os.path.join(plugin_dir, 'filter')
+
def run(self):
self.running = True
self.thread = threading.Thread(target=self.execute,
@@ -1723,10 +1733,10 @@ class AnsibleJob(object):
# plugins.
if ara_callbacks:
callback_path = '%s:%s' % (
- self.executor_server.callback_dir,
+ self.callback_dir,
os.path.dirname(ara_callbacks.__file__))
else:
- callback_path = self.executor_server.callback_dir
+ callback_path = self.callback_dir
with open(jobdir_playbook.ansible_config, 'w') as config:
config.write('[defaults]\n')
config.write('inventory = %s\n' % self.jobdir.inventory)
@@ -1737,23 +1747,23 @@ class AnsibleJob(object):
config.write('fact_caching_connection = %s\n' %
self.jobdir.fact_cache)
config.write('library = %s\n'
- % self.executor_server.library_dir)
+ % self.library_dir)
config.write('command_warnings = False\n')
config.write('callback_plugins = %s\n' % callback_path)
config.write('stdout_callback = zuul_stream\n')
config.write('filter_plugins = %s\n'
- % self.executor_server.filter_dir)
+ % self.filter_dir)
# bump the timeout because busy nodes may take more than
# 10s to respond
config.write('timeout = 30\n')
# We need at least the general action dir as this overwrites the
# command action plugin for log streaming.
- action_dirs = [self.executor_server.action_dir_general]
+ action_dirs = [self.action_dir_general]
if not trusted:
- action_dirs.append(self.executor_server.action_dir)
+ action_dirs.append(self.action_dir)
config.write('lookup_plugins = %s\n'
- % self.executor_server.lookup_dir)
+ % self.lookup_dir)
config.write('action_plugins = %s\n'
% ':'.join(action_dirs))
@@ -1826,7 +1836,10 @@ class AnsibleJob(object):
pythonpath = [pythonpath]
else:
pythonpath = []
- pythonpath = [self.executor_server.ansible_dir] + pythonpath
+
+ # TODO(tobiash): choose correct ansible version
+ ansible_dir = self.executor_server.ansible_manager.getAnsibleDir()
+ pythonpath = [ansible_dir] + pythonpath
env_copy['PYTHONPATH'] = os.path.pathsep.join(pythonpath)
if playbook.trusted:
@@ -1840,7 +1853,7 @@ class AnsibleJob(object):
ro_paths = ro_paths.split(":") if ro_paths else []
rw_paths = rw_paths.split(":") if rw_paths else []
- ro_paths.append(self.executor_server.ansible_dir)
+ ro_paths.append(ansible_dir)
ro_paths.append(self.jobdir.ansible_root)
ro_paths.append(self.jobdir.trusted_root)
ro_paths.append(self.jobdir.untrusted_root)
@@ -2015,7 +2028,10 @@ class AnsibleJob(object):
else:
verbose = '-v'
- cmd = ['ansible', '*', verbose, '-m', 'setup',
+ # TODO: select correct ansible version from job
+ ansible = self.executor_server.ansible_manager.getAnsibleCommand(
+ command='ansible')
+ cmd = [ansible, '*', verbose, '-m', 'setup',
'-i', self.jobdir.setup_inventory,
'-a', 'gather_subset=!all']
if self.executor_variables_file is not None:
@@ -2094,7 +2110,9 @@ class AnsibleJob(object):
else:
verbose = '-v'
- cmd = ['ansible-playbook', verbose, playbook.path]
+ # TODO: Select ansible version based on job
+ cmd = [self.executor_server.ansible_manager.getAnsibleCommand(),
+ verbose, playbook.path]
if playbook.secrets_content:
cmd.extend(['-e', '@' + playbook.secrets])
@@ -2233,31 +2251,6 @@ class ExecutorServer(object):
state_dir = get_default(self.config, 'executor', 'state_dir',
'/var/lib/zuul', expand_user=True)
- ansible_dir = os.path.join(state_dir, 'ansible')
- self.ansible_dir = ansible_dir
- if os.path.exists(ansible_dir):
- shutil.rmtree(ansible_dir)
-
- zuul_dir = os.path.join(ansible_dir, 'zuul')
- plugin_dir = os.path.join(zuul_dir, 'ansible')
-
- os.makedirs(plugin_dir, mode=0o0755)
-
- self.library_dir = os.path.join(plugin_dir, 'library')
- self.action_dir = os.path.join(plugin_dir, 'action')
- self.action_dir_general = os.path.join(plugin_dir, 'actiongeneral')
- self.callback_dir = os.path.join(plugin_dir, 'callback')
- self.lookup_dir = os.path.join(plugin_dir, 'lookup')
- self.filter_dir = os.path.join(plugin_dir, 'filter')
-
- _copy_ansible_files(zuul.ansible, plugin_dir)
-
- # We're copying zuul.ansible.* into a directory we are going
- # to add to pythonpath, so our plugins can "import
- # zuul.ansible". But we're not installing all of zuul, so
- # create a __init__.py file for the stub "zuul" module.
- with open(os.path.join(zuul_dir, '__init__.py'), 'w'):
- pass
# If keep is not set, ensure the job dir is empty on startup,
# in case we were uncleanly shut down.
@@ -2284,6 +2277,10 @@ class ExecutorServer(object):
StartingBuildsSensor(self, cpu_sensor.max_load_avg)
]
+ ansible_dir = os.path.join(state_dir, 'ansible')
+ self.ansible_manager = AnsibleManager(ansible_dir)
+ self.ansible_manager.copyAnsibleFiles()
+
def _getMerger(self, root, cache_root, logger=None):
return zuul.merger.merger.Merger(
root, self.connections, self.merge_email, self.merge_name,
diff --git a/zuul/lib/ansible-config.conf b/zuul/lib/ansible-config.conf
new file mode 100644
index 000000000..982339004
--- /dev/null
+++ b/zuul/lib/ansible-config.conf
@@ -0,0 +1,6 @@
+# This file describes the currently supported ansible versions
+
+[2.5]
+default = true
+deprecated = true
+requirements = ansible>=2.5.1,<2.6 ara
diff --git a/zuul/lib/ansible.py b/zuul/lib/ansible.py
new file mode 100644
index 000000000..83c0afe04
--- /dev/null
+++ b/zuul/lib/ansible.py
@@ -0,0 +1,215 @@
+# Copyright 2019 BMW Group
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import concurrent.futures
+import configparser
+import logging
+import os
+import shutil
+import subprocess
+import sys
+import zuul.ansible
+
+from pkg_resources import resource_string
+from zuul.lib.config import get_default
+
+
+class ManagedAnsible:
+ log = logging.getLogger('zuul.managed_ansible')
+
+ def __init__(self, config, version):
+ self.version = version
+
+ requirements = get_default(config, version, 'requirements')
+ self._requirements = requirements.split(' ')
+
+ self.default = get_default(config, version, 'default', False)
+ self.deprecated = get_default(config, version, 'deprecated', False)
+
+ self._ansible_root = os.path.join(
+ sys.exec_prefix, 'lib', 'zuul', 'ansible')
+
+ def ensure_ansible(self, upgrade=False):
+ self._ensure_venv()
+
+ self.log.info('Installing ansible %s, extra packages: %s',
+ self.version, self.extra_packages)
+ self._run_pip(self._requirements + self.extra_packages,
+ upgrade=upgrade)
+
+ def _run_pip(self, requirements, upgrade=False):
+ cmd = [os.path.join(self.venv_path, 'bin', 'pip'), 'install']
+ if upgrade:
+ cmd.append('-U')
+ cmd.extend(requirements)
+ self.log.debug('Running pip: %s', ' '.join(cmd))
+
+ p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ if p.returncode != 0:
+ raise Exception('Package installation failed with exit code %s '
+ 'during processing ansible %s:\n'
+ 'stdout:\n%s\n'
+ 'stderr:\n%s' % (p.returncode, self.version,
+ p.stdout.decode(),
+ p.stderr.decode()))
+ self.log.debug('Successfully installed packages %s', requirements)
+
+ def _ensure_venv(self):
+ if os.path.exists(self.python_path):
+ self.log.debug(
+ 'Virtual environment %s already existing', self.venv_path)
+ return
+
+ self.log.info('Creating venv %s', self.venv_path)
+
+ python_executable = sys.executable
+ if hasattr(sys, 'real_prefix'):
+ # We're inside a virtual env and the venv module behaves strange
+ # if we're calling it from there so default to
+ # <real_prefix>/bin/python3
+ python_executable = os.path.join(sys.real_prefix, 'bin', 'python3')
+
+ # We don't use directly the venv module here because its behavior is
+ # broken if we're already in a virtual environment.
+ cmd = ['virtualenv', '-p', python_executable, self.venv_path]
+ p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ if p.returncode != 0:
+ raise Exception('venv creation failed with exit code %s:\n'
+ 'stdout:\n%s\n'
+ 'stderr:\n%s' % (p.returncode, p.stdout.decode(),
+ p.stderr.decode()))
+
+ @property
+ def venv_path(self):
+ return os.path.join(self._ansible_root, self.version)
+
+ @property
+ def python_path(self):
+ return os.path.join(self.venv_path, 'bin', 'python')
+
+ @property
+ def extra_packages(self):
+ mapping = str.maketrans({
+ '.': None,
+ '-': '_',
+ })
+ env_var = 'ANSIBLE_%s_EXTRA_PACKAGES' % self.version.upper().translate(
+ mapping)
+
+ packages = os.environ.get(env_var)
+ if packages:
+ return packages.strip().split(' ')
+
+ return []
+
+ def __repr__(self):
+ return 'Ansible {a.version}, {a.default}, {a.deprecated}'.format(
+ a=self)
+
+
+class AnsibleManager:
+ log = logging.getLogger('zuul.ansible_manager')
+
+ def __init__(self, zuul_ansible_dir=None):
+ self._supported_versions = {}
+ self.default_version = None
+ self.zuul_ansible_dir = zuul_ansible_dir
+
+ self.load_ansible_config()
+
+ def load_ansible_config(self):
+ c = resource_string(__name__, 'ansible-config.conf').decode()
+ config = configparser.ConfigParser()
+ config.read_string(c)
+
+ for version in config.sections():
+
+ ansible = ManagedAnsible(config, version)
+
+ if ansible.version in self._supported_versions:
+ raise RuntimeError(
+ 'Ansible version %s already defined' % ansible.version)
+
+ self._supported_versions[ansible.version] = ansible
+
+ if ansible.default:
+ if self.default_version is not None:
+ raise RuntimeError(
+ 'Default ansible version can only specified once')
+ self.default_version = ansible.version
+
+ if not self.default_version:
+ raise RuntimeError('A default ansible version must be specified')
+
+ def install(self, upgrade=False):
+ with concurrent.futures.ThreadPoolExecutor() as executor:
+ futures = {executor.submit(a.ensure_ansible, upgrade): a
+ for a in self._supported_versions.values()}
+ for future in concurrent.futures.as_completed(futures):
+ future.result()
+
+ def _getAnsible(self, version):
+ if not version:
+ version = self.default_version
+
+ ansible = self._supported_versions.get(version)
+ if not ansible:
+ raise Exception('Requested ansible version %s not found' % version)
+ return ansible
+
+ def getAnsibleCommand(self, version=None, command='ansible-playbook'):
+ ansible = self._getAnsible(version)
+ return os.path.join(ansible.venv_path, 'bin', command)
+
+ def getAnsibleDir(self, version=None):
+ ansible = self._getAnsible(version)
+ return os.path.join(self.zuul_ansible_dir, ansible.version)
+
+ def getAnsiblePluginDir(self, version=None):
+ return os.path.join(self.getAnsibleDir(version), 'zuul', 'ansible')
+
+ def copyAnsibleFiles(self):
+ if os.path.exists(self.zuul_ansible_dir):
+ shutil.rmtree(self.zuul_ansible_dir)
+
+ library_path = os.path.dirname(os.path.abspath(zuul.ansible.__file__))
+ for ansible in self._supported_versions.values():
+ ansible_dir = os.path.join(self.zuul_ansible_dir, ansible.version)
+ plugin_dir = os.path.join(ansible_dir, 'zuul', 'ansible')
+ source_path = os.path.join(library_path, ansible.version)
+
+ os.makedirs(plugin_dir, exist_ok=True)
+ for fn in os.listdir(source_path):
+ if fn in ('__pycache__', 'base'):
+ continue
+ full_path = os.path.join(source_path, fn)
+ if os.path.isdir(full_path):
+ shutil.copytree(full_path, os.path.join(plugin_dir, fn))
+ else:
+ shutil.copy(os.path.join(source_path, fn), plugin_dir)
+
+ # We're copying zuul.ansible.* into a directory we are going
+ # to add to pythonpath, so our plugins can "import
+ # zuul.ansible". But we're not installing all of zuul, so
+ # create a __init__.py file for the stub "zuul" module.
+ module_paths = [
+ os.path.join(ansible_dir, 'zuul'),
+ os.path.join(ansible_dir, 'zuul', 'ansible'),
+ ]
+ for fn in module_paths:
+ with open(os.path.join(fn, '__init__.py'), 'w'):
+ # Nothing to do here, we just want the file to exist.
+ pass