diff --git a/src/_ansible b/src/_ansible new file mode 100644 index 0000000..09d769b --- /dev/null +++ b/src/_ansible @@ -0,0 +1,439 @@ +#compdef ansible +# ------------------------------------------------------------------------------ +# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the zsh-users nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# ------------------------------------------------------------------------------ +# Description +# ----------- +# +# Completion script for ansible v1.8.4 (http://ansible.org) +# +# ------------------------------------------------------------------------------ +# Authors +# ------- +# +# * Romain Bossart (https://github.com/bosr) +# +# ------------------------------------------------------------------------------ +# +# Needs either ANSIBLE_HOSTS or /etc/ansible/hosts on linux +# (or /usr/local/etc/ansible/hosts on OSX) +# +# Note 1: the following gist (https://gist.github.com/15ed54a438a36d67fd99.git) +# has some files to help improve the hostfile shell parsing +# +# Note 2: I tried to use `_arguments --`, but the output of `ansible --help` +# is not parsed entirely correctly, and anyway no modules or host would available. +# + + +# ansible zsh completion +# + +__host_file_location () { + # find the location of the host file: + # 1. check $ANSIBLE_HOSTS + # 2. else check /etc/ansible/hosts or /usr/local/etc/... + # (depending on platform) + # + [[ "$OSTYPE" == darwin* ]] && FALLBACK="/usr/local/etc/ansible/hosts" + [[ "$OSTYPE" == linux* ]] && FALLBACK="/etc/ansible/hosts" + HOST_FILE=${ANSIBLE_HOSTS:=${FALLBACK}} + [[ -f ${HOST_FILE} ]] || HOST_FILE=/dev/null + + echo ${HOST_FILE} +} + +__ll_group_list () { + # parses the ini hostfile for groups only: [...] + HOST_FILE=$(__host_file_location) + + local -a group_list + group_list=$(command \ + cat ${HOST_FILE} \ + | awk '$1 ~ /^\[.*\]$/ && !/=/ && !/:vars/ \ + { gsub(/[\[\]]/, "", $1); gsub(/:children/, "", $1) ; print $1 }' \ + | uniq ) + + echo ${group_list} +} + + +__host_list () +{ + # parses the ini hostfile for hosts only + # but then has to remove all group occurrences + HOST_FILE=$(__host_file_location) + + # this will also contain groups if they are referenced in other groups + local -a mixed_host_list + mixed_host_list=$(command \ + cat ${HOST_FILE} \ + | awk 'NF && $1 !~ /[\[:=]/ { print $1 }' \ + | sort | uniq) + + # compute set difference h1 - h2 + local -a h1 h2 host_list + h1=${mixed_host_list} + h2=$(__ll_group_list) + host_list=($(command \ + sort <(echo $h1) <(echo $h2) <(echo $h2) \ + | uniq -u \ + | paste -s -d ' ' - ) + ) + + _wanted application expl 'hosts' compadd ${host_list} + + # method that delegates to ansible (slow) + # _wanted application expl 'hosts' compadd $(command ansible \ + # all --list-hosts\ + # 2>/dev/null) +} + +__group_list () +{ + gl=($(command echo $(__ll_group_list) | paste -s -d ' ' - )) # 'a\nb\nc' -> (a b c) + _wanted application2 expl 'groups' compadd $gl +} + + +_modules=( +'a10_server:(E) Manage A10 Networks AX/SoftAX/Thunder/vThunder devices' +'a10_service_group:(E) Manage A10 Networks AX/SoftAX/Thunder/vThunder devices' +'a10_virtual_server:(E) Manage A10 Networks AX/SoftAX/Thunder/vThunder devices' +'accelerate:Enable accelerated mode on remote node' +'acl:Sets and retrieves file ACL information.' +'add_host:add a host (and alternatively a group) to the ansible-playbook in-memory inventory' +'airbrake_deployment:(E) Notify airbrake about app deployments' +'alternatives:(E) Manages alternative programs for common commands' +'apache2_module:enables/disables a module of the Apache2 webserver' +'apt:Manages apt-packages' +'apt_key:Add or remove an apt key' +'apt_repository:Add and remove APT repositories' +'apt_rpm:apt_rpm package manager' +'assemble:Assembles a configuration file from fragments' +'assert:Fail with custom message' +'async_status:Obtain status of asynchronous task' +'at:(E) Schedule the execution of a command or script file via the at command.' +'authorized_key:Adds or removes an SSH authorized key' +'azure:create or terminate a virtual machine in azure' +'bigip_facts:(E) Collect facts from F5 BIG-IP devices' +'bigip_monitor_http:(E) Manages F5 BIG-IP LTM http monitors' +'bigip_monitor_tcp:(E) Manages F5 BIG-IP LTM tcp monitors' +'bigip_node:(E) Manages F5 BIG-IP LTM nodes' +'bigip_pool:(E) Manages F5 BIG-IP LTM pools' +'bigip_pool_member:(E) Manages F5 BIG-IP LTM pool members' +'bigpanda:(E) Notify BigPanda about deployments' +'boundary_meter:(E) Manage boundary meters' +'bower:(E) Manage bower packages with bower' +'bzr:(E) Deploy software (or files) from bzr branches' +'campfire:(E) Send a message to Campfire' +'capabilities:(E) Manage Linux capabilities' +'cloudformation:create a AWS CloudFormation stack' +'command:Executes a command on a remote node' +'composer:(E) Dependency Manager for PHP' +'copy:Copies files to remote locations.' +'cpanm:(E) Manages Perl library dependencies.' +'cron:Manage cron.d and crontab entries.' +'crypttab:(E) Encrypted Linux block devices' +'datadog_event:(E) Posts events to DataDog service' +'debconf:(E) Configure a .deb package' +'debug:Print statements during execution' +'digital_ocean:Create/delete a droplet/SSH_key in DigitalOcean' +'digital_ocean_domain:Create/delete a DNS record in DigitalOcean' +'digital_ocean_sshkey:Create/delete an SSH key in DigitalOcean' +'django_manage:Manages a Django application.' +'dnf:(E) Manages packages with the I(dnf) package manager' +'dnsimple:(E) Interface with dnsimple.com (a DNS hosting service).' +'dnsmadeeasy:(E) Interface with dnsmadeeasy.com (a DNS hosting service).' +'docker:manage docker containers' +'docker_image (D):manage docker images' +'easy_install:Installs Python libraries' +'ec2:create, terminate, start or stop an instance in ec2' +'ec2_ami:create or destroy an image in ec2' +'ec2_ami_search:Retrieve AWS AMI information for a given operating system.' +'ec2_asg:Create or delete AWS Autoscaling Groups' +'ec2_eip:associate an EC2 elastic IP with an instance.' +'ec2_elb:De-registers or registers instances from EC2 ELBs' +'ec2_elb_lb:Creates or destroys Amazon ELB.' +'ec2_facts:Gathers facts about remote hosts within ec2 (aws)' +'ec2_group:maintain an ec2 VPC security group.' +'ec2_key:maintain an ec2 key pair.' +'ec2_lc:Create or delete AWS Autoscaling Launch Configurations' +'ec2_metric_alarm:Create/update or delete AWS Cloudwatch ‘metric alarms’' +'ec2_scaling_policy:Create or delete AWS scaling policies for Autoscaling groups' +'ec2_snapshot:creates a snapshot from an existing volume' +'ec2_tag:create and remove tag(s) to ec2 resources.' +'ec2_vol:create and attach a volume, return volume id and device map' +'ec2_vpc:configure AWS virtual private clouds' +'ejabberd_user:(E) Manages users for ejabberd servers' +'elasticache:Manage cache clusters in Amazon Elasticache.' +'facter:(E) Runs the discovery program I(facter) on the remote system' +'fail:Fail with custom message' +'fetch:Fetches a file from remote nodes' +'file:Sets attributes of files' +'filesystem:(E) Makes file system on block device' +'fireball:Enable fireball mode on remote node' +'firewalld:(E) Manage arbitrary ports/services with firewalld' +'flowdock:(E) Send a message to a flowdock' +'gc_storage:This module manages objects/buckets in Google Cloud Storage.' +'gce:create or terminate GCE instances' +'gce_img:(E) utilize GCE image resources' +'gce_lb:create/destroy GCE load-balancer resources' +'gce_net:create/destroy GCE networks and firewall rules' +'gce_pd:utilize GCE persistent disk resources' +'gem:Manage Ruby gems' +'get_url:Downloads files from HTTP, HTTPS, or FTP to node' +'getent:(E) a wrapper to the unix getent utility' +'git:Deploy software (or files) from git checkouts' +'github_hooks:(E) Manages github service hooks.' +'glance_image:Add/Delete images from glance' +'gluster_volume:(E) Manage GlusterFS volumes' +'group:Add or remove groups' +'group_by:Create Ansible groups based on facts' +'grove:(E) Sends a notification to a grove.io channel' +'haproxy:(E) An Ansible module to handle states enable/disable server and set weight to backend host in haproxy using socket commands.' +'hg:Manages Mercurial (hg) repositories.' +'hipchat:(E) Send a message to hipchat' +'homebrew:(E) Package manager for Homebrew' +'homebrew_cask:(E) Install/uninstall homebrew casks.' +'homebrew_tap:(E) Tap a Homebrew repository.' +'hostname:Manage hostname' +'htpasswd:manage user files for basic authentication' +'include_vars:Load variables from files, dynamically within a task.' +'ini_file:Tweak settings in INI files' +'irc:(E) Send a message to an IRC channel' +'jabber:(E) Send a message to jabber user or chat room' +'jboss:(E) deploy applications to JBoss' +'jira:(E) create and modify issues in a JIRA instance' +'kernel_blacklist:(E) Blacklist kernel modules' +'keystone_user:Manage OpenStack Identity (keystone) users, tenants and roles' +'layman:(E) Manage Gentoo overlays' +'librato_annotation:(E) create an annotation in librato' +'lineinfile:Ensure a particular line is in a file, or replace an existing line using a back-referenced regular expression.' +'linode:create / delete / stop / restart an instance in Linode Public Cloud' +'lldp:(E) get details reported by lldp' +'locale_gen:(E) Creates or removes locales.' +'logentries:(E) Module for tracking logs via logentries.com' +'lvg:(E) Configure LVM volume groups' +'lvol:(E) Configure LVM logical volumes' +'macports:(E) Package manager for MacPorts' +'mail:(E) Send an email' +'modprobe:(E) Add or remove kernel modules' +'mongodb_user:(E) Adds or removes a user from a MongoDB database.' +'monit:(E) Manage the state of a program monitored via Monit' +'mount:Control active and configured mount points' +'mqtt:(E) Publish a message on an MQTT topic for the IoT' +'mysql_db:Add or remove MySQL databases from a remote host.' +'mysql_replication:(E) Manage MySQL replication' +'mysql_user:Adds or removes a user from a MySQL database.' +'mysql_variables:Manage MySQL global variables' +'nagios:(E) Perform common tasks in Nagios related to downtime and notifications.' +'netscaler:(E) Manages Citrix NetScaler entities' +'newrelic_deployment:(E) Notify newrelic about app deployments' +'nexmo:(E) Send a SMS via nexmo' +'nova_compute:Create/Delete VMs from OpenStack' +'nova_keypair:Add/Delete key pair from nova' +'npm:(E) Manage node.js packages with npm' +'ohai:(E) Returns inventory data from I(Ohai)' +'open_iscsi:(E) Manage iscsi targets with open-iscsi' +'openbsd_pkg:(E) Manage packages on OpenBSD.' +'openvswitch_bridge:(E) Manage Open vSwitch bridges' +'openvswitch_port:(E) Manage Open vSwitch ports' +'opkg:(E) Package manager for OpenWrt' +'osx_say:(E) Makes an OSX computer to speak.' +'ovirt:(E) oVirt/RHEV platform management' +'pacman:(E) Manage packages with I(pacman)' +'pagerduty:(E) Create PagerDuty maintenance windows' +'patch:(E) Apply patch files using the GNU patch tool.' +'pause:Pause playbook execution' +'ping:Try to connect to host and return C(pong) on success.' +'pingdom:(E) Pause/unpause Pingdom alerts' +'pip:Manages Python library dependencies.' +'pkg5:(E) Manages packages with the Solaris 11 Image Packaging System' +'pkg5_publisher:(E) Manages Solaris 11 Image Packaging System publishers' +'pkgin:(E) Package manager for SmartOS' +'pkgng:(E) Package manager for FreeBSD >= 9.0' +'pkgutil:(E) Manage CSW-Packages on Solaris' +'portage:(E) Package manager for Gentoo' +'portinstall:(E) Installing packages from FreeBSD’s ports system' +'postgresql_db:Add or remove PostgreSQL databases from a remote host.' +'postgresql_lang:(E) Adds, removes or changes procedural languages with a PostgreSQL database.' +'postgresql_privs:Grant or revoke privileges on PostgreSQL database objects.' +'postgresql_user:Adds or removes a users (roles) from a PostgreSQL database.' +'quantum_floating_ip:Add/Remove floating IP from an instance' +'quantum_floating_ip_associate:Associate or disassociate a particular floating IP with an instance' +'quantum_network:Creates/Removes networks from OpenStack' +'quantum_router:Create or Remove router from openstack' +'quantum_router_gateway:set/unset a gateway interface for the router with the specified external network' +'quantum_router_interface:Attach/Dettach a subnet’s interface to a router' +'quantum_subnet:Add/remove subnet from a network' +'rabbitmq_parameter:(E) Adds or removes parameters to RabbitMQ' +'rabbitmq_plugin:(E) Adds or removes plugins to RabbitMQ' +'rabbitmq_policy:(E) Manage the state of policies in RabbitMQ.' +'rabbitmq_user:(E) Adds or removes users to RabbitMQ' +'rabbitmq_vhost:(E) Manage the state of a virtual host in RabbitMQ' +'raw:Executes a low-down and dirty SSH command' +'rax:create / delete an instance in Rackspace Public Cloud' +'rax_cbs:Manipulate Rackspace Cloud Block Storage Volumes' +'rax_cbs_attachments:Manipulate Rackspace Cloud Block Storage Volume Attachments' +'rax_cdb:create/delete or resize a Rackspace Cloud Databases instance' +'rax_cdb_database:create / delete a database in the Cloud Databases' +'rax_cdb_user:create / delete a Rackspace Cloud Database' +'rax_clb:create / delete a load balancer in Rackspace Public Cloud' +'rax_clb_nodes:add, modify and remove nodes from a Rackspace Cloud Load Balancer' +'rax_dns:Manage domains on Rackspace Cloud DNS' +'rax_dns_record:Manage DNS records on Rackspace Cloud DNS' +'rax_facts:Gather facts for Rackspace Cloud Servers' +'rax_files:Manipulate Rackspace Cloud Files Containers' +'rax_files_objects:Upload, download, and delete objects in Rackspace Cloud Files' +'rax_identity:Load Rackspace Cloud Identity' +'rax_keypair:Create a keypair for use with Rackspace Cloud Servers' +'rax_meta:Manipulate metadata for Rackspace Cloud Servers' +'rax_network:create / delete an isolated network in Rackspace Public Cloud' +'rax_queue:create / delete a queue in Rackspace Public Cloud' +'rax_scaling_group:Manipulate Rackspace Cloud Autoscale Groups' +'rax_scaling_policy:Manipulate Rackspace Cloud Autoscale Scaling Policy' +'rds:create, delete, or modify an Amazon rds instance' +'rds_param_group:manage RDS parameter groups' +'rds_subnet_group:manage RDS database subnet groups' +'redhat_subscription:Manage Red Hat Network registration and subscriptions using the C(subscription-manager) command' +'redis:(E) Various redis commands, slave and flush' +'replace:Replace all instances of a particular string in a file using a back-referenced regular expression.' +'rhn_channel:Adds or removes Red Hat software channels' +'rhn_register:Manage Red Hat Network registration using the C(rhnreg_ks) command' +'riak:(E) This module handles some common Riak operations' +'rollbar_deployment:(E) Notify Rollbar about app deployments' +'route53:add or delete entries in Amazons Route53 DNS service' +'rpm_key:Adds or removes a gpg key from the rpm db' +'s3:S3 module putting a file into S3.' +'script:Runs a local script on a remote node after transferring it' +'seboolean:Toggles SELinux booleans.' +'selinux:Change policy and state of SELinux' +'service:Manage services.' +'set_fact:Set host facts from a task' +'setup:Gathers facts about remote hosts' +'shell:Execute commands in nodes.' +'slack:(E) Send Slack notifications' +'slurp:Slurps a file from remote nodes' +'snmp_facts:(E) Retrive facts for a device using SNMP.' +'sns:(E) Send Amazon Simple Notification Service (SNS) messages' +'stackdriver:(E) Send code deploy and annotation events to stackdriver' +'stat:retrieve file or file system status' +'subversion:Deploys a subversion repository.' +'supervisorctl:Manage the state of a program or group of programs running via supervisord' +'svc:(E) Manage daemontools services.' +'svr4pkg:(E) Manage Solaris SVR4 packages' +'swdepot:(E) Manage packages with swdepot package manager (HP-UX)' +'synchronize:Uses rsync to make synchronizing file paths in your playbooks quick and easy.' +'sysctl:Manage entries in sysctl.conf.' +'template:Templates a file out to a remote server.' +'twilio:(E) Sends a text message to a mobile phone through Twilio.' +'typetalk:(E) Send a message to typetalk' +'ufw:(E) Manage firewall with UFW' +'unarchive:Copies an archive to a remote location and unpack it' +'uptimerobot:(E) Pause and start Uptime Robot monitoring' +'uri:Interacts with webservices' +'urpmi:(E) Urpmi manager' +'user:Manage user accounts' +'virt:(E) Manages virtual machines supported by libvirt' +'vsphere_guest:Create/delete/manage a guest VM through VMware vSphere.' +'wait_for:Waits for a condition before continuing.' +'win_chocolatey:(E) Installs packages using chocolatey' +'win_feature:Installs and uninstalls Windows Features' +'win_get_url:Fetches a file from a given URL' +'win_group:Add and remove local groups' +'win_msi:Installs and uninstalls Windows MSI files' +'win_ping:A windows version of the classic ping module.' +'win_service:Manages Windows services' +'win_stat:returns information about a Windows file' +'win_updates:(E) Lists / Installs windows updates' +'win_user:Manages local Windows user accounts' +'xattr:set/retrieve extended attributes' +'yum:Manages packages with the I(yum) package manager' +'zabbix_group:(E) Add or remove a host group to Zabbix.' +'zabbix_maintenance:(E) Create Zabbix maintenance windows' +'zfs:(E) Manage zfs' +'zypper:(E) Manage packages on SUSE and openSUSE' +'zypper_repository:(E) Add and remove Zypper repositories' +) + + +_ansible () +{ + local curcontext="$curcontext" state line + typeset -A opt_args + + _arguments -C -W \ + '1:pattern:->pattern'\ + "(-a --args)"{-a,--args}"[ARGS module arguments]:arguments:(ARG)"\ + "(-k --ask-pass)"{-k,--ask-pass}"[ask for SSH password]"\ + '--ask-su-pass[ask for su password]'\ + "(-K --ask-sudo-pass)"{-K,--ask-sudo-pass}"[ask for sudo password]"\ + '--ask-vault-pass[ask for vault password]'\ + "(-B --background)"{-B,--background}"[DURATION run asynchronously for DURATION (s)]:duration:(DURATION)"\ + "(-C --check)"{-C,--check}"[don't make any changes]"\ + "(-c --connection)"{-c,--connection}"[CONNECTION connection type to use (default=smart)]:connection type:(smart ssh local chroot)"\ + "(-f --forks)"{-f,--forks}"[FORKS number of parallel processes to use (default=5)]:forks:(5)"\ + "(-h --help)"{-h,--help}"[help message]"\ + "(-i --inventory-file)"{-i,--inventory-file}"[INVENTORY specify inventory host file]:inventory file:_files"\ + "(-l --limit)"{-l,--limit}"[SUBSET further limit selected hosts to an additional pattern]:subset pattern:->pattern"\ + '--list-hosts[outputs a list of matching hosts. Does not execute anything else]'\ + "(-m --module-name)"{-m,--module-name}"[MODULE_NAME module name (default=command)]:module name:->module"\ + "(-M --module-path)"{-M,--module-path}"[MODULE_PATH specify path to module library (default=None)]:module path:_files -/"\ + "(-o --one-line)"{-o,--one-line}"[condense output]"\ + "(-P --poll)"{-P,--poll}"[POLL_INTERVAL set the poll interval (s) if using -B (default=15)]:poll interval:(15)"\ + "--private-key[PRIVATE_KEY_FILE use this file to authenticate the connection]:private key file:_files"\ + "(-S --su)"{-S,--su}"[run operations with su]"\ + "(-R --su-user)"{-R,--su-user}"[SU_USER run operations with su as this user (default=root)]:su user:(root)"\ + "(-s --sudo)"{-s,--sudo}"[run operations with sudo (nopasswd)]"\ + "(-U --sudo-user)"{-U,--sudo-user}"[SUDO_USER desired sudo user (default=root)]:su user:(root)"\ + "(-T --timeout)"{-T,--timeout}"[TIMEOUT override the SSH timeout (s) (default=10)]:ssh timeout:(10)"\ + "(-t --tree)"{-t,--tree}"[OUTPUT_DIRECTORY log output to this directory]:output directory:_files -/"\ + "(-u --user)"{-u,--user}"[REMOTE_USER connect as this user (default=${USER})]:connect as user:(${USER})"\ + "--vault-password-file[VAULT_PASSWORD_FILE vault password file]:vault password file:_files"\ + "(-v --verbose)"{-v,--verbose}"[verbose mode (-vvv for more, -vvvv to enable connection debugging)]"\ + "--version[show program's version number and exit]"\ + + case $state in + pattern) + _arguments '*:feature:__host_list' + _arguments '*:feature:__group_list' + ;; + module) + _describe -t commands "modules" _modules + ;; + esac +} + +_ansible "$@" + +# Local Variables: +# mode: Shell-Script +# sh-indentation: 2 +# indent-tabs-mode: nil +# sh-basic-offset: 2 +# End: +# vim: ft=zsh sw=2 ts=2 et diff --git a/src/_ansible-galaxy b/src/_ansible-galaxy new file mode 100644 index 0000000..792909d --- /dev/null +++ b/src/_ansible-galaxy @@ -0,0 +1,111 @@ +#compdef ansible-galaxy +# ------------------------------------------------------------------------------ +# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the zsh-users nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# ------------------------------------------------------------------------------ +# Description +# ----------- +# +# Completion script for ansible-galaxy v1.8.4 (http://ansible.org) +# +# ------------------------------------------------------------------------------ +# Authors +# ------- +# +# * Romain Bossart (https://github.com/bosr) +# +# ------------------------------------------------------------------------------ +# +# Note: I tried to use `_arguments --`, but the output of `ansible --help` +# is not parsed entirely correctly, and anyway no modules or host would available. +# + +# ansible-galaxy zsh completion +# +_ansible-galaxy () +{ + local context curcontext="$curcontext" state line + typeset -A opt_args + + _arguments -C \ + "1:command:(init info install list remove)" \ + "*::option:->option" + + case $state in + option) + case $line[1] in + init) + _arguments \ + "(-h --help)"{-h,--help}"[help message]" \ + "(-p --init-path)"{-p,--init-path}"[INIT_PATH path in which the skeleton role will be created (default=./)]:init path:(./)" \ + "(--offline)--offline[Don't query the galaxy API when creating roles]" \ + "(-s --server)"{-s,--server}"[API_SERVER The API server destination]:api server:(http://apiserver)" \ + "(-f --force)"{-f,--force}"[Force overwriting an existing role]" \ + ":role name:(ROLE)" + ;; + info) + _arguments \ + "(-h --help)"{-h,--help}"[help message]" \ + "(-p --roles-path)"{-p,--roles-path}"[ROLES_PATH The path to the directory containing your roles (default: from ansible.cfg)]:roles path:_files -/" \ + "(-s --server)"{-s,--server}"[API_SERVER The API server destination]:api server:(http://apiserver)" \ + ":role name:(ROLE,version)" + ;; + install) + _arguments \ + "(-h --help)"{-h,--help}"[help message]" \ + "(-i --ignore-errors)"{-i,--ignore-errors}"[Ignore errors and continue with the next specified role]" \ + "(-n --no-deps)"{-n,--no-deps}"[Don't download roles listed as dependencies]" \ + "(-r --role-file)"{-r,--role-file}"[ROLE_FILE A file containing a list of roles to be imported]:role file:_files" \ + "(-p --roles-path)"{-p,--roles-path}"[ROLES_PATH The path to the directory containing your roles (default: from ansible.cfg)]:roles path:_files -/" \ + "(-s --server)"{-s,--server}"[API_SERVER The API server destination]:api server:(http://apiserver)" \ + "(-f --force)"{-f,--force}"[Force overwriting an existing role]" \ + ":role name:(ROLE)" + ;; + list) + _arguments \ + "(-h --help)"{-h,--help}"[help message]" \ + "(-p --roles-path)"{-p,--roles-path}"[ROLES_PATH The path to the directory containing your roles (default: from ansible.cfg)]:roles path:_files -/" \ + ":role name:(ROLE)" + ;; + remove) + _arguments \ + "(-h --help)"{-h,--help}"[help message]" \ + "(-p --roles-path)"{-p,--roles-path}"[ROLES_PATH The path to the directory containing your roles (default: from ansible.cfg)]:roles path:_files -/" \ + "*:role name:(ROLE)" + ;; + esac + ;; + esac +} + +_ansible-galaxy "$@" + +# Local Variables: +# mode: Shell-Script +# sh-indentation: 2 +# indent-tabs-mode: nil +# sh-basic-offset: 2 +# End: +# vim: ft=zsh sw=2 ts=2 et diff --git a/src/_ansible-playbook b/src/_ansible-playbook new file mode 100644 index 0000000..a7d9ef8 --- /dev/null +++ b/src/_ansible-playbook @@ -0,0 +1,177 @@ +#compdef ansible-playbook +# ------------------------------------------------------------------------------ +# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the zsh-users nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# ------------------------------------------------------------------------------ +# Description +# ----------- +# +# Completion script for ansible-playbook v1.8.4 (http://ansible.org) +# +# ------------------------------------------------------------------------------ +# Authors +# ------- +# +# * Romain Bossart (https://github.com/bosr) +# +# ------------------------------------------------------------------------------ +# +# Needs either ANSIBLE_HOSTS or /etc/ansible/hosts on linux +# (or /usr/local/etc/ansible/hosts on OSX) +# +# Note 1: the following gist (https://gist.github.com/15ed54a438a36d67fd99.git) +# has some files to help improve the hostfile shell parsing +# +# Note 2: I tried to use `_arguments --`, but the output of `ansible --help` +# is not parsed entirely correctly, and anyway no modules or host would available. +# + +# ansible-playbook zsh completion +# +__host_file_location () { + # find the location of the host file: + # 1. check $ANSIBLE_HOSTS + # 2. else check /etc/ansible/hosts or /usr/local/etc/... + # (depending on platform) + # + + [[ "$OSTYPE" == darwin* ]] && FALLBACK="/usr/local/etc/ansible/hosts" + [[ "$OSTYPE" == linux* ]] && FALLBACK="/etc/ansible/hosts" + HOST_FILE=${ANSIBLE_HOSTS:=${FALLBACK}} + [[ -f ${HOST_FILE} ]] || HOST_FILE=/dev/null + + echo ${HOST_FILE} +} + +__ll_group_list () { + # parses the ini hostfile for groups only: [...] + HOST_FILE=$(__host_file_location) + + local -a group_list + group_list=$(command \ + cat ${HOST_FILE} \ + | awk '$1 ~ /^\[.*\]$/ && !/=/ && !/:vars/ \ + { gsub(/[\[\]]/, "", $1); gsub(/:children/, "", $1) ; print $1 }' \ + | uniq ) + + echo ${group_list} +} + + +__host_list () +{ + # parses the ini hostfile for hosts only + # but then has to remove all group occurrences + HOST_FILE=$(__host_file_location) + + # this will also contain groups if they are referenced in other groups + local -a mixed_host_list + mixed_host_list=$(command \ + cat ${HOST_FILE} \ + | awk 'NF && $1 !~ /[\[:=]/ { print $1 }' \ + | sort | uniq) + + # compute set difference h1 - h2 + local -a h1 h2 host_list + h1=${mixed_host_list} + h2=$(__ll_group_list) + host_list=($(command \ + sort <(echo $h1) <(echo $h2) <(echo $h2) \ + | uniq -u \ + | paste -s -d ' ' - ) + ) + + _wanted application expl 'hosts' compadd ${host_list} + + # method that delegates to ansible (slow) + # _wanted application expl 'hosts' compadd $(command ansible \ + # all --list-hosts\ + # 2>/dev/null) +} + +__group_list () +{ + gl=($(command echo $(__ll_group_list) | paste -s -d ' ' - )) # 'a\nb\nc' -> (a b c) + _wanted application2 expl 'groups' compadd $gl +} + + + +_ansible-playbook () +{ + local curcontext="$curcontext" state line + typeset -A opt_args + + _arguments -C -W \ + "1:playbook yml file:_files -g '*.yml'"\ + "(-k --ask-pass)"{-k,--ask-pass}"[ask for SSH password]"\ + '--ask-su-pass[ask for su password]'\ + "(-K --ask-sudo-pass)"{-K,--ask-sudo-pass}"[ask for sudo password]"\ + '--ask-vault-pass[ask for vault password]'\ + "(-C --check)"{-C,--check}"[don't make any changes]"\ + "(-c --connection)"{-c,--connection}"[CONNECTION connection type to use (default=smart)]:connection type:(smart ssh local chroot)"\ + "(-D --diff)"{-D,--diff}"[when changing (small files and templates, thow the diff in those. Works great with --check)]"\ + "(-e --extra-vars)"{-e,--extra-vars}"[EXTRA_VARS set additional variables as key=value or YAML/JSON]:extra vars:(EXTRA_VARS)"\ + '--flush-cache[clear the fact cache]'\ + '--force-handlers[run handlers even if a task fails]'\ + "(-f --forks)"{-f,--forks}"[FORKS number of parallel processes to use (default=5)]:forks:(5)"\ + "(-h --help)"{-h,--help}"[help message]"\ + "(-i --inventory-file)"{-i,--inventory-file}"[INVENTORY specify inventory host file]:inventory file:_files"\ + "(-l --limit)"{-l,--limit}"[SUBSET further limit selected hosts to an additional pattern]:subset pattern:->pattern"\ + '--list-hosts[outputs a list of matching hosts. Does not execute anything else]'\ + "(-M --module-path)"{-M,--module-path}"[MODULE_PATH specify path to module library (default=None)]:module path:_files -/"\ + "--private-key[PRIVATE_KEY_FILE use this file to authenticate the connection]:private key file:_files"\ + "--skip-tags[SKIP_TAGS only run plays and tasks whose tags do not match these values]:skip tags:(SKIP_TAGS)"\ + "--start-at-task[START_AT start the playbook at the task matching this name]:name:(TASK_NAME)"\ + '--step[one-step-at-a-time: confirm each task before running]'\ + "(-S --su)"{-S,--su}"[run operations with su]"\ + "(-R --su-user)"{-R,--su-user}"[SU_USER run operations with su as this user (default=root)]:su user:(root)"\ + "(-s --sudo)"{-s,--sudo}"[run operations with sudo (nopasswd)]"\ + "(-U --sudo-user)"{-U,--sudo-user}"[SUDO_USER desired sudo user (default=root)]:su user:(root)"\ + '--syntax-check[perform a syntax check on the playbook, but do not execute it]'\ + "(-t --tags)"{-t,--tags}"[TAGS only run plays and tasks gagged with these values]:task tags:(TAGS)"\ + "(-T --timeout)"{-T,--timeout}"[TIMEOUT override the SSH timeout (s) (default=10)]:ssh timeout:(10)"\ + "(-u --user)"{-u,--user}"[REMOTE_USER connect as this user (default=${USER})]:connect as user:(${USER})"\ + "--vault-password-file[VAULT_PASSWORD_FILE vault password file]:vault password file:_files"\ + "(-v --verbose)"{-v,--verbose}"[verbose mode (-vvv for more, -vvvv to enable connection debugging)]"\ + "--version[show program's version number and exit]"\ + + case $state in + pattern) + _arguments '*:feature:__host_list' + _arguments '*:feature:__group_list' + ;; + esac +} + +_ansible-playbook "$@" + +# Local Variables: +# mode: Shell-Script +# sh-indentation: 2 +# indent-tabs-mode: nil +# sh-basic-offset: 2 +# End: +# vim: ft=zsh sw=2 ts=2 et