diff --git a/.travis.yml b/.travis.yml index 1ff0ca118d..603132f722 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,7 @@ script: - ./test/code-smell/replace-urlopen.sh . - ./test/code-smell/use-compat-six.sh lib - ./test/code-smell/boilerplate.sh +- ./test/code-smell/required-and-default-attributes.sh - if test x"$TOXENV" != x'py24' ; then tox ; fi - if test x"$TOXENV" = x'py24' ; then python2.4 -V && python2.4 -m compileall -fq -x 'module_utils/(a10|rax|openstack|ec2|gce).py' lib/ansible/module_utils ; fi #- make -C docsite all diff --git a/CHANGELOG.md b/CHANGELOG.md index ed50896733..4037ea7f9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,16 @@ Ansible Changes By Release ========================== -## 2.0 "Over the Hills and Far Away" - ACTIVE DEVELOPMENT +## 2.1 TBD - ACTIVE DEVELOPMENT + +####New Modules: +* aws: ec2_vpc_net_facts +* cloudstack: cs_volume + +####New Filters: +* extract + +## 2.0 "Over the Hills and Far Away" ###Major Changes: @@ -24,10 +33,13 @@ Ansible Changes By Release by setting the `ANSIBLE_NULL_REPRESENTATION` environment variable. * Added `meta: refresh_inventory` to force rereading the inventory in a play. This re-executes inventory scripts, but does not force them to ignore any cache they might use. -* Now when you delegate an action that returns ansible_facts, these facts will be applied to the delegated host, unlike before when they were applied to the current host. +* New delegate_facts directive, a boolean that allows you to apply facts to the delegated host (true/yes) instead of the inventory_hostname (no/false) which is the default and previous behaviour. +* local connections now work with 'su' as a privilege escalation method +* Ansible 2.0 has deprecated the “ssh” from ansible_ssh_user, ansible_ssh_host, and ansible_ssh_port to become ansible_user, ansible_host, and ansible_port. * New ssh configuration variables(`ansible_ssh_common_args`, `ansible_ssh_extra_args`) can be used to configure a per-group or per-host ssh ProxyCommand or set any other ssh options. `ansible_ssh_extra_args` is used to set options that are accepted only by ssh (not sftp or scp, which have their own analogous settings). +* ansible-pull can now verify the code it runs when using git as a source repository, using git's code signing and verification features. * Backslashes used when specifying parameters in jinja2 expressions in YAML dicts sometimes needed to be escaped twice. This has been fixed so that escaping once works. Here's an example of how playbooks need to be modified: @@ -71,9 +83,31 @@ newline being stripped you can change your playbook like this: "msg": "Testing some things" ``` +* When specifying complex args as a variable, the variable must use the full jinja2 +variable syntax ('{{var_name}}') - bare variable names there are no longer accepted. +In fact, even specifying args with variables has been deprecated, and will not be +allowed in future versions: + + ``` + --- + - hosts: localhost + connection: local + gather_facts: false + vars: + my_dirs: + - { path: /tmp/3a, state: directory, mode: 0755 } + - { path: /tmp/3b, state: directory, mode: 0700 } + tasks: + - file: + args: "{{item}}" + with_items: my_dirs + ``` + ###Plugins * Rewritten dnf module that should be faster and less prone to encountering bugs in cornercases +* WinRM connection plugin passes all vars named `ansible_winrm_*` to the underlying pywinrm client. This allows, for instance, `ansible_winrm_server_cert_validation=ignore` to be used with newer versions of pywinrm to disable certificate validation on Python 2.7.9+. +* WinRM connection plugin put_file is significantly faster and no longer has file size limitations. ####Deprecated Modules (new ones in parens): @@ -94,23 +128,31 @@ newline being stripped you can change your playbook like this: * amazon: ec2_eni * amazon: ec2_eni_facts * amazon: ec2_remote_facts +* amazon: ec2_vpc_igw * amazon: ec2_vpc_net +* amazon: ec2_vpc_net_facts * amazon: ec2_vpc_route_table * amazon: ec2_vpc_route_table_facts * amazon: ec2_vpc_subnet +* amazon: ec2_vpc_subnet_facts * amazon: ec2_win_password * amazon: ecs_cluster * amazon: ecs_task * amazon: ecs_taskdefinition -* amazon: elasticache_subnet_group +* amazon: elasticache_subnet_group_facts * amazon: iam +* amazon: iam_cert * amazon: iam_policy -* amazon: route53_zone +* amazon: route53_facts * amazon: route53_health_check +* amazon: route53_zone * amazon: sts_assume_role * amazon: s3_bucket * amazon: s3_lifecycle * amazon: s3_logging +* amazon: sqs_queue +* amazon: sns_topic +* amazon: sts_assume_role * apk * bigip_gtm_wide_ip * bundler @@ -151,29 +193,35 @@ newline being stripped you can change your playbook like this: * cloudstack: cs_template * cloudstack: cs_user * cloudstack: cs_vmsnapshot +* cronvar * datadog_monitor * deploy_helper +* docker: docker_login * dpkg_selections * elasticsearch_plugin * expect * find +* google: gce_tag * hall * ipify_facts * iptables * libvirt: virt_net * libvirt: virt_pool * maven_artifact -* openstack: os_ironic -* openstack: os_ironic_node +* openstack: os_auth * openstack: os_client_config -* openstack: os_floating_ip * openstack: os_image * openstack: os_image_facts +* openstack: os_floating_ip +* openstack: os_ironic +* openstack: os_ironic_node +* openstack: os_keypair * openstack: os_network * openstack: os_network_facts * openstack: os_nova_flavor * openstack: os_object * openstack: os_port +* openstack: os_project * openstack: os_router * openstack: os_security_group * openstack: os_security_group_rule @@ -183,6 +231,7 @@ newline being stripped you can change your playbook like this: * openstack: os_server_volume * openstack: os_subnet * openstack: os_subnet_facts +* openstack: os_user * openstack: os_user_group * openstack: os_volume * openvswitch_db. @@ -193,14 +242,15 @@ newline being stripped you can change your playbook like this: * profitbricks: profitbricks * profitbricks: profitbricks_datacenter * profitbricks: profitbricks_nic -* profitbricks: profitbricks_snapshot * profitbricks: profitbricks_volume * profitbricks: profitbricks_volume_attachments -* proxmox -* proxmox_template +* profitbricks: profitbricks_snapshot +* proxmox: proxmox +* proxmox: proxmox_template * puppet * pushover * pushbullet +* rax: rax_clb_ssl * rax: rax_mon_alarm * rax: rax_mon_check * rax: rax_mon_entity @@ -210,6 +260,7 @@ newline being stripped you can change your playbook like this: * rabbitmq_exchange * rabbitmq_queue * selinux_permissive +* sendgrid * sensu_check * sensu_subscription * seport @@ -221,21 +272,24 @@ newline being stripped you can change your playbook like this: * vertica_role * vertica_schema * vertica_user -* vmware: vmware_datacenter +* vmware: vca_fw +* vmware: vca_nat * vmware: vmware_cluster +* vmware: vmware_datacenter * vmware: vmware_dns_config * vmware: vmware_dvs_host * vmware: vmware_dvs_portgroup * vmware: vmware_dvswitch * vmware: vmware_host -* vmware: vmware_vmkernel_ip_config +* vmware: vmware_migrate_vmk * vmware: vmware_portgroup +* vmware: vmware_target_canonical_facts * vmware: vmware_vm_facts +* vmware: vmware_vm_vss_dvs_migrate * vmware: vmware_vmkernel +* vmware: vmware_vmkernel_ip_config * vmware: vmware_vsan_cluster * vmware: vmware_vswitch -* vmware: vca_fw -* vmware: vca_nat * vmware: vsphere_copy * webfaction_app * webfaction_db @@ -243,17 +297,22 @@ newline being stripped you can change your playbook like this: * webfaction_mailbox * webfaction_site * win_acl +* win_dotnet_ngen * win_environment * win_firewall_rule -* win_package -* win_scheduled_task * win_iis_virtualdirectory * win_iis_webapplication * win_iis_webapppool * win_iis_webbinding * win_iis_website +* win_lineinfile +* win_nssm +* win_package * win_regedit +* win_scheduled_task * win_unzip +* win_updates +* win_webpicmd * xenserver_facts * zabbix_host * zabbix_hostmacro @@ -266,6 +325,7 @@ newline being stripped you can change your playbook like this: * fleetctl * openvz * nagios_ndo +* nsot * proxmox * rudder * serf @@ -285,6 +345,11 @@ newline being stripped you can change your playbook like this: * docker: for talking to docker containers on the ansible controller machine without using ssh. +####New Callbacks: + +* logentries: plugin to send play data to logentries service +* skippy: same as default but does not display skip messages + ###Minor changes: * Many more tests. The new API makes things more testable and we took advantage of it. @@ -311,9 +376,16 @@ newline being stripped you can change your playbook like this: * Lookup, vars and action plugin pathing has been normalized, all now follow the same sequence to find relative files. * We do not ignore the explicitly set login user for ssh when it matches the 'current user' anymore, this allows overriding .ssh/config when it is set explicitly. Leaving it unset will still use the same user and respect .ssh/config. This also means ansible_ssh_user can now return a None value. -* Handling of undefined variables has changed. In most places they will now raise an error instead of silently injecting an empty string. Use the default filter if you want to approximate the old behaviour:: +* environment variables passed to remote shells now default to 'controller' settings, with fallback to en_us.UTF8 which was the previous default. +* add_hosts is much stricter about host name and will prevent invalid names from being added. +* ansible-pull now defaults to doing shallow checkouts with git, use `--full` to return to previous behaviour. +* random cows are more random +* when: now gets the registered var after the first iteration, making it possible to break out of item loops +* Handling of undefined variables has changed. In most places they will now raise an error instead of silently injecting an empty string. Use the default filter if you want to approximate the old behaviour: + ``` - debug: msg="The error message was: {{error_code |default('') }}" + ``` ## 1.9.4 "Dancing In the Street" - Oct 9, 2015 diff --git a/MANIFEST.in b/MANIFEST.in index d8402f0297..a5e29c9a43 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,12 +4,14 @@ prune ticket_stubs prune packaging prune test prune hacking -include README.md packaging/rpm/ansible.spec COPYING +include README.md COPYING include examples/hosts include examples/ansible.cfg include lib/ansible/module_utils/powershell.ps1 recursive-include lib/ansible/modules * +recursive-include lib/ansible/galaxy/data * recursive-include docs * +recursive-include packaging * include Makefile include VERSION include MANIFEST.in diff --git a/Makefile b/Makefile index ac4c07f431..367987affc 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ GIT_HASH := $(shell git log -n 1 --format="%h") GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD | sed 's/[-_.\/]//g') GITINFO = .$(GIT_HASH).$(GIT_BRANCH) else -GITINFO = '' +GITINFO = "" endif ifeq ($(shell echo $(OS) | egrep -c 'Darwin|FreeBSD|OpenBSD'),1) @@ -167,6 +167,9 @@ install: sdist: clean docs $(PYTHON) setup.py sdist +sdist_upload: clean docs + $(PYTHON) setup.py sdist upload 2>&1 |tee upload.log + rpmcommon: $(MANPAGES) sdist @mkdir -p rpm-build @cp dist/*.gz rpm-build/ diff --git a/README.md b/README.md index cec8ccca97..2e1f15559d 100644 --- a/README.md +++ b/README.md @@ -55,3 +55,4 @@ Ansible was created by [Michael DeHaan](https://github.com/mpdehaan) (michael.de Ansible is sponsored by [Ansible, Inc](http://ansible.com) + diff --git a/RELEASES.txt b/RELEASES.txt index 035b81dc71..cd32b0cddb 100644 --- a/RELEASES.txt +++ b/RELEASES.txt @@ -4,7 +4,7 @@ Ansible Releases at a Glance Active Development ++++++++++++++++++ -2.0 "TBD" - in progress +2.0 "Over the Hills and Far Away" - in progress Released ++++++++ diff --git a/VERSION b/VERSION index d05cb3d448..7ec1d6db40 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.0 0.5.beta3 +2.1.0 diff --git a/ansible-core-sitemap.xml b/ansible-core-sitemap.xml new file mode 100644 index 0000000000..84a048d311 --- /dev/null +++ b/ansible-core-sitemap.xml @@ -0,0 +1,2716 @@ + + + + + + http://docs.ansible.com/ansible/ + weekly + 1.0 + + + http://docs.ansible.com/ansible/intro_patterns.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/intro_adhoc.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/intro_configuration.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/intro_getting_started.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/intro.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/intro_inventory.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/intro_installation.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/intro_bsd.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/intro_dynamic_inventory.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/intro_windows.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_filters.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_conditionals.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/quickstart.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_loops.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_variables.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_roles.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_intro.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_blocks.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_async.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_checkmode.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/become.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_acceleration.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_best_practices.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_delegation.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_special_topics.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_strategies.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_environment.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_error_handling.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_prompts.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/modules_intro.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_tags.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_lookups.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_vault.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/playbooks_startnstep.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/modules_core.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/modules_extra.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_commands_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/common_return_values.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/modules_by_category.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_cloud_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_all_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_clustering_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_database_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_files_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_inventory_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_source_control_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_system_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_utilities_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_monitoring_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_notification_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_messaging_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_network_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_packaging_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_web_infrastructure_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/guide_cloudstack.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/guide_vagrant.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/guides.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/guide_gce.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/list_of_windows_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/guide_aws.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/guide_rax.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/guide_rolling_upgrade.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/developing.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/developing_releases.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/tower.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/developing_inventory.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/developing_test_pr.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/developing_plugins.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/community.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/developing_api.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/developing_modules.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/test_strategies.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/glossary.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/galaxy.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/faq.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/YAMLSyntax.html + weekly + 0.5 + + + http://docs.ansible.com/ansible/index.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/command_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/shell_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/playbooks_filters_ipaddr.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/expect_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/script_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/raw_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/znode_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/xenserver_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cloudtrail_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cloudformation_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/dynamodb_table_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_ami_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_ami_copy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_elb_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_ami_find_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_eip_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_elb_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_asg_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_eni_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_elb_lb_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_eni_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_key_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_lc_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_tag_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_scaling_policy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_metric_alarm_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_snapshot_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_remote_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_vpc_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_vol_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_vpc_igw_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_vpc_subnet_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_vpc_net_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_vpc_net_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_vpc_route_table_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_win_password_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_vpc_route_table_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_vpc_subnet_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ecs_cluster_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/iam_cert_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ecs_taskdefinition_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ecs_task_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/elasticache_subnet_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/iam_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/elasticache_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/iam_policy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rds_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/route53_zone_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rds_subnet_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/route53_health_check_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/route53_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rds_param_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/route53_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/s3_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/sts_assume_role_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/s3_bucket_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/s3_lifecycle_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/sns_topic_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/s3_logging_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/sqs_queue_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/azure_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/clc_aa_policy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/clc_modify_server_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/clc_alert_policy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/clc_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/clc_publicip_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/clc_firewall_policy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/clc_blueprint_package_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/clc_loadbalancer_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/clc_server_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_firewall_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_instance_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/clc_server_snapshot_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_affinitygroup_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_domain_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_account_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_instancegroup_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_iso_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_project_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_ip_address_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_securitygroup_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_loadbalancer_rule_member_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_loadbalancer_rule_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_network_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_portforward_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_securitygroup_rule_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_sshkeypair_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_template_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_staticnat_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/digital_ocean_domain_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_vmsnapshot_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/digital_ocean_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_volume_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cs_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/docker_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/digital_ocean_sshkey_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/docker_login_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/gce_net_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/gce_pd_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/gc_storage_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/docker_image_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/gce_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/gce_lb_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/gce_img_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/gce_tag_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/linode_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/virt_net_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/virt_pool_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_auth_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ovirt_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/lxc_container_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/virt_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/proxmox_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/proxmox_template_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_client_config_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_floating_ip_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_network_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_networks_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_image_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_ironic_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_image_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_ironic_node_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_keypair_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_nova_flavor_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_security_group_rule_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_server_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_server_actions_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_object_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_project_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_security_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_server_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_router_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_port_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_server_volume_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/profitbricks_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/profitbricks_datacenter_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_subnets_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_subnet_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_volume_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/os_user_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/profitbricks_nic_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_cdb_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_cdb_database_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/profitbricks_volume_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/profitbricks_volume_attachments_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_cbs_attachments_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_cdb_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_cbs_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_files_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_files_objects_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_clb_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_dns_record_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_clb_nodes_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_dns_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_identity_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_mon_entity_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_mon_notification_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_mon_notification_plan_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_clb_ssl_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_meta_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_keypair_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_mon_check_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_network_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_mon_alarm_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_queue_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_scaling_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vca_vapp_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vca_nat_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rax_scaling_policy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vca_fw_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_dvswitch_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_cluster_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_host_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_dns_config_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_datacenter_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_dvs_host_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_dvs_portgroup_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_target_canonical_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_migrate_vmk_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_vmkernel_ip_config_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_vswitch_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vsphere_copy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_vm_shell_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_vsan_cluster_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_vmkernel_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vmware_vm_vss_dvs_migrate_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vsphere_guest_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/zypper_repository_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/a10_server_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/a10_service_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/webfaction_db_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/webfaction_domain_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/a10_virtual_server_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/webfaction_app_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/webfaction_site_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/webfaction_mailbox_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/accelerate_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/apache2_module_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/apt_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/acl_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/alternatives_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/airbrake_deployment_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/add_host_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/apt_key_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/apk_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/at_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/authorized_key_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/apt_repository_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/assemble_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/apt_rpm_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/assert_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/async_status_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bigip_gtm_wide_ip_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bigip_pool_member_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bigip_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bigip_monitor_http_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bigpanda_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bower_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bigip_monitor_tcp_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bigip_node_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bigip_pool_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bundler_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/boundary_meter_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/blockinfile_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/consul_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/consul_acl_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/consul_kv_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/campfire_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/composer_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/bzr_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/circonus_annotation_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/capabilities_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/consul_session_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/datadog_event_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/datadog_monitor_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/debconf_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/copy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cronvar_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cpanm_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/cron_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/debug_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/crypttab_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/deploy_helper_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/django_manage_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/dnf_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/dpkg_selections_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/dnsmadeeasy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/dnsimple_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/fail_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/easy_install_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/fetch_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ec2_ami_search_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ejabberd_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/filesystem_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/facter_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/elasticsearch_plugin_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/firewalld_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/file_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/get_url_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/find_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/flowdock_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/git_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/fireball_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/gem_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/getent_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/gluster_volume_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/github_hooks_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/hall_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/hg_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/glance_image_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/hipchat_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/grove_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/group_by_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/haproxy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/homebrew_cask_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/homebrew_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ini_file_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/homebrew_tap_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/irc_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/hostname_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/htpasswd_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/include_vars_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ipify_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/jabber_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/iptables_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/known_hosts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/jboss_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/librato_annotation_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/kernel_blacklist_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/keystone_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/jira_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/layman_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/lvol_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/lineinfile_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/macports_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/logentries_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/locale_gen_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/lvg_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/maven_artifact_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/lldp_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/mail_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/mqtt_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/modprobe_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/mount_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/mongodb_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/mysql_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/monit_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/mysql_db_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/mysql_replication_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/mysql_variables_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/nmcli_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/netscaler_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/nagios_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/newrelic_deployment_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/nexmo_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/nova_compute_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/openvswitch_bridge_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/openvswitch_db_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/openvswitch_port_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ohai_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/npm_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/open_iscsi_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/openbsd_pkg_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/opkg_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/nova_keypair_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pagerduty_alert_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pam_limits_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/patch_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/osx_say_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pacman_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/osx_defaults_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/package_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pagerduty_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pause_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pkg5_publisher_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pear_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pkgin_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pingdom_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pkg5_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ping_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pip_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pkgutil_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/postgresql_lang_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pkgng_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/portage_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/postgresql_privs_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/portinstall_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pushbullet_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/postgresql_db_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/postgresql_ext_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/puppet_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/postgresql_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/quantum_network_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/pushover_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/quantum_router_interface_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/quantum_floating_ip_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/quantum_floating_ip_associate_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rabbitmq_binding_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/quantum_router_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/quantum_router_gateway_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rabbitmq_policy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/quantum_subnet_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rabbitmq_vhost_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rabbitmq_plugin_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rabbitmq_exchange_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rabbitmq_queue_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rabbitmq_parameter_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/redhat_subscription_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rabbitmq_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/riak_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rpm_key_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/seboolean_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rollbar_deployment_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/redis_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rhn_channel_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/rhn_register_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/replace_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/selinux_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/set_fact_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/setup_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/slack_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/sendgrid_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/seport_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/slackpkg_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/sensu_check_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/service_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/selinux_permissive_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/stat_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/subversion_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/slurp_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/supervisorctl_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/solaris_zone_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/sns_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/stackdriver_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/svr4pkg_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/snmp_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/svc_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/twilio_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/swdepot_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/unarchive_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/template_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/sysctl_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/synchronize_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/uptimerobot_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/typetalk_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/ufw_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/uri_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vertica_role_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/urpmi_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vertica_facts_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vertica_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vertica_configuration_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/vertica_schema_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_dotnet_ngen_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/wait_for_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_feature_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_copy_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_chocolatey_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_firewall_rule_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_environment_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_acl_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_file_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_get_url_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_iis_webbinding_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_lineinfile_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_msi_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_iis_webapplication_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_iis_website_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_iis_virtualdirectory_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_iis_webapppool_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_nssm_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_stat_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_template_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_unzip_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_ping_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_package_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_regedit_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_updates_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_service_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_scheduled_task_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_user_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/zabbix_group_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/zabbix_hostmacro_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/win_webpicmd_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/xattr_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/yum_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/yumrepo_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/zabbix_host_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/zabbix_maintenance_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/zypper_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/zabbix_screen_module.html + weekly + 0.3 + + + http://docs.ansible.com/ansible/zfs_module.html + weekly + 0.3 + + + \ No newline at end of file diff --git a/bin/ansible b/bin/ansible index 7e1aa01a93..627510a72e 100755 --- a/bin/ansible +++ b/bin/ansible @@ -60,6 +60,7 @@ if __name__ == '__main__': try: display = Display() + display.debug("starting run") sub = None try: diff --git a/contrib/inventory/libvirt_lxc.py b/contrib/inventory/libvirt_lxc.py index 1491afd577..cb34d473cd 100755 --- a/contrib/inventory/libvirt_lxc.py +++ b/contrib/inventory/libvirt_lxc.py @@ -27,11 +27,11 @@ result['all'] = {} pipe = Popen(['virsh', '-q', '-c', 'lxc:///', 'list', '--name', '--all'], stdout=PIPE, universal_newlines=True) result['all']['hosts'] = [x[:-1] for x in pipe.stdout.readlines()] result['all']['vars'] = {} -result['all']['vars']['ansible_connection'] = 'lxc' +result['all']['vars']['ansible_connection'] = 'libvirt_lxc' if len(sys.argv) == 2 and sys.argv[1] == '--list': print(json.dumps(result)) elif len(sys.argv) == 3 and sys.argv[1] == '--host': - print(json.dumps({'ansible_connection': 'lxc'})) + print(json.dumps({'ansible_connection': 'libvirt_lxc'})) else: print("Need an argument, either --list or --host ") diff --git a/contrib/inventory/nsot.py b/contrib/inventory/nsot.py new file mode 100644 index 0000000000..0ca1625df3 --- /dev/null +++ b/contrib/inventory/nsot.py @@ -0,0 +1,341 @@ +#!/bin/env python + +''' +nsot +==== + +Ansible Dynamic Inventory to pull hosts from NSoT, a flexible CMDB by Dropbox + +Features +-------- + +* Define host groups in form of NSoT device attribute criteria + +* All parameters defined by the spec as of 2015-09-05 are supported. + + + ``--list``: Returns JSON hash of host groups -> hosts and top-level + ``_meta`` -> ``hostvars`` which correspond to all device attributes. + + Group vars can be specified in the YAML configuration, noted below. + + + ``--host ``: Returns JSON hash where every item is a device + attribute. + +* In addition to all attributes assigned to resource being returned, script + will also append ``site_id`` and ``id`` as facts to utilize. + + +Confguration +------------ + +Since it'd be annoying and failure prone to guess where you're configuration +file is, use ``NSOT_INVENTORY_CONFIG`` to specify the path to it. + +This file should adhere to the YAML spec. All top-level variable must be +desired Ansible group-name hashed with single 'query' item to define the NSoT +attribute query. + +Queries follow the normal NSoT query syntax, `shown here`_ + +.. _shown here: https://github.com/dropbox/pynsot#set-queries + +.. code:: yaml + + routers: + query: 'deviceType=ROUTER' + vars: + a: b + c: d + + juniper_fw: + query: 'deviceType=FIREWALL manufacturer=JUNIPER' + + not_f10: + query: '-manufacturer=FORCE10' + +The inventory will automatically use your ``.pynsotrc`` like normal pynsot from +cli would, so make sure that's configured appropriately. + +.. note:: + + Attributes I'm showing above are influenced from ones that the Trigger + project likes. As is the spirit of NSoT, use whichever attributes work best + for your workflow. + +If config file is blank or absent, the following default groups will be +created: + +* ``routers``: deviceType=ROUTER +* ``switches``: deviceType=SWITCH +* ``firewalls``: deviceType=FIREWALL + +These are likely not useful for everyone so please use the configuration. :) + +.. note:: + + By default, resources will only be returned for what your default + site is set for in your ``~/.pynsotrc``. + + If you want to specify, add an extra key under the group for ``site: n``. + +Output Examples +--------------- + +Here are some examples shown from just calling the command directly:: + + $ NSOT_INVENTORY_CONFIG=$PWD/test.yaml ansible_nsot --list | jq '.' + { + "routers": { + "hosts": [ + "test1.example.com" + ], + "vars": { + "cool_level": "very", + "group": "routers" + } + }, + "firewalls": { + "hosts": [ + "test2.example.com" + ], + "vars": { + "cool_level": "enough", + "group": "firewalls" + } + }, + "_meta": { + "hostvars": { + "test2.example.com": { + "make": "SRX", + "site_id": 1, + "id": 108 + }, + "test1.example.com": { + "make": "MX80", + "site_id": 1, + "id": 107 + } + } + }, + "rtr_and_fw": { + "hosts": [ + "test1.example.com", + "test2.example.com" + ], + "vars": {} + } + } + + + $ NSOT_INVENTORY_CONFIG=$PWD/test.yaml ansible_nsot --host test1 | jq '.' + { + "make": "MX80", + "site_id": 1, + "id": 107 + } + +''' + +from __future__ import print_function +import sys +import os +import pkg_resources +import argparse +import json +import yaml +from textwrap import dedent +from pynsot.client import get_api_client +from pynsot.app import HttpServerError +from click.exceptions import UsageError + + +def warning(*objs): + print("WARNING: ", *objs, file=sys.stderr) + + +class NSoTInventory(object): + '''NSoT Client object for gather inventory''' + + def __init__(self): + self.config = dict() + config_env = os.environ.get('NSOT_INVENTORY_CONFIG') + if config_env: + try: + config_file = os.path.abspath(config_env) + except IOError: # If file non-existent, use default config + self._config_default() + except Exception as e: + sys.exit('%s\n' % e) + + with open(config_file) as f: + try: + self.config.update(yaml.safe_load(f)) + except TypeError: # If empty file, use default config + warning('Empty config file') + self._config_default() + except Exception as e: + sys.exit('%s\n' % e) + else: # Use defaults if env var missing + self._config_default() + self.groups = self.config.keys() + self.client = get_api_client() + self._meta = {'hostvars': dict()} + + def _config_default(self): + default_yaml = ''' + --- + routers: + query: deviceType=ROUTER + switches: + query: deviceType=SWITCH + firewalls: + query: deviceType=FIREWALL + ''' + self.config = yaml.safe_load(dedent(default_yaml)) + + def do_list(self): + '''Direct callback for when ``--list`` is provided + + Relies on the configuration generated from init to run + _inventory_group() + ''' + inventory = dict() + for group, contents in self.config.iteritems(): + group_response = self._inventory_group(group, contents) + inventory.update(group_response) + inventory.update({'_meta': self._meta}) + return json.dumps(inventory) + + def do_host(self, host): + return json.dumps(self._hostvars(host)) + + def _hostvars(self, host): + '''Return dictionary of all device attributes + + Depending on number of devices in NSoT, could be rather slow since this + has to request every device resource to filter through + ''' + device = [i for i in self.client.devices.get()['data']['devices'] + if host in i['hostname']][0] + attributes = device['attributes'] + attributes.update({'site_id': device['site_id'], 'id': device['id']}) + return attributes + + def _inventory_group(self, group, contents): + '''Takes a group and returns inventory for it as dict + + :param group: Group name + :type group: str + :param contents: The contents of the group's YAML config + :type contents: dict + + contents param should look like:: + + { + 'query': 'xx', + 'vars': + 'a': 'b' + } + + Will return something like:: + + { group: { + hosts: [], + vars: {}, + } + ''' + query = contents.get('query') + hostvars = contents.get('vars', dict()) + site = contents.get('site', dict()) + obj = {group: dict()} + obj[group]['hosts'] = [] + obj[group]['vars'] = hostvars + try: + assert isinstance(query, basestring) + except: + sys.exit('ERR: Group queries must be a single string\n' + ' Group: %s\n' + ' Query: %s\n' % (group, query) + ) + try: + if site: + site = self.client.sites(site) + devices = site.devices.query.get(query=query) + else: + devices = self.client.devices.query.get(query=query) + except HttpServerError as e: + if '500' in str(e.response): + _site = 'Correct site id?' + _attr = 'Queried attributes actually exist?' + questions = _site + '\n' + _attr + sys.exit('ERR: 500 from server.\n%s' % questions) + else: + raise + except UsageError: + sys.exit('ERR: Could not connect to server. Running?') + + # Would do a list comprehension here, but would like to save code/time + # and also acquire attributes in this step + for host in devices['data']['devices']: + # Iterate through each device that matches query, assign hostname + # to the group's hosts array and then use this single iteration as + # a chance to update self._meta which will be used in the final + # return + hostname = host['hostname'] + obj[group]['hosts'].append(hostname) + attributes = host['attributes'] + attributes.update({'site_id': host['site_id'], 'id': host['id']}) + self._meta['hostvars'].update({hostname: attributes}) + + return obj + + +def parse_args(): + desc = __doc__.splitlines()[4] # Just to avoid being redundant + + # Establish parser with options and error out if no action provided + parser = argparse.ArgumentParser( + description=desc, + conflict_handler='resolve', + ) + + # Arguments + # + # Currently accepting (--list | -l) and (--host | -h) + # These must not be allowed together + parser.add_argument( + '--list', '-l', + help='Print JSON object containing hosts to STDOUT', + action='store_true', + dest='list_', # Avoiding syntax highlighting for list + ) + + parser.add_argument( + '--host', '-h', + help='Print JSON object containing hostvars for ', + action='store', + ) + args = parser.parse_args() + + if not args.list_ and not args.host: # Require at least one option + parser.exit(status=1, message='No action requested') + + if args.list_ and args.host: # Do not allow multiple options + parser.exit(status=1, message='Too many actions requested') + + return args + + +def main(): + '''Set up argument handling and callback routing''' + args = parse_args() + client = NSoTInventory() + + # Callback condition + if args.list_: + print(client.do_list()) + elif args.host: + print(client.do_host(args.host)) + +if __name__ == '__main__': + main() diff --git a/contrib/inventory/nsot.yaml b/contrib/inventory/nsot.yaml new file mode 100644 index 0000000000..ebddbc8234 --- /dev/null +++ b/contrib/inventory/nsot.yaml @@ -0,0 +1,22 @@ +--- +juniper_routers: + query: 'deviceType=ROUTER manufacturer=JUNIPER' + vars: + group: juniper_routers + netconf: true + os: junos + +cisco_asa: + query: 'manufacturer=CISCO deviceType=FIREWALL' + vars: + group: cisco_asa + routed_vpn: false + stateful: true + +old_cisco_asa: + query: 'manufacturer=CISCO deviceType=FIREWALL -softwareVersion=8.3+' + vars: + old_nat: true + +not_f10: + query: '-manufacturer=FORCE10' diff --git a/contrib/inventory/openstack.py b/contrib/inventory/openstack.py index 46b43e9221..b82a042c29 100755 --- a/contrib/inventory/openstack.py +++ b/contrib/inventory/openstack.py @@ -32,6 +32,13 @@ # all of them and present them as one contiguous inventory. # # See the adjacent openstack.yml file for an example config file +# There are two ansible inventory specific options that can be set in +# the inventory section. +# expand_hostvars controls whether or not the inventory will make extra API +# calls to fill out additional information about each server +# use_hostnames changes the behavior from registering every host with its UUID +# and making a group of its hostname to only doing this if the +# hostname in question has more than one server import argparse import collections @@ -51,7 +58,7 @@ import shade.inventory CONFIG_FILES = ['/etc/ansible/openstack.yaml'] -def get_groups_from_server(server_vars): +def get_groups_from_server(server_vars, namegroup=True): groups = [] region = server_vars['region'] @@ -76,7 +83,8 @@ def get_groups_from_server(server_vars): groups.append(extra_group) groups.append('instance-%s' % server_vars['id']) - groups.append(server_vars['name']) + if namegroup: + groups.append(server_vars['name']) for key in ('flavor', 'image'): if 'name' in server_vars[key]: @@ -94,9 +102,9 @@ def get_groups_from_server(server_vars): return groups -def get_host_groups(inventory): +def get_host_groups(inventory, refresh=False): (cache_file, cache_expiration_time) = get_cache_settings() - if is_cache_stale(cache_file, cache_expiration_time): + if is_cache_stale(cache_file, cache_expiration_time, refresh=refresh): groups = to_json(get_host_groups_from_cloud(inventory)) open(cache_file, 'w').write(groups) else: @@ -106,23 +114,44 @@ def get_host_groups(inventory): def get_host_groups_from_cloud(inventory): groups = collections.defaultdict(list) + firstpass = collections.defaultdict(list) hostvars = {} - for server in inventory.list_hosts(): + list_args = {} + if hasattr(inventory, 'extra_config'): + use_hostnames = inventory.extra_config['use_hostnames'] + list_args['expand'] = inventory.extra_config['expand_hostvars'] + else: + use_hostnames = False + + for server in inventory.list_hosts(**list_args): if 'interface_ip' not in server: continue - for group in get_groups_from_server(server): - groups[group].append(server['id']) - hostvars[server['id']] = dict( - ansible_ssh_host=server['interface_ip'], - openstack=server, - ) + firstpass[server['name']].append(server) + for name, servers in firstpass.items(): + if len(servers) == 1 and use_hostnames: + server = servers[0] + hostvars[name] = dict( + ansible_ssh_host=server['interface_ip'], + openstack=server) + for group in get_groups_from_server(server, namegroup=False): + groups[group].append(server['name']) + else: + for server in servers: + server_id = server['id'] + hostvars[server_id] = dict( + ansible_ssh_host=server['interface_ip'], + openstack=server) + for group in get_groups_from_server(server, namegroup=True): + groups[group].append(server_id) groups['_meta'] = {'hostvars': hostvars} return groups -def is_cache_stale(cache_file, cache_expiration_time): +def is_cache_stale(cache_file, cache_expiration_time, refresh=False): ''' Determines if cache file has expired, or if it is still valid ''' + if refresh: + return True if os.path.isfile(cache_file): mod_time = os.path.getmtime(cache_file) current_time = time.time() @@ -169,14 +198,24 @@ def main(): try: config_files = os_client_config.config.CONFIG_FILES + CONFIG_FILES shade.simple_logging(debug=args.debug) - inventory = shade.inventory.OpenStackInventory( + inventory_args = dict( refresh=args.refresh, config_files=config_files, private=args.private, ) + if hasattr(shade.inventory.OpenStackInventory, 'extra_config'): + inventory_args.update(dict( + config_key='ansible', + config_defaults={ + 'use_hostnames': False, + 'expand_hostvars': True, + } + )) + + inventory = shade.inventory.OpenStackInventory(**inventory_args) if args.list: - output = get_host_groups(inventory) + output = get_host_groups(inventory, refresh=args.refresh) elif args.host: output = to_json(inventory.get_host(args.host)) print(output) diff --git a/contrib/inventory/openstack.yml b/contrib/inventory/openstack.yml index a99bb02058..1520e2937e 100644 --- a/contrib/inventory/openstack.yml +++ b/contrib/inventory/openstack.yml @@ -26,3 +26,6 @@ clouds: username: stack password: stack project_name: stack +ansible: + use_hostnames: True + expand_hostvars: False diff --git a/contrib/inventory/rax.ini b/contrib/inventory/rax.ini index 5a269e16a3..15948e7b2e 100644 --- a/contrib/inventory/rax.ini +++ b/contrib/inventory/rax.ini @@ -55,3 +55,12 @@ # will be ignored, and 4 will be used. Accepts a comma separated list, # the first found wins. # access_ip_version = 4 + +# Environment Variable: RAX_CACHE_MAX_AGE +# Default: 600 +# +# A configuration the changes the behavior or the inventory cache. +# Inventory listing performed before this value will be returned from +# the cache instead of making a full request for all inventory. Setting +# this value to 0 will force a full request. +# cache_max_age = 600 \ No newline at end of file diff --git a/contrib/inventory/rax.py b/contrib/inventory/rax.py index 0028f54d20..4ac6b0f47e 100755 --- a/contrib/inventory/rax.py +++ b/contrib/inventory/rax.py @@ -355,9 +355,12 @@ def get_cache_file_path(regions): def _list(regions, refresh_cache=True): + cache_max_age = int(get_config(p, 'rax', 'cache_max_age', + 'RAX_CACHE_MAX_AGE', 600)) + if (not os.path.exists(get_cache_file_path(regions)) or refresh_cache or - (time() - os.stat(get_cache_file_path(regions))[-1]) > 600): + (time() - os.stat(get_cache_file_path(regions))[-1]) > cache_max_age): # Cache file doesn't exist or older than 10m or refresh cache requested _list_into_cache(regions) diff --git a/docs/man/man1/ansible-galaxy.1.asciidoc.in b/docs/man/man1/ansible-galaxy.1.asciidoc.in index e6f2d0b456..9ffe65e45a 100644 --- a/docs/man/man1/ansible-galaxy.1.asciidoc.in +++ b/docs/man/man1/ansible-galaxy.1.asciidoc.in @@ -12,7 +12,7 @@ ansible-galaxy - manage roles using galaxy.ansible.com SYNOPSIS -------- -ansible-galaxy [init|info|install|list|remove] [--help] [options] ... +ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ... DESCRIPTION @@ -20,7 +20,7 @@ DESCRIPTION *Ansible Galaxy* is a shared repository for Ansible roles. The ansible-galaxy command can be used to manage these roles, -or by creating a skeleton framework for roles you'd like to upload to Galaxy. +or for creating a skeleton framework for roles you'd like to upload to Galaxy. COMMON OPTIONS -------------- @@ -29,7 +29,6 @@ COMMON OPTIONS Show a help message related to the given sub-command. - INSTALL ------- @@ -145,6 +144,204 @@ The path to the directory containing your roles. The default is the *roles_path* configured in your *ansible.cfg* file (/etc/ansible/roles if not configured) +SEARCH +------ + +The *search* sub-command returns a filtered list of roles found on the remote +server. + + +USAGE +~~~~~ + +$ ansible-galaxy search [options] [searchterm1 searchterm2] + + +OPTIONS +~~~~~~~ +*--galaxy-tags*:: + +Provide a comma separated list of Galaxy Tags on which to filter. + +*--platforms*:: + +Provide a comma separated list of Platforms on which to filter. + +*--author*:: + +Specify the username of a Galaxy contributor on which to filter. + +*-c*, *--ignore-certs*:: + +Ignore TLS certificate errors. + +*-s*, *--server*:: + +Override the default server https://galaxy.ansible.com. + + +INFO +---- + +The *info* sub-command shows detailed information for a specific role. +Details returned about the role included information from the local copy +as well as information from galaxy.ansible.com. + +USAGE +~~~~~ + +$ ansible-galaxy info [options] role_name[, version] + +OPTIONS +~~~~~~~ + +*-p* 'ROLES_PATH', *--roles-path=*'ROLES_PATH':: + +The path to the directory containing your roles. The default is the *roles_path* +configured in your *ansible.cfg* file (/etc/ansible/roles if not configured) + +*-c*, *--ignore-certs*:: + +Ignore TLS certificate errors. + +*-s*, *--server*:: + +Override the default server https://galaxy.ansible.com. + + +LOGIN +----- + +The *login* sub-command is used to authenticate with galaxy.ansible.com. +Authentication is required to use the import, delete and setup commands. +It will authenticate the user, retrieve a token from Galaxy, and store it +in the user's home directory. + +USAGE +~~~~~ + +$ ansible-galaxy login [options] + +The *login* sub-command prompts for a *GitHub* username and password. It does +NOT send your password to Galaxy. It actually authenticates with GitHub and +creates a personal access token. It then sends the personal access token to +Galaxy, which in turn verifies that you are you and returns a Galaxy access +token. After authentication completes the *GitHub* personal access token is +destroyed. + +If you do not wish to use your GitHub password, or if you have two-factor +authentication enabled with GitHub, use the *--github-token* option to pass a +personal access token that you create. Log into GitHub, go to Settings and +click on Personal Access Token to create a token. + +OPTIONS +~~~~~~~ + +*-c*, *--ignore-certs*:: + +Ignore TLS certificate errors. + +*-s*, *--server*:: + +Override the default server https://galaxy.ansible.com. + +*--github-token*:: + +Authenticate using a *GitHub* personal access token rather than a password. + + +IMPORT +------ + +Import a role from *GitHub* to galaxy.ansible.com. Requires the user first +authenticate with galaxy.ansible.com using the *login* subcommand. + +USAGE +~~~~~ + +$ ansible-galaxy import [options] github_user github_repo + +OPTIONS +~~~~~~~ +*-c*, *--ignore-certs*:: + +Ignore TLS certificate errors. + +*-s*, *--server*:: + +Override the default server https://galaxy.ansible.com. + +*--branch*:: + +Provide a specific branch to import. When a branch is not specified the +branch found in meta/main.yml is used. If no branch is specified in +meta/main.yml, the repo's default branch (usually master) is used. + + +DELETE +------ + +The *delete* sub-command will delete a role from galaxy.ansible.com. Requires +the user first authenticate with galaxy.ansible.com using the *login* subcommand. + +USAGE +~~~~~ + +$ ansible-galaxy delete [options] github_user github_repo + +OPTIONS +~~~~~~~ + +*-c*, *--ignore-certs*:: + +Ignore TLS certificate errors. + +*-s*, *--server*:: + +Override the default server https://galaxy.ansible.com. + + +SETUP +----- + +The *setup* sub-command creates an integration point for *Travis CI*, enabling +galaxy.ansible.com to receive notifications from *Travis* on build completion. +Requires the user first authenticate with galaxy.ansible.com using the *login* +subcommand. + +USAGE +~~~~~ + +$ ansible-galaxy setup [options] source github_user github_repo secret + +* Use *travis* as the source value. In the future additional source values may + be added. + +* Provide your *Travis* user token as the secret. The token is not stored by + galaxy.ansible.com. A hash is created using github_user, github_repo + and your token. The hash value is what actually gets stored. + +OPTIONS +~~~~~~~ + +*-c*, *--ignore-certs*:: + +Ignore TLS certificate errors. + +*-s*, *--server*:: + +Override the default server https://galaxy.ansible.com. + +--list:: + +Show your configured integrations. Provids the ID of each integration +which can be used with the remove option. + +--remove:: + +Remove a specific integration. Provide the ID of the integration to +be removed. + AUTHOR ------ diff --git a/docs/man/man1/ansible-playbook.1.asciidoc.in b/docs/man/man1/ansible-playbook.1.asciidoc.in index 5686162f21..82181982fb 100644 --- a/docs/man/man1/ansible-playbook.1.asciidoc.in +++ b/docs/man/man1/ansible-playbook.1.asciidoc.in @@ -96,7 +96,7 @@ Show help page and exit *-i* 'PATH', *--inventory=*'PATH':: The 'PATH' to the inventory, which defaults to '/etc/ansible/hosts'. -Alternatively you can use a comma separated list of hosts or single host with traling comma 'host,'. +Alternatively, you can use a comma-separated list of hosts or a single host with a trailing comma 'host,'. *-l* 'SUBSET', *--limit=*'SUBSET':: diff --git a/docs/man/man1/ansible-pull.1.asciidoc.in b/docs/man/man1/ansible-pull.1.asciidoc.in index 333b8e34e0..0afba2aeaa 100644 --- a/docs/man/man1/ansible-pull.1.asciidoc.in +++ b/docs/man/man1/ansible-pull.1.asciidoc.in @@ -95,6 +95,10 @@ Force running of playbook even if unable to update playbook repository. This can be useful, for example, to enforce run-time state when a network connection may not always be up or possible. +*--full*:: + +Do a full clone of the repository. By default ansible-pull will do a shallow clone based on the last revision. + *-h*, *--help*:: Show the help message and exit. diff --git a/docsite/Makefile b/docsite/Makefile index 92129f7851..2b87827c59 100644 --- a/docsite/Makefile +++ b/docsite/Makefile @@ -20,6 +20,8 @@ viewdocs: clean staticmin htmldocs: staticmin ./build-site.py rst +webdocs: htmldocs + clean: -rm -rf htmlout -rm -f .buildinfo @@ -43,4 +45,4 @@ modules: $(FORMATTER) ../hacking/templates/rst.j2 PYTHONPATH=../lib $(FORMATTER) -t rst --template-dir=../hacking/templates --module-dir=../lib/ansible/modules -o rst/ staticmin: - cat _themes/srtd/static/css/theme.css | sed -e 's/^[ \t]*//g; s/[ \t]*$$//g; s/\([:{;,]\) /\1/g; s/ {/{/g; s/\/\*.*\*\///g; /^$$/d' | sed -e :a -e '$$!N; s/\n\(.\)/\1/; ta' > _themes/srtd/static/css/theme.min.css + cat _themes/srtd/static/css/theme.css | sed -e 's/^[ ]*//g; s/[ ]*$$//g; s/\([:{;,]\) /\1/g; s/ {/{/g; s/\/\*.*\*\///g; /^$$/d' | sed -e :a -e '$$!N; s/\n\(.\)/\1/; ta' > _themes/srtd/static/css/theme.min.css diff --git a/docsite/_themes/srtd/footer.html b/docsite/_themes/srtd/footer.html index b70cfde7ad..dc1d70a4d1 100644 --- a/docsite/_themes/srtd/footer.html +++ b/docsite/_themes/srtd/footer.html @@ -12,8 +12,17 @@
+ +

- © Copyright 2015 Ansible, Inc.. + © Copyright 2016 Ansible, Inc.. {%- if last_updated %} {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %} diff --git a/docsite/_themes/srtd/layout.html b/docsite/_themes/srtd/layout.html index f4d7a8a536..cb532191e6 100644 --- a/docsite/_themes/srtd/layout.html +++ b/docsite/_themes/srtd/layout.html @@ -150,11 +150,6 @@ -

-