summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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