Compare commits

...

416 Commits

Author SHA1 Message Date
e946c4b3b7 New release v2.4.1.0-1 2017-10-25 13:33:18 -07:00
5a678367d8 reverse order of release numbers
(cherry picked from commit d7d1402bb7)
2017-10-25 13:24:24 -07:00
a5057519dd Update release and maint for new release
(cherry picked from commit cf2c22770a)
2017-10-25 12:53:06 -07:00
dba43ff3d5 Update packaging versions.yml with the info from the devel branch 2017-10-25 12:42:52 -07:00
5e9054655e Add date for the 2.4.1 release 2017-10-25 12:39:47 -07:00
f8fa79818c Revert "Prefer the stdlib SSLContext over urllib3 context"
This reverts commit f48af16ddc.

Meant to push to 2.4.2
2017-10-24 07:32:33 -07:00
f48af16ddc Prefer the stdlib SSLContext over urllib3 context
We do not go through the effort of finding the right PROTOCOL setting if
we have SSLContext in the stdlib.  So we do not want to hit the code
that uses PROTOCOL to set the urllib3-provided ssl context when
SSLContext is available.  Also, the urllib3 implementation appears to
have a bug in some recent versions.  Preferring the stdlib version will
work around that for those with Python-2.7.9+ as well.

Fixes #26235
Fixes #25402
Fixes #31998

(cherry picked from commit 725ae96e1b)
2017-10-24 07:31:12 -07:00
4a4590a2c6 New release v2.4.1.0-0.4.rc2 2017-10-18 14:47:16 -07:00
3f4005038d Fix docker_secret integration test dependencies.
(cherry picked from commit eb899c9bcd)
2017-10-18 14:37:33 -07:00
d32f138f40 Fix for hostname module on RHEL7.5 added to changelog 2017-10-18 14:27:01 -07:00
7a23162ae4 hostname: fix for a new version of rhel (#31839)
Fixes #31811
(cherry picked from commit efec43dd1e)
2017-10-18 14:24:17 -07:00
05535b363f Add changelog for cherry-picks 2017-10-18 14:20:32 -07:00
13adf5dc16 Fix -M/--module-path option for ansible-doc and ansible-console (#31744)
Fixes #31743
(cherry picked from commit 9bc60cd05e)
2017-10-18 14:20:05 -07:00
d7e3665f3f fix closure issues
fixes #31786

(cherry picked from commit a26a2841ff)
2017-10-18 14:16:42 -07:00
7e6554b9ff Correct usage for shutil.rmtree (#31541)
* Correct usage for shutil.rmtree

Fix adds correct usage of shutil.rmtree in git module

Fixes: #31225

Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>

* Include archive tests so they get run

* Use new include syntax

* Cleanup syntax on git tests

- use multi-line YAML
- remove unneeded {{ }} around vars in conditionals
- remove unneeded quotes
- add task file name to task names for easier troubleshooting when things fail

* Make archive tests work for RHEL/CentOS 6

The older versions of Jinja2 in RHEL/CentOS 6 required assertion tasks using the map filter to be skipped.

The older version of git required gzip compression to be skipped on RHEL/CentOS 6.

* Account for ansible_distribution_major_version missing

(cherry picked from commit a047fe0e4c)
2017-10-18 14:14:24 -07:00
c7504d9d2f Add win_regedit fixes 2017-10-18 14:10:13 -07:00
466baba040 win_regedit: fix extra info coming into stdout (#31813)
(cherry picked from commit 888de842b3)
2017-10-18 14:09:18 -07:00
5f8a126d35 vmware_vm_facts: Add error check for config.vm (#31629)
Add a simple check to see if vm.config exists before looking for
vm.config.hardware
(cherry picked from commit 4034630625)
2017-10-18 14:07:14 -07:00
0afc3ae3ed Ensure valid_plugin_bin is defined
Fixes #31824

(cherry picked from commit 2c8382eb87)
2017-10-18 14:05:23 -07:00
a40a8c4a6e Add the documentation of backup_path to changelog 2017-10-18 14:04:27 -07:00
df85dc55fb Document backup_path (#31844)
Fix a few consistency issues at the same time
(cherry picked from commit 598084fbc8)
2017-10-18 14:03:27 -07:00
e665b2ed5e Remove the change for implicit inventory and all vars 2017-10-18 13:59:35 -07:00
d36c582787 add all group vars back to implicit localhost
fixes #31857
reverts #31425

(cherry picked from commit 7fe6a8dab7)
2017-10-18 13:58:29 -07:00
5d2f07aebb Multiple Parallels host support for ansible-test. (#31552)
(cherry picked from commit 05ec376197)
2017-10-12 11:56:48 -07:00
48fe112455 Since these changes went in after rc1, be sure to document them in the changelog
Normally I wouldn't mention test infrastructure fixes i nthe changelog
but since they're going in after rc1, I'm going to mention them just to
be safe.
2017-10-12 07:37:39 -07:00
e8d4667b87 Remove cryptography install from CI other test.
(cherry picked from commit 03e18aa52e)
2017-10-12 07:36:07 -07:00
de458be1eb New release v2.4.1.0-0.3.rc1 2017-10-11 20:19:43 -07:00
78cb32ccb7 Update Azure tests to limit cryptography version. (#31616)
(cherry picked from commit 8acb901bf2)
2017-10-11 19:19:21 -07:00
0743b577b7 Add dynamic includes fix to changelog 2017-10-11 17:32:53 -07:00
0aa1442c91 Fix static determination for include_tasks
An incorrect removal of a conditional resulted in include_tasks falling
through to the old static detection mechanism incorrectly. This restores
the previous conditional check.

Fixes #31593

(cherry picked from commit 3ef4f7e847)
2017-10-11 17:31:13 -07:00
723beb58d1 Add inventory plugin path fix to changelog 2017-10-11 17:29:34 -07:00
b1038b7903 Fix Inventory Plugin Loading (#31605)
This change makes the PluginLoader use DEFAULT_INVENTORY_PLUGIN_PATH setting.
Inventory Plugins were only being loaded the 'inventory_plugins' folder of the current directory,
as well as the ansible-provided inventory plugins (e.g. `/path/to/site-packages/ansible/plugins/inventory`).
(cherry picked from commit 0371d0deda)
2017-10-11 17:28:46 -07:00
878ed2c079 Add relative paths fix to changelog 2017-10-11 13:05:00 -07:00
6cbdc17aa1 Remove log of command executed in persistent connection (#31583)
* Remove log of command executed in persistent connection (#31581)

(cherry picked from commit 97d5e0d027)

* Update changelog
2017-10-11 19:23:47 +05:30
e001fb7c14 Fix rollback in junos_config (#31424) (#31563)
* Fix rollback in junos_config (#31424)

* Fix rollback in junos_config

Fixes #30778

*  Call `load_configuration` with rollback id in case
   the id is given as input
*  Pass rollback id to `get_diff()` to fetch diff from device

* Fix unit test

(cherry picked from commit 88da95bb77)

* Update changelog
2017-10-11 15:28:42 +05:30
daa2810410 fix paths to actually be config file relative (#31533)
* fix paths to actually be config file relative

also allow to unfrack paths for 'not cwd'
only use -i 'localhost,' for adhoc in pull
(cherry picked from commit 3886f80e44)
2017-10-10 19:17:39 -07:00
e60e70ccd6 Try to cleanup after the rpm_key test
(cherry picked from commit dde2c96d67)
2017-10-10 17:41:06 -07:00
76d84fd4d6 CHANGELOG update for become/runas error messaging 2017-10-10 16:58:14 -07:00
c1254a8108 improve become/runas error messaging on bogus/missing username (#31551)
(cherry picked from commit a4ceb4c35f)
2017-10-10 16:54:35 -07:00
50af2dc462 Add yum fix to changelog 2017-10-10 21:23:45 +02:00
b4184f9825 yum: fix crashes installing from file/url
(cherry picked from commit 24c360287e)
2017-10-10 21:20:42 +02:00
3505e5eba0 aws_s3: fix upload_file's ExtraArgs - fixes #31232 (#31487) (#31538)
* Module option metadata are extra arguments rather than S3 object metadata: update ExtraArgs variable.

* Maintain backwards compatibility by guessing at content type rather than always defaulting to binary/octet-stream.
2017-10-10 14:15:44 -04:00
d3ccca2b8d Add rpm_key fix to changelog 2017-10-10 10:59:03 -07:00
ead2fc5a64 [rpm_key] Fix to import first key on the system (#31514)
* [rpm_key] Fix to import first key on the system

Fixes: #31483

* [rpm_key] removed unsafe_shell and "throwaway" underscore

* [rpm_key] adding test to add the first key on system

(cherry picked from commit 5ccc1072ea)
2017-10-10 10:59:03 -07:00
3a0aa4ddff [cloud] Fix ec2_group when security group lacks a VPC (#31526) (#31540) 2017-10-10 13:57:16 -04:00
0e01684873 Use default values for object returned from aws to prevent TypeError (#31455)
* Use default values for object returned from aws to prevent TypeError
NoneType exception fixes #31454
(cherry picked from commit 6df6f79bbd)
2017-10-10 13:32:05 -04:00
8afa7c73df Add sysctl fix to CHANGELOG 2017-10-10 12:50:11 -04:00
60874bad3e Remove sysctl entries when state=absent (#31486)
* Remove sysctl entry when state=absent
* Cleanup sysctl integration test syntax
* Correct grammar on error message
* Add sysctl integration test for state=absent
(cherry picked from commit 2610b521bc)
2017-10-10 09:01:53 -07:00
ccd86d5a00 clarified inventory_dir changes for 2.4 (#31484)
* clarified inventory_dir changes for 2.4

added example on how to restore (mostly) old behaviour for add_hosts

fixes #30901
(cherry picked from commit dc69af50dc)
2017-10-09 20:57:14 -07:00
e5b8809ea2 Add changelog for using include/import with adhoc 2017-10-09 20:51:08 -07:00
ed1f6df9d3 better message for unsupported include/imports
adhoc cannot currently execute these actions

(cherry picked from commit 74107ff7cc)
2017-10-09 20:50:08 -07:00
Rob
9bde0acc0a [cloud] Fix #31271 - cast all tag values as strings (#31272)
* Fix #31271 - cast all tag values as strings

* Replace `str` with `to_native`

(cherry picked from commit 154191f56d)
2017-10-09 21:06:07 -04:00
d45f662a52 Add the revert of namespaced facts to the changelog 2017-10-09 16:34:24 -07:00
a59cbe5e11 revert namespaced facts changes to package/service
fixes #31485

(cherry picked from commit 4e22677e7d)
2017-10-09 16:32:27 -07:00
982e15d79e Add jimi's include_role fix to changelog 2017-10-09 13:49:41 -07:00
ef96329ae2 Template role_name when statically including via include_role (#31463)
Also trims out code which was incorrectly setting is_static=True for
include_role.

Fixes #30700
(cherry picked from commit e609618274)
2017-10-09 13:47:23 -07:00
9522309b99 updated changelog for win_copy fix 2017-10-10 06:35:00 +10:00
fe4eedf5b6 win_copy: Add missing check_mode fix (#31469)
* Add missing check_mode fix

* Refactor conditional to use the one embedded in Remove-Item

(cherry picked from commit 5bf9f271b3)
2017-10-10 06:34:10 +10:00
7f2c611dfc added toggle to control vars plugin behviour
this should allow user to control how they want the playbook dirs inspected
for additional vars, default now reverts to 2.3 behaviour (top).
corrected paths order
minor doc reword

(cherry picked from commit 7d49b27218)
2017-10-09 12:32:03 -04:00
44cd3147a0 updated changelog for ec2_win_password fix 2017-10-09 16:43:25 +10:00
60e98a3635 Fix ec2_win_password to allow blank key_passphrase (#28791)
(cherry picked from commit 74f950936a)
2017-10-09 16:42:34 +10:00
3ebde33a44 Add ping docs fix to changelog 2017-10-08 08:20:38 -07:00
991d9961ed Change ping docs to refer to win_ping (#31444)
(cherry picked from commit 4804e99b44)
2017-10-08 08:19:00 -07:00
058ed81aa0 revert ocalhost getting 'all' vars (#31425)
back to previous implicit localhost behaviour

fixes #31420

(cherry picked from commit a9942353fe)
2017-10-06 19:11:17 -04:00
4f4905c88a fix 'return false' from parse
this was abandoned early on the manger side  but seems like we left behind on plugin side.
more flexible extensions with yaml plugin
validate data correctly for yaml/constructed
fixed issue with only adding one child to keyed, the group only got the host that forced it's creation

fixes #31382
fixes #31365

(cherry picked from commit e4c61ea9a1)
2017-10-06 13:26:03 -04:00
84525576f1 Add systemd check-mode fix to changelog 2017-10-06 08:59:36 -07:00
3af3bb42e0 Do not run systemctl daemon-reload in check mode
(cherry picked from commit 7417282d37)
2017-10-06 08:58:50 -07:00
e886da782b nxos_snmp_* fixes : Fixes #30997, #30999 (#31000) (#31414)
* add codeblock to handle 5K platform for nxos_snmp_host

* fix get_snmp_traps for 5K platform

* Make shippable happy

(cherry picked from commit 48f4643a66)
2017-10-06 18:34:01 +05:30
6e03cfac6f Fixes #30846 (#30862) (#31408)
(cherry picked from commit 0218fdcd80)
2017-10-06 17:26:11 +05:30
21c9a716b6 updated changelog with win_copy fix 2017-10-06 15:25:15 +10:00
cb39aed465 win_copy: allow src to have invalid windows chars (#31392)
* win_copy: allow src to have invalid windows chars

* create file with colon instead of avoid checkout errors

(cherry picked from commit c4b51009f0)
2017-10-06 15:24:20 +10:00
d2c19eb2f1 better chown errors
(cherry picked from commit a6e27a903a)
2017-10-05 18:41:28 -04:00
e80c7d55d8 Add rpm_key and azure_rm dyn inv script fixes to changelog 2017-10-05 11:50:47 -07:00
827d7e7cc6 refactor azure dynamic inventory script configparser import to support python3 (#31370)
* refactor configparser import to support python3

* change ModuleNotFoundError to ImportError

(cherry picked from commit cb01f33d1e)
2017-10-05 11:50:10 -07:00
9bcb6f4372 Fix rpm_key absent. (#31045)
When keyid is 8 charactes long, drop_key function cuts everything
issuing an error: "package gpg-pubkey- is not installed"
(cherry picked from commit 4337b7a777)
2017-10-05 11:50:09 -07:00
b11d2289dd Add docker_secrets fix to CHANGELOG 2017-10-05 14:12:18 -04:00
bd460eee9a data should be redacted in docker_secret (#31366)
(cherry picked from commit e859d0da9c)
2017-10-05 14:09:05 -04:00
761b00c5b8 Improve and link Network Proxy docs (#31316) (#31368)
* Improve and link Network Proxy docs

It is possible for proxy issues to cause "unable to open shell", so
detail there.

Having the "how-to" in the debug page makes more sense than on the
porting page, so move it.

Fixed a few formatting issues at the same time.

* Edits

* typo

(cherry picked from commit b79d15e67f)
2017-10-05 18:51:28 +01:00
023ac17acf Add revert of alternate shells to be used by run_command into changelog 2017-10-05 10:23:28 -07:00
bc6483c96a Revert "enable run_command to use non /bin/sh shells"
This breaks output from commands in current playbooks.  Since this
change fixed a smaller use case we're going to revert this for 2.4.1 and
revisit a different fix for non /bin/sh shells for 2.5.x

This reverts commit 55135c0825.
2017-10-05 10:23:28 -07:00
b15ff222b1 Revert "only set executable from shell if not set already"
Reverted as this is a fix for 55135c0825
which is being reverted for breakage

This reverts commit e506b5da14.
2017-10-05 10:23:28 -07:00
Rob
19c6fe9a78 [cloud] Only get rules if listener in elb_application_lb been identified in compare_rules (#30604)
* Only get rules if listener has been identified in compare_rules

* Always cast the listener port to an integer.

(cherry picked from commit 7cdaa3089e)
2017-10-05 11:57:25 -04:00
25eb9154e9 Mention Ansible in package descriptions
These values are used by software updaters to show which applications
are being updates to the user. In the case of Ubuntu, it will now show
clearly that it is updating Ansible instead of a radically simple IT
automation platform.

(cherry picked from commit 95e1d91d5d)
2017-10-05 08:41:42 -07:00
2f85e78813 Add SELinux fact change to CHANGELOG 2017-10-05 09:22:10 -04:00
71e0540016 Make ansible_selinux facts a consistent type (#31065)
* Make ansible_selinux facts a consistent type

Rather than returning a bool if the Python library is missing, return a dict with one key containing a message explaining there is no way to tell the status of SELinux on the system becasue the Python library is not present.

* Fix unit test

(cherry picked from commit e7902d888c)
2017-10-05 09:19:56 -04:00
ecce2f826f nxos_config and nxos_pim_interface fix (#31343)
* fixes #31080 (#31081)

(cherry picked from commit 266c2f5831)

* nxos_config intended_config docfix (#31337)

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
(cherry picked from commit 9f72b32c5d)
2017-10-05 17:06:16 +05:30
13a86b649d Add ssh-extra-args fix to changelog 2017-10-04 23:16:03 -07:00
8ccb719dfc restore connection options from cli
fixes #30720

(cherry picked from commit bed7cd8b11)
2017-10-04 23:14:56 -07:00
6dab8b7bfa New release v2.4.1.0-0.2.beta2 2017-10-04 20:12:09 -07:00
e1fab37316 removed example for restricted facts namespace 2017-10-04 20:38:21 -04:00
eaabb33286 Avoid msrest version 0.4.15 for Azure modules.
This version has known regressions preventing modules such as
azure_rm_dnsrecordset from working.

(cherry picked from commit e167c9338c)
2017-10-04 16:00:31 -07:00
72154072bb Switch CI for OS X back to a single job. (#31265)
* Update Shippable scripts for group/non-group use.
* Switch CI for OS X back to a single job.

(cherry picked from commit 5a91ed0a3b)
2017-10-04 13:26:13 -07:00
389356d612 Run OS X and FreeBSD CI tests using groups. (#31254)
* Run OS X and FreeBSD CI tests using groups.
* Improve readability of Shippable jobs.

(cherry picked from commit 72237b63e7)
2017-10-04 13:26:13 -07:00
e25d44f97c Run all Windows tests if change detection disabled (#30320)
* Run all Windows tests if change detection disabled
* Run all Windows versions if change detection disabled

(cherry picked from commit 765718bed2)
2017-10-04 13:26:13 -07:00
75bfd4cf2f Update Windows CI groups from 2 to 3.
(cherry picked from commit c00ad0868e)
2017-10-04 13:26:13 -07:00
8281627d43 We want the ini and env vars to both override in the same order
There's an ssh version and a generic version.  We want the ssh version
to override the generic version in both cases.

(cherry picked from commit 52497920fa)
2017-10-04 13:07:20 -07:00
327f76f8fd Add any_errors_fatal fix to changelog 2017-10-04 12:56:18 -07:00
72148b358d Allow any_errors_fatal to be set in playbook - fixes #30691 (#30839)
* Allow any_errors_fatal to be set in playbook.
* Default to the config file value for any_errors_fatal only if it isn't already provided.
* add _get_attr method

(cherry picked from commit aa658c64ec)
2017-10-04 12:56:18 -07:00
2572b2147e Fix ansible-test config management.
(cherry picked from commit a333f2e5b0)
2017-10-04 12:53:29 -07:00
dff33071d0 check type to avoid typeerror tb
fixes #31290 by giving more meaningful message

(cherry picked from commit 8aa33419c9)
2017-10-04 15:14:48 -04:00
64b569635d Add yum fix to changelog 2017-10-04 21:09:11 +02:00
c9af0bfea8 yum: fix name parsing out of envra (#31247)
(cherry picked from commit 115b4fdc9b)
2017-10-04 21:08:34 +02:00
4fed711c42 made note about cwd not working for hostlist anymore (#31258)
* made note about cwd not working for hostlist anymore

fixes #31041

* Edits

(cherry picked from commit 5085c3b859)
2017-10-04 14:19:26 -04:00
7d69946d42 correctd inventory_file to return full path
fixes #31294

(cherry picked from commit dbae704d3c)
2017-10-04 11:54:25 -04:00
e9183f1966 Update changelog for example script fix 2017-10-04 08:51:13 -07:00
3d4e77f44b Update uptime.py example script with changes to the API. Fixes #31229
(cherry picked from commit 2b08e00a54)
2017-10-04 08:50:37 -07:00
280e9d7bb7 dont follow symlinks for inventories
now symlink dir is checked for locality of group/host_vars

fixes #31195

(cherry picked from commit f00d47fac0)
2017-10-04 11:05:09 -04:00
8b39280d8d turn all inventory cache 'off by default'
(cherry picked from commit 852d457549)
2017-10-04 10:52:01 -04:00
833858dc31 updated constructed docs to clarify use of ext
(cherry picked from commit 46621a3ddd)
2017-10-04 08:47:47 -04:00
43d24e284c Fixes nxos_igmp_interface idempotence issue for N1 images (#31220) (#31288)
(cherry picked from commit 1378861fe7)
2017-10-04 13:02:25 +05:30
6999b1168f Fixes #30769 - nxos_vtp_version errors out on N1 images. (#30770) (#31285)
* Fixes #30769

* add the same fix for 2 more vtp modules

(cherry picked from commit a12a05c219)
2017-10-04 12:09:25 +05:30
04ced64e35 Add SELinux fix to CHANGELOG 2017-10-03 23:44:32 -04:00
e157082f5e Correctly write SELinux config file (#31251)
* Add new lines to end of config file lines

* Properly write out selinux config file

Change module behavior to not always report a change but warn if a reboot is needed and return reboot_required.

Improve the output messages.

Add strip parameter to get_file_lines utility to help with parsing the selinux config file.

* Add return documentation

* Add integration tests for selinux module

* Use consistent capitalization for SELinux

* Use atomic_move in selinux module

* Don't copy the config file initially

There's no need to make a copy just for reading.

* Put message after set_config_policy in case the change fails

* Add aliases to selinux tests

(cherry picked from commit 00df1fda10)
2017-10-03 23:42:33 -04:00
8f9b4f9711 updated changelog for windows become fix 2017-10-04 13:09:29 +10:00
39196a7f2f win_become: move error handling to Ansible outside of shell (#31227)
* win_become: move error handling to Ansible outside of shell

* trimmed the output so double newlines don't get set

* added test for non-zero exit code

* missed issue URL on test

* changed exit to SetShouldExit

(cherry picked from commit e61c2799ff)
2017-10-04 13:07:36 +10:00
69e945129a Add elasticsearch_plugin fix to CHANGELOG 2017-10-03 22:33:53 -04:00
88a2c3c047 Update elasticsearch_plugin.py (#28936)
* Update elasticsearch_plugin.py

Change module to work with Elasticsearch 2.x and 5.x automatically.
Update examples and docs.
Supersedes #21989

* Check system paths for elasticsearch-plugin binary

Use get_bin_path from basic.py for searching paths.

* Create a copy of PLUGIN_BIN_PATHS rather than modifying the global

* Use provided plugin_bin path first before trying other places

Change global PLUGIN_BIN_PATHS to a tuple

(cherry picked from commit a5ee865634)
2017-10-03 22:30:30 -04:00
34bb2810a5 Add monit module fix to changelog 2017-10-03 15:20:21 -07:00
6a1dffc507 fix monit version check
it was erroneously checking > 3.18 instead of > 5.18

Fixes #30614

(cherry picked from commit 34878926ca)
2017-10-03 15:18:53 -07:00
7bfc23ad9e Add include_vars file instead of directory error message to changelog 2017-10-03 15:13:37 -07:00
4283a689d9 BugFix code breaks, if include_vars dir is file instead of directory (#31157)
(cherry picked from commit d0c003ab0f)
2017-10-03 15:12:59 -07:00
04a059e406 make pipelining actually backwards compatible
restore ssh specific setting the global, in the future these will be separate.

(cherry picked from commit 2d70dc7f21)
2017-10-03 16:49:37 -04:00
0e7fe0fe2e updated changelog for win_reg_stat return value fix 2017-10-04 06:21:47 +10:00
59beba32be win_reg_stat actually sets properties to be a dictionary, not a list (#31252)
(cherry picked from commit 8f62be7b7c)
2017-10-04 06:20:49 +10:00
22d9135b87 Add desc for 31084 2017-10-03 12:55:10 -07:00
df4daeb9a9 win_copy: fix for copying encrypted file without pass (#31084)
* win_copy: fix for copying encrypted file without pass

* fix pep8 issue

* reduced the diff and fixed some minor issues

(cherry picked from commit bba941cd5b)
2017-10-03 12:52:43 -07:00
52998cbb15 Remove git:// urls from docsite and from packaging (#30459)
It's almost always preferable to clone by way of https:// rather than
using the bare git:// protocol. Not only does https:// provide
stronger guarantees it also plays nicer with corporate proxies, etc.
(cherry picked from commit ba0b91b51b)
2017-10-03 12:19:07 -07:00
bbe73e2261 Fixed bad URL formatting. 2017-10-03 12:16:09 -07:00
6ca6167cc8 Fixed typo in Yum repo path. 2017-10-03 11:42:39 -07:00
fa131f9a07 make pipelining actually backwards compatible
restore ssh specific setting the global, in the future these will be separate.

(cherry picked from commit 2d70dc7f21)
2017-10-03 14:35:28 -04:00
74e0643dbb Handle vault decrypt --output=- (#31066)
In cli.CLI.unfrack_path callback, special case if the
value of '--output' is '-', and avoid expanding
it to a full path.

vault cli already has special cases for '-', so it
just needs to get the original value to work.

Fixes #30550
(cherry picked from commit 278ff19bea)
2017-10-03 14:20:31 -04:00
1bc2f4e38e Update changelog for deserialization fix. 2017-10-03 10:08:23 -07:00
f09c1211a7 set _hosts on access if None (#31111)
set _hosts on access if None to bpyass srlz10n issues to fix #30903

(cherry picked from commit cf3414d7d7)
2017-10-03 10:03:51 -07:00
b81270f7d5 Fix flush_cache on redis cache
Fix a del on non existent self.cache.

Fixes #31148

(cherry picked from commit dae0ad1ce6)
2017-10-03 12:54:58 -04:00
c6691eef52 remove unused ssh pipelining setters
fixes #31125

(cherry picked from commit 101377768b)
2017-10-03 09:22:49 -04:00
447d1cffb0 Fix backwards compatibility of constants.get_config
get_config would use ConfigManager.get_ini_value which does not
exist. What we are meant to use is
ansible.config.manager.get_ini_config_value and this method does not
expect a list, only a dictionary with a section and a key.

(cherry picked from commit 9b693235f0)
2017-10-03 09:19:28 -04:00
737a0d6015 win_dotnet_ngen: fix after broken in 2.4 (#31076)
* win_dotnet_ngen: fix after broken in 2.4

* added description to return values

(cherry picked from commit 12a4dca447)
2017-10-03 06:39:51 +10:00
2513078f39 updated changelog after win_dotnet_ngen fix 2017-10-03 06:36:28 +10:00
6035b00a84 updated changelog for win_msg fix 2017-10-03 06:35:24 +10:00
310610de47 win_msg: added doc about msg limit and included an explicit check for better error handling (#31078)
(cherry picked from commit 67fd98da09)
2017-10-03 06:34:28 +10:00
5db1d1a881 Pin docker simulator versions.
(cherry picked from commit c055795e02)
2017-10-02 13:20:10 -07:00
d2c11a1b00 Update CHANGELOG with aws_s3 fix 2017-10-02 14:38:45 -04:00
fd31896906 [cloud] Fix handling of encrypt option in aws_s3 module (#30822)
(cherry picked from commit e67e7785d3)
2017-10-02 14:36:41 -04:00
fbccd38e37 Add last few cherrypicks to changelog 2017-10-02 09:13:10 -07:00
6a1a6ee690 yaml inventory: Better error reporting on typo. fixes (#31118)
(cherry picked from commit 5802ec04bf)
2017-10-02 09:10:45 -07:00
ad0761b0a8 avoid include_Xs conflating vars with options (#30954)
* avoid include_Xs conflating vars with options

* avoid frozenset so serialization wont complain

* dded missing set

* updated as per feedback

(cherry picked from commit dea872e4a6)
2017-10-02 09:09:21 -07:00
5de7121941 corrected yaml extensions ini setting
(cherry picked from commit 44d2f21e02)
2017-10-02 10:03:19 -04:00
6945f6d3b2 Add copy module fix to changelog 2017-09-29 17:16:10 -07:00
a81dc232e3 remove action plugin only fields from 'file' calls (#31047)
* remove action plugin only fields from 'file' calls

fixes #30556

* Add a test for #30556
(cherry picked from commit ac9278ff0f)
2017-09-29 17:13:58 -07:00
981073b397 Updated changelog for win_chocolatey docs change 2017-09-30 08:24:21 +10:00
6d82ef8378 win_chocolately document improvedments, mention win_hotfix and use of become (#31085)
(cherry picked from commit 04afacc2ee)
2017-09-30 08:23:30 +10:00
73355d541a Add urls.py w/ proxy fix to changelog 2017-09-29 14:36:23 -07:00
1407410362 module_utils.urls - Encode the proxy connect as binary (#30811)
* module_utils.urls - Encode the proxy connect as binary

Under Python3 the sendall method expects binary not a string.

Prior to this change the below exception was being thrown;
Traceback (most recent call last):
  File "/tmp/ansible_umxox7_x/ansible_modlib.zip/ansible/module_utils/urls.py", line 1044, in fetch_url
    client_key=client_key, cookies=cookies)
  File "/tmp/ansible_umxox7_x/ansible_modlib.zip/ansible/module_utils/urls.py", line 951, in open_url
    r = urllib_request.urlopen(*urlopen_args)
  File "/opt/blue-python/3.6/lib/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/opt/blue-python/3.6/lib/python3.6/urllib/request.py", line 524, in open
    req = meth(req)
  File "/tmp/ansible_umxox7_x/ansible_modlib.zip/ansible/module_utils/urls.py", line 729, in http_request
    s.sendall((self.CONNECT_COMMAND % (self.hostname, self.port)).decode())
AttributeError: 'str' object has no attribute 'decode'

Encoding the value is inline with the lines below (Proxy-Authorization etc) which are being sent as binary.
(cherry picked from commit 92f777e815)
2017-09-29 14:33:06 -07:00
8cee2a8d93 removed typo from dig docs
(cherry picked from commit 43cbcbcc75)
2017-09-29 11:25:03 -04:00
750874ea5d [cloud] Improve boto3_tag_list_to_ansible_dict backward compatibility (#30622)
Default to trying both `key` and `Key`, and corresponding
`value`/`Value`.

Alternative to #30542

(cherry picked from commit 5d97fe4b6d)
2017-09-29 09:58:30 -04:00
adc3bedaa2 Updated changelog for winrm task vars fix 2017-09-29 11:14:50 +10:00
1665178626 fixed winrm to use proper task vars (#31072)
it avoids hitting hostvars templating issue and ignoring exception
fixes #30911

also normal var precedence should work for ansible_winrm vars

(cherry picked from commit 057eec94ee)
2017-09-29 11:14:04 +10:00
fcba6c0a57 fix anchor 2017-09-28 20:38:41 -04:00
15f8075bab Add the PR to the changelog 2017-09-28 16:10:24 -07:00
4ea1cc24ac Add os_image fix to changelog 2017-09-28 16:09:39 -07:00
e935907b4b fix os_image so it works when id is None (#29147)
Fixes #29145
(cherry picked from commit 6e84baddb6)
2017-09-28 15:56:02 -07:00
4025b47629 Fix fact failures cause by ordering of collectors (#30777)
* Fix fact failures cause by ordering of collectors

Some fact collectors need info collected by other facts.
(for ex, service_mgr needs to know 'ansible_system').
This info is passed to the Collector.collect method via
the 'collected_facts' info.

But, the order the fact collectors were running in is
not a set order, so collectors like service_mgr could
run before the PlatformFactCollect ('ansible_system', etc),
so the 'ansible_system' fact would not exist yet.

Depending on the collector and the deps, this can result
in incorrect behavior and wrong or missing facts.

To make the ordering of the collectors more consistent
and predictable, the code that builds that list is now
driven by the order of collectors in default_collectors.py,
and the rest of the code tries to preserve it.

* Flip the loops when building collector names

iterate over the ordered default_collectors list
selecting them for the final list in order instead
of driving it from the unordered collector_names set.

This lets the list returned by select_collector_classes
to stay in the same order as default_collectors.collectors

For collectors that have implicit deps on other fact collectors,
the default collectors can be ordered to include those early.

* default_collectors.py now uses a handful of sub lists of
collectors that can be ordered in default_collectors.collectors.

fixes #30753
fixes #30623

(cherry picked from commit 95abc1d82e)
2017-09-28 10:56:18 -04:00
f7b0908315 updated changelog for win_iis_webapppool fix 2017-09-28 16:17:35 +10:00
9a22c93606 fix for webapppool when specifying an attribute that holds a collection (#30729)
* fix for webapppool when specifying an attribute that holds a collection

* re-add always block on test

(cherry picked from commit a41077df20)
2017-09-28 16:16:52 +10:00
085297259f New release v2.4.1.0-0.1.beta1 2017-09-27 21:29:22 -07:00
1528a7ca60 Add ec2_snapshot_facts fix for python3 to changelog 2017-09-27 20:44:36 -07:00
1a3285b8a1 Fix ec2_snapshot_facts for python3
Avoid the following seen when running ec2_ami tests on python3,
presumably because the return type of `map` is different between
python2 and python3.

```
Traceback (most recent call last):
  File "/tmp/ansible_e44v27uj/ansible_module_ec2_snapshot_facts.py", line 242, in <module>
    main()
  File "/tmp/ansible_e44v27uj/ansible_module_ec2_snapshot_facts.py", line 238, in main
    list_ec2_snapshots(connection, module)
  File "/tmp/ansible_e44v27uj/ansible_module_ec2_snapshot_facts.py", line 193, in list_ec2_snapshots
    snapshots = connection.describe_snapshots(SnapshotIds=snapshot_ids, OwnerIds=owner_ids, RestorableByUserIds=restorable_by_user_ids, Filters=filters)
  File "/usr/local/lib/python3.5/dist-packages/botocore/client.py", line 312, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/local/lib/python3.5/dist-packages/botocore/client.py", line 575, in _make_api_call
    api_params, operation_model, context=request_context)
  File "/usr/local/lib/python3.5/dist-packages/botocore/client.py", line 630, in _convert_to_request_dict
    api_params, operation_model)
  File "/usr/local/lib/python3.5/dist-packages/botocore/validate.py", line 291, in serialize_to_request
    raise ParamValidationError(report=report.generate_report())
botocore.exceptions.ParamValidationError: Parameter validation failed:
Invalid type for parameter OwnerIds, value: <map object at 0x7ff577511048>, type: <class 'map'>, valid types: <class 'list'>, <class 'tuple'>
```

https://github.com/ansible/ansible/pull/30435#issuecomment-330750498
(cherry picked from commit 5900fee67a)
2017-09-27 20:43:20 -07:00
165432c9c1 lxc_container py3 fix in changelog 2017-09-27 20:34:37 -07:00
bit
d9a87fff5f lxc_container: open files as text, fixes #30571 (#30572)
call to_text on full config file

fixes issue #30571
(cherry picked from commit 0a114436fc)
2017-09-27 20:33:14 -07:00
f88c8e1df9 Updated changelog for sensu_silence fix 2017-09-28 13:13:58 +10:00
18490161b5 Fix sensu_silence module boolean parameter declaration (#30971)
(cherry picked from commit 0b0348d81c)
2017-09-28 13:13:14 +10:00
ec380da0f2 fixed lookup dig docs
also clarified dig module uses dnspython

(cherry picked from commit bb874e5029)
(cherry picked from commit 54d7c384b6)
2017-09-27 21:00:45 -04:00
fb2a533b81 fixed pull's ansible/git invocation options (#30938)
* fixed ansible/git invocation options

now falls back to using localhost as 'all' does not include implicit accidentally anymore

fixes #30636

(cherry picked from commit fc745920c7)
2017-09-27 19:51:06 -04:00
5b08188318 Add crypttab pyhton3 fix to changelog 2017-09-27 11:59:28 -07:00
441d238d5d Fix crypttab python3 compatibility issue (#30457)
In python2 str gives byte string. In Python3 it gives unicode string so it
can't be written in a binary mode opened file.
Use to_bytes helper function to ensure content being written will be
properly encoded in both python2 and python3.
(cherry picked from commit 54859a2132)
2017-09-27 11:58:41 -07:00
ece8d2c577 since we never added toggle, disable cache
this restores previous behaviour, cache and a toggle will be added in 2.5
fixes #30717
2017-09-27 14:36:32 -04:00
53f865d094 rmeove ext requirement for yaml inventory plugin
returns to the state before 2.4 made it a requirement
fixes #30855

(cherry picked from commit 82de2e1865)
2017-09-27 14:28:30 -04:00
f993e213da added note about inventory_dir new behaviour (#30865)
* added note about inventory_dir new behaviour

(cherry picked from commit cd5cadfe69)
2017-09-27 12:30:59 -04:00
e9649a0598 fixed wrong changelog entry 2017-09-27 11:48:58 -04:00
25fafc1280 Remove stray " and replace include: with import_tasks:
(cherry picked from commit 22fda12ac1)
2017-09-27 10:03:00 -04:00
64737e1446 corrected import_play into to import_playbook (#30853)
* corrected import_play into to import_playbook

fixes #30744

(cherry picked from commit 17f094bb6a)
2017-09-26 17:28:07 -04:00
457b70ee90 fix for slack callback breaks in 2.4 (#30932)
* fix for slack callback breaks in 2.4

fixes #30838

(cherry picked from commit 8378ac30b3)
2017-09-26 17:19:21 -04:00
0195d3640b [cloud] Don't remove profile, security_token by default in aws_s3 (#30902) (#30930)
Comment above suggests only removing it for non-S3 services,
so let's actually enforce that.
2017-09-26 16:10:37 -04:00
ed2a152b5e [cloud] Ensure target group ARNs are passed as a list in ec2_asg (#30905) (#30934)
While sets are useful for comparing whether target groups
need modifying, the AWS API expects a list or tuple, not a set
2017-09-26 16:09:53 -04:00
91341de220 [cloudwatch_event] Due to an ImportError botocore is never successfully imported. (#30942) 2017-09-26 16:09:25 -04:00
d532ab05ab fixes issue where filter wouldn't error on undefined var (#30921)
The filter will now correctly error on an undefined variable when trying
to template the key `value`

(cherry picked from commit 909100bd2c)
2017-09-26 14:52:05 -04:00
f628881750 Update API example for 2.4
(cherry picked from commit d40eff720c)
2017-09-26 14:40:41 -04:00
999404121f Add jenkins_plugin CVE fix to the changelog 2017-09-26 11:24:58 -07:00
0d61acc730 Add one-versus-many-matches logic to network filter plugin (#30511)
* Add one-versus-many-matches logic

* Fixed indentation (tabs ==> spaces)

(cherry picked from commit 9aa1da23f0)
2017-09-26 12:41:12 -04:00
042079aa87 Use vault_id when encrypted via vault-edit (#30772)
* Use vault_id when encrypted via vault-edit

On the encryption stage of
'ansible-vault edit --vault-id=someid@passfile somefile',
the vault id was not being passed to encrypt() so the files were
always saved with the default vault id in the 1.1 version format.

When trying to edit that file a second time, also with a --vault-id,
the file would be decrypted with the secret associated with the
provided vault-id, but since the encrypted file had no vault id
in the envelope there would be no match for 'default' secrets.
(Only the --vault-id was included in the potential matches, so
the vault id actually used to decrypt was not).

If that list was empty, there would be an IndexError when trying
to encrypted the changed file. This would result in the displayed
error:

ERROR! Unexpected Exception, this is probably a bug: list index out of range

Fix is two parts:

1) use the vault id when encrypting from edit

2) when matching the secret to use for encrypting after edit,
include the vault id that was used for decryption and not just
the vault id (or lack of vault id) from the envelope.

add unit tests for #30575 and intg tests for 'ansible-vault edit'

Fixes #30575

(cherry picked from commit a14d0f3586)
2017-09-26 12:31:58 -04:00
fd361a2568 added cli rst docs to gitignore 2017-09-26 10:55:41 -04:00
a2525658f9 Remove print statements from play_context
Caused spurious output, particularly obvious when in `become` mode

(cherry picked from commit ef56f9a44c)
2017-09-26 10:16:11 -04:00
a508bb205a Remove example of using params for the url_password
params could be logged so never use it for passwords.

Also add code to raise an error if passwords are used in that field.

References #30874

(cherry picked from commit 863fcb5ace)
2017-09-25 17:10:09 -07:00
2149d1092b Fix 'distribution' fact for ArchLinux (#30723)
Allow empty wasn't breaking out of the process_dist_files
loop, so a empty /etc/arch-release would continue searching
and eventually try /etc/os-release. The os-release parsing
works, but the distro name there is 'Arch Linux' which does
not match the 2.3 behavior of 'Archlinux'

Add a OS_RELEASE_ALIAS map for the cases where we need to get
the distro name from os-release but use an alias.

We can't include 'Archlinux' in SEARCH_STRING because a name match on its keys
but without a match on the content causes a fallback to using the first
whitespace seperated item from the file content as the name.
For os-release, that is in form 'NAME=Arch Linux'

With os-release returning the right name, this also supports the
case where there is no /etc/arch-release, but there is a /etc/os-release

Fixes #30600

* pep8 and comment cleanup

(cherry picked from commit 3eab636b3f)
2017-09-25 15:06:05 -04:00
3aa7941b72 facts: fix SPARC cpu count on linux (#30261)
On sparc64, /proc/cpuinfo has no usual 'model name', 'Processor', 'vendor_id', 'Vendor',
as a result "ansible_processor_vcpus" is always 1.
Add check element "ncpus active" to fix the issue.

(cherry picked from commit e93ecac0da)
2017-09-25 12:31:34 -04:00
3680d28e58 Increase pause time in junos integration test (#30740) (#30799)
*  Increase pause time to a value greater
   than persistent connection timeout to clean
   out socket path.
(cherry picked from commit c3d226a739)
2017-09-23 18:42:00 +05:30
2eac554eb4 use set to quicken group host membership
(cherry picked from commit 3f9a885b83)
2017-09-22 19:09:40 -04:00
956b6ece86 dont validate group names in yaml plugin
(cherry picked from commit a819cfcad7)
2017-09-22 19:06:09 -04:00
93559a7faf Add ssh path fix to changelog 2017-09-22 15:33:13 -07:00
4afe8ed2ef Fix encoding error with path to ssh
As reported on the mailing list, if ssh_executable (from a config
setting) contains nonascii characters then we could get a UnicodeError
here.  Transform into bytes before passing to subprocess so that
subprocess doesn't transform to bytes for us.

(cherry picked from commit 86d8a4ff50)
2017-09-22 15:31:50 -07:00
bca1818b1e Fix pkg_mgr fact on OpenBSD (#30725)
* Fix pkg_mgr fact on OpenBSD

Add a OpenBSDPkgMgrFactCollector that hardcodes pkg_mgr
to 'openbsd_pkg'. The ansible collector will choose the
OpenBSD collector if the system is OpenBSD and the 'Generic'
one otherwise.

This removes PkgMgrFactCollectors depenency on the
'system' fact being in collected_facts, which also
avoids ordering issues (if the pkg mgr fact is collected
before the system fact...)

Fixes #30623

(cherry picked from commit 12404f470a)
2017-09-22 14:24:57 -04:00
ce963984d1 Fix command argument typo in telnet module docs (#30731) (#30734)
* Fix command argument typo in telnet module docs (#30731)

(cherry picked from commit 6d3307e472)

* Update Change log
2017-09-22 15:20:09 +05:30
304377aa82 added missing 2.4 clog entry 2017-09-21 23:56:46 -04:00
5048f46340 Fix docker_service python3 incompatibility
Looks like this is supposed to operate on native strings so there's no
need to encode or decode at all here

Fixes #30354

(cherry picked from commit f66c74915c)
2017-09-21 19:51:31 -07:00
c5f5277183 Updated changelog to include win_power_plan fix 2017-09-22 06:24:26 +10:00
22f352490d Fix OS version check in win_power_plan (#30538)
* Fixed win_power_plan OS version check

* Original error message case

(cherry picked from commit dc8aedb274)
2017-09-22 06:23:41 +10:00
70c1320c08 Updated changelog with win_domain_membership fix 2017-09-22 06:11:58 +10:00
34ceed635d win_domain_membership: added better error handling and basic tests (#30674)
(cherry picked from commit fb628acb6e)
2017-09-22 06:10:14 +10:00
9bc6cca9f8 [fix] no-unicode-literals sanity error on ansible.egg-info (#30446)
* [fix] no-unicode-literals sanity error on ansible.egg-info

(cherry picked from commit 0e9ae5b8cc)
2017-09-21 12:48:03 -07:00
fd42243936 Split ec2_elb_* modules in service of rename/interface changes (#30716)
* Split ec2_elb_* modules in service of rename/interface changes (#30532)

* Undeprecate ec2_elb_*
* Make ec2_elb* full fledged modules rather than aliases
* Split tests for ec2_elb_lb and elb_classicb_lb
* Change names in documentation of old and new elb modules

Add tests for ec2_elb_lb

* Update CHANGELOG with new status of ec2_elb_* vs. elb_classic_*
2017-09-21 14:43:45 -04:00
bc0b069cb7 Remove invalid e.response from BotoCoreErrors in ec2_asg.py (#30121) (#30495) (#30715) 2017-09-21 13:53:04 -04:00
71c646fe59 become flags are primary
with new configuration the sudo flags are always set and become cannot override,
switching to simle 'or' will result in become_flags working.

also sudo_flags are deprecated.
also changed from YAML null causing a 'None' str

fixes #30629

(cherry picked from commit 236d13ac3a)
2017-09-21 10:02:23 -04:00
2fca9d5530 [cloud] Fix broken LimitExceeded check in iam_managed_policy (#30537) (#30626)
When policy versions exceed 5, we hit LimitExceeded. However,
the exception checking should use `e.response['Error']['Code']`
2017-09-21 08:29:39 -04:00
64f54fa6e2 [cloud] Fix aws_s3 backwards compatibility of put/get options (#30580)
Previously to use the modes put or get the object had to be specified with a leading /. Since the boto call doesn't take an object like that this was overlooked and removed. Added a check to remove that leading character.
2017-09-21 08:29:15 -04:00
6f461fbfd0 Increase socket connect retry timeout for integration test (#30681) (#30683)
*  Increase persistent connection local socket
   retry timeout to fix intermittent failure in
   network integration test
(cherry picked from commit 869cd6f729)
2017-09-21 11:02:22 +01:00
aa808e1eb6 Add changelog entries for cherrypicks over the previous day. 2017-09-20 19:54:58 -07:00
1880aa86b5 fix for unrequired parameter
(cherry picked from commit 92426840d6)
2017-09-20 19:48:28 -07:00
b92452f775 fix for make webdocs
(cherry picked from commit 0e22afef52)
2017-09-20 22:46:50 -04:00
11cc64db21 Fix python3 and nonascii handling in inventory plugins
Fixes #30663

(cherry picked from commit 72bdf7aa7e)
2017-09-20 19:39:38 -07:00
46fd30d420 moved from eval to templating + literal_eval
(cherry picked from commit f12c6e0946)
2017-09-20 19:38:45 -07:00
804a308ab3 [cloud][py3] Fix AttributeError in iam_policy on python3 (#30551) 2017-09-20 17:15:03 -07:00
da56535ffc Updated release table for docs (#30649) (#30659)
- Updated table to reflect release of 2.4
- Added in 2.5 as current devel
2017-09-20 16:19:48 -07:00
c4ce24966b dont override previous ini entries with defaults
corrected setting example, quotes mess up the regex
fixes #30633

updated chlog

(cherry picked from commit d3e85bd045)
2017-09-20 16:39:47 -04:00
0c179133bf made callbacks backwards compatible (#30625)
* made callbacks backwards compatible
* note about porting guide
* deprecation notice so those callbacks get updated.

This fixes #30597 for those that were not inheriting from base.

Callback must either inherit from base (directly or indirectly),
which already implements this or implement set_options themselves.

(cherry picked from commit 131d417c7a)
2017-09-20 15:21:20 -04:00
5fdcbdaaee More porting updates (#30635)
* Update porting_guide_2.4.rst with more docs and some rst fixes

(cherry picked from commit a030472092)
2017-09-20 15:13:01 -04:00
a3d5b2f1ce Check number of vault secrets after setup. (#30520)
This is to catch vault secrets from config and
cli. Previously vault_password_file in config was
missed since it was added by setup_vault_secrets,
so check after setup_vault_secrets.

Related to #30514

(cherry picked from commit 174cb1f33c)
2017-09-20 11:15:42 -04:00
f8ad9ca75d Don't ask for password confirm on 'ansible-vault edit' (#30514)
This is to match the 2.3 behavior on:

        ansible-vault edit encrypted_file.yml

Previously, the above command would consider that a 'new password'
scenario and prompt accordingly, ie:

        $ ansible-vault edit encrypted_file.yml
        New Password:
        Confirm New Password:

The bug was cause by 'create_new_password' being used for
'edit' action. This also causes the previous implicit 'auto prompt'
to get triggered and prompt the user.

Fix is to make auto prompt explicit in the calling code to handle
the 'edit' case where we want to auto prompt but we do not want
to request a password confirm.

Fixes #30491

(cherry picked from commit 307be59092)
2017-09-20 11:00:42 -04:00
fc97af8ab1 Restore correct coloring to selective callback (#30528)
* Restore correct coloring to selective callback

This fixes the bug raised in #30506

* Fix format issues for Python 2.6 & indent

Removed the zero length fields to support format under Python 2.6

Fixed E128 continuation line under-indented for visual indent issue

(cherry picked from commit d74c871559)

updated clog
2017-09-20 09:22:48 -04:00
1cf00a5151 Add underscore and period to regex for hostname prompt (#30612)
* Add _ and . to regex (#30396)

Adding underscore and period to the nxos regex for determining the prompt for hostnames with underscores and periods in the hostname.
(cherry picked from commit 33b8d7069f)

* Add change log
2017-09-20 14:35:15 +05:30
fef04420c9 Updated changelog with camel conversion fixes 2017-09-20 15:25:35 +10:00
35c867d890 CamelConverter - more fixes picked up in testing (#30601)
(cherry picked from commit a940eb1e80)
2017-09-20 15:24:49 +10:00
98425291d1 CamelConversion: fix to not convert string values (#30595)
(cherry picked from commit 1ea0293878)
2017-09-20 15:24:32 +10:00
6d5f2dccb2 Misc docsite fixes (#30290)
* Fix refs for local_facts and various cli :option:
* Fix dev_guide/testing_pep8 refs
* remove ref to non-existing 'developing_test_pr'
* Fix ref to ansible-vault encrypt_string
* Removed hard-to-localize colloquialism.
* Rename '_ansible-pull' in playbooks_intro.

It was conflicting with rst/ansible-pull.rst. Nothing
seems to reference it.

* Add explicit targets for and update refs

Replace some ':doc:' use with ':ref:'.

Replace some :ref: to section names with explicit targets
(:doc:`Dynamic vs. Static` -> :ref:`dynamic_vs_static` etc)

* The 'YAML+Jinja' syntax lex fails here, so just use yaml

Since the yaml+jinja highlight fails, code wasnt highlighted
at all, but 'yaml' works more or less.

* just use no lexer for the < python2.6 examples

py3 will fail highlighting them, and 'python2' throws
a lexer warning, and nothing actually highlights it, so
just disable.

(cherry picked from commit 9cc63326b1)
2017-09-19 16:18:11 -07:00
9ae683e9f4 added missing feature info (#30560)
* added missing feature info

(cherry picked from commit 22c8522cbf)
2017-09-19 17:44:08 -04:00
aea9bab2ab fixed password lookup docs
(cherry picked from commit 71cc906ec8)
and chlog update
2017-09-19 16:34:14 -04:00
0c843b70cc Fix jenkins_plugin test for no net situations (#30568)
Unittests are sometimes run without network connectivity in build
systems.  Make that work correctly by mocking out _get_url_data with the
expected return value.
(cherry picked from commit 0a69e27e62)
2017-09-19 13:13:10 -07:00
22acb4b733 oc module- Fixing description & removing example command (#30257)
* Fixing description & removing oc/adm example

Noticed formatting errors on http://docs.ansible.com/ansible/latest/oc_module.html -- also removing oc/oadm command examples

* Trailing whitespace..

(cherry picked from commit e3ef80f5d6)
2017-09-19 16:11:23 -04:00
8ccbff08f5 fixed decreption
(cherry picked from commit 1cee81375386a7f3ac3d1893342b9323983f00c9)
(cherry picked from commit b9120dfd97)
2017-09-19 13:00:56 -07:00
3b86554081 Add a code-smell test for smart quotes and remove smart quotes from all files
(cherry picked from commit c82cf791dd)
2017-09-19 13:00:56 -07:00
c3c5869ada update changelog 2017-09-19 13:00:56 -07:00
ba9a84f02a ovirt_vms: Fix the logout condition (#30410)
(cherry picked from commit 0aebdb4aca)
2017-09-19 13:00:56 -07:00
6296b906fb Updated changelog for windows module util list fix 2017-09-19 13:00:56 -07:00
8a247989c5 windows: fix list type in legacy module utils (#30483)
* windows: fix list type in legacy module utils

* only change the return for the list type instead of affecting it all

* additional null check when using an array

(cherry picked from commit 01563ccd5d)
2017-09-19 13:00:56 -07:00
1af9ab1b14 Remove redundant check for group membership in add_host (#30530)
(cherry picked from commit 5aebcd4f7f)
2017-09-19 13:00:56 -07:00
d724bb584a Updated changelog to for win_file check mode fix 2017-09-19 13:00:56 -07:00
372397deb4 win_file: Fix check-mode issue removing dirs (#30475)
This fixed #30442

(cherry picked from commit 229a86c952)
2017-09-19 13:00:56 -07:00
c235e8a863 Changelog entries for openssl_certificate fixes 2017-09-19 13:00:56 -07:00
6a7206fc99 openssl_certificate: make subject-alt-name identifier conistent with openssl_csr (#30151)
(cherry picked from commit 1fe5171f1a)
2017-09-19 13:00:56 -07:00
69282e76fb Add extended key usages to module_utils/crypto.py (#30128)
* Add extended key usages
(cherry picked from commit 2f06d572ba)
2017-09-19 13:00:56 -07:00
c4ae7e8854 Add simple integration test for openssl_certificate (#29038)
* openssl_certificate: Fix parameter assertion in Python3

Parameter assertion in Python3 is broken. pyOpenSSL get_X() functions
returns b'' type string and tries to compare it with '' string, leading
to failure.

The error mentionned above has been fixed by sanitizing the inputs from
a user to the assert only backend.

Also, this error was hidden by the fact that the improper check method
was called in the generate() functions.

* Add simple integration test for openssl_certificate

* remove subject == issuer assertion

* run integration tests only on supported hosts

* change min supported version to 0.15.x

* Add test for more CSR fields

* also convert dict members to bytes

* fix version_compare

* openssl_{csr, certificate}: Fail if pyOpenSSL <= 0.15

Previous 0.13 pyOpenSSL was a C-binding, and required the parameter
passed to add_extention to be in ASN.1. This has changed with the move
to 0.14 and it is now all pythong and string based.

Previous the 0.15 release, the `get_extensions()` method didn't exist,
since the modules rely heavily on it we ensure pyOpenSSL version is at
last 0.15.0.

* check pyopenssl version in openssl_csr integration test

(cherry picked from commit 2186b04934)
2017-09-19 13:00:56 -07:00
3e0a17a21a Lookup docs (#30280)
* finalize lookup documentation
* minor fixes to ansible-doc
 - actually show which file caused error on when listing plugins
 - removed redundant display of type and name
* smart quote fixes from toshio
(cherry picked from commit 24d4787b2d)
2017-09-19 07:58:23 -07:00
d14467b029 Fix release date of 2.4.0.0 2017-09-18 19:23:06 -07:00
12332e7a2c New release v2.4.0.0-1 2017-09-18 18:22:16 -07:00
8c20a2e600 Set the release date. 2017-09-18 17:42:08 -07:00
c3821abc95 note in changelog that ec2_elb_lb, ec2_lb, and ec2_elb_facts are not deprecated yet.
We pushed renames of those modules to new names but have since decided
that we should rewrite the modules with better parameters and better
return values instead.  It's too late to fix the deprecations in 2.4.0
so make clear what we're going to do in the changelog for 2.4.0 and
promise to fix it in 2.4.1
2017-09-18 13:31:06 -07:00
3c805f85bc New release v2.4.0.0-0.5.rc5 2017-09-17 19:30:07 -07:00
4ea99a4cbe Update aci tests for new messages from lxml-4.0+
(cherry picked from commit 1fa3fb45bc)
2017-09-17 19:06:30 -07:00
bdce5d2fe0 Updated version in index.
(cherry picked from commit 2213f55c4a)
2017-09-17 17:18:50 -07:00
bbd90e3b29 porting_guide_2.4 stub entries (#30456)
Addtions to porting_guide_2.4

* deprecated notice for win_package return values
* Added vars plugins, config api, inventory plugins.  These were mostly backwards compatible.
  Added notes for users and devs to check out new features once i write the 'feature docs' I'll
  come back and link to them from here
(cherry picked from commit 5a256dd1c0)
2017-09-17 16:57:54 -07:00
28da5199c4 List all of the new plugins 2017-09-17 12:12:50 -07:00
946515af66 Cleaning up use of include: in docs (#30466)
* Cleaning up use of include: in docs

Switching to import_*/include_* instead.

* Update playbooks_best_practices.rst

* Fix rst syntax

(cherry picked from commit 366a9d861f)
2017-09-17 11:27:53 -07:00
3af68ec8a8 List the new lookup plugins for 2.4 in changelog 2017-09-17 09:38:30 -07:00
d25106e387 New release v2.4.0.0-0.4.rc4 2017-09-16 11:28:34 -07:00
b285dc1f4f Resolving bug on CNOS Image download on multiple devices.
(cherry picked from commit 1921eaf096)
2017-09-16 10:54:19 -07:00
6e77a3ac3a Porting Guides 2.4 (#24539)
* Porting Guides for Ansible Versions

Improve the user facing documentation.
Tell people what changes they need to make

* More porting guides

* Link porting guides from TOC

* Link porting guides from CHANGELOG.md

* typo in link

* Review feedback

* Better CHANGELOG links

* Better links

* code blocks

* Minor changes

* Correct links, comment out network section in 2.4

* Typos

* Revert non 2.4 changes

* Add placeholders for other items

* multiple inventory

* Update porting_guide_2.4.rst

* Update porting_guide_2.4.rst

* Update porting_guide_2.4.rst

* Update porting_guide_2.4.rst

* add win_command/win_shell escaping notes

* Added some windows porting info

* Edit for grammar

* Correct links, delete Net Platform Agnostic

* 2.5 link

* Network changes in 2.4

* facts_namespacing was pushed back to 2.5

Due to lack of time we pushed this back to 2.5 so that the facts in the namespace could be shortened.

* Python version

* Remove FIXMEs - move to seperate PR

(cherry picked from commit 785e604c57)
2017-09-16 10:42:45 -07:00
f5e237d038 CommandUtil C# API tweaks (#30453)
* changed RunCommand result from Tuple to CommandResult for easier future extensibility
* moved Win32 Dictionary->multi-null-string environment munging into C#
(cherry picked from commit 0e70057f56)
2017-09-16 00:13:51 -07:00
c8dcf5117a Various fixes to azure_rm_virtualmachine for managed disks and allocated. (#30450)
* fixes #30194
* fixes #30193
* fixes #29662
* fixes #28859
(cherry picked from commit c12c7a72ed)
2017-09-16 00:13:51 -07:00
5dec3d7386 2.4 azure_rm_virtualmachine test move 2017-09-15 23:47:52 -07:00
df361dc83f azure_rm_dnsrecordset rewrite (#30449)
As-merged, had several issues that prevented idempotent usage. Some args were defined at the wrong UI level. Dual-state args didn't match up with typical Ansible UI.
(cherry picked from commit 6b5b465125)
2017-09-15 18:16:31 -07:00
e9668289e8 Fix PEP 8 issue.
(cherry picked from commit 61dd5517c3)
2017-09-15 15:12:18 -07:00
2b8508f471 deprecated include
added docs for new actions that take over include duties

(cherry picked from commit 8799038a89)
2017-09-15 13:21:00 -07:00
a725b62f51 clear correct cache when reconcile is invoked
moved it to ensure all callers get the correct hosts after

(cherry picked from commit fc9b44e021)
2017-09-15 12:59:03 -07:00
eeba998592 nxos_install_os install_state fix
(cherry picked from commit 7dc60c3f24)
2017-09-15 12:37:12 -07:00
06a066fe1b Test Role: Adds nxos_pim_rp_address integration test role (#29958)
*   Adds nxos_pim_rp_address integration test role for group_list,
  prefix_list and route_map (cli and nxapi)

*  * Adds explicit removal of static RP configs to match cli behaviour

*  * Removes config deletion using nxos_config module (for 2.4 only)

*  * Attempt short and long delete config command
 * Add a platform check for N3K for bidir

(cherry picked from commit 7e58661335)
2017-09-15 12:06:03 -07:00
e22a96c00a Fixes nxos_pim_rp_address module idempotence (#29620)
* Fixes nxos_pim_rp_address module idempotence

*  * Adds a note in header comment to indicate no support for absent state

(cherry picked from commit ff84fc969c)
2017-09-15 12:06:03 -07:00
5d8bc210bf fixed issue with default callback inheritance (#30427)
* fixed issue with default callback inheritance

 - callbacks need to document same options as callbacks they inherit from to get them configured
 - since default is also used by many 3rd party callbacks for inheritance, making the code 'tolerate' the missing docs
   and fallback to using the direct constant to configure it's options.
(cherry picked from commit 81fd67c10f)
2017-09-15 11:15:06 -07:00
94d172fef4 Raise an error if ansible_network_os is not specified (#30429)
(cherry picked from commit 5d404af76e)
2017-09-15 11:13:04 -07:00
3660afe677 typo fix
(cherry picked from commit f87d0b3502)
2017-09-15 10:33:39 -07:00
c73e1b5e68 Fix nxos_snmp_community idempotence issue (#30388)
* Fix nxos_snmp_community idempotence issue

* Use passed in name to filter

* Test updates and remove unused method

(cherry picked from commit 9af6dc4751)
2017-09-15 07:52:44 -07:00
91e1a5fe16 Don't expect (postgres) SERVER_VERSION to be M.N (#30417)
It could be something like '10beta4', which StrictVersion() would
reject. When Postgres 10 is released, it will be '10', which
StrictVersion() would STILL reject.

Fortunately, psycopg2 has a 'server_version' connection attribute that
is guaranteed to be an integer like 90605 for version 9.6.5, or 100000
for version 10. We can safely use this for version-specific code.
(cherry picked from commit 0addd53926)
2017-09-15 07:29:23 -07:00
b14e0cbfe4 Set hostname to 'switch' on nxos_system teardown (#29126)
On setup we set it to 'switch', so teardown should be 'switch'.
Also, using inventory_hostname breaks the test, since in our CI
it's a long UUID string, which exceeds the 32 chars maximum for setting
a hostname on NXOS.
(cherry picked from commit 2304706bd3)
2017-09-14 22:21:06 -07:00
3f6ba180fc Set hostname to 'switch' on nxos_config toplevel setup/teardown tasks (#29127)
Using inventory_hostname breaks in our CI, as the inventory_hostname
translates to a long UUID, exceeding the maximum length for a NXOS
hostname.
(cherry picked from commit 8b6e3272f2)
2017-09-14 22:21:06 -07:00
cde49268e2 run banner exec test only for NXOS7K (#29041)
Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
(cherry picked from commit 064bb66e6d)
2017-09-14 22:21:06 -07:00
8d5afd1891 Fixing two bugs with import_role (#30398)
1) import_role was never resulting in a static inclusion of the role
   tasks due to a logic error.
2) no error was raised when import_role tried to use a with loop, resulting
   in a strange error down the execution path.
(cherry picked from commit cd2774af78)
2017-09-14 20:19:42 -07:00
47faa46eaf remove dupe deprecation on config (#30364)
* remove dupe deprecation on config

also move failed typing to same place to use 'standard' display vs hack.

(cherry picked from commit c027ad943e)
2017-09-14 14:34:12 -07:00
5dc7dae565 Correctly create include_role blocks when using loops (#30372)
Also fixes instances where conditionals or other variables may result in
hosts executing lists of tasks of differing sizes.

Fixes #18748
(cherry picked from commit 6730f81024)
2017-09-14 14:31:35 -07:00
cc81d1e1c3 Rel240/fix nxos pim interface (#29885)
* fix nxos_pim_interface

* Add integration test coverage and fix unit test

* Add clarifying comments

* Make ansibot happy

(cherry picked from commit 173c41aefe)
2017-09-14 14:30:43 -07:00
72d2c8ecab Fix nxos_interface error for nxapi and idempotence problem (#29136)
* Fix nxos_interface nxapi error and idempotence

* Make shippable happy

(cherry picked from commit 3faba93a2b)
2017-09-14 14:30:43 -07:00
0163f173a7 fixes #27177 - nxos_aaa_server_host multiple issues (#29103)
(cherry picked from commit 37f68bffc0)
2017-09-14 14:30:43 -07:00
ee1134be95 Document boolean default value treatment (#30062)
* Consistency and document treatment of default bool values

* Document that default bool values can be any Ansible recognized bool.
  choose the one that reads better in context
* For fragments used by the copy module, make bool types use type=bool and not choices

* Edit for clarity

(cherry picked from commit 8a2f069468)
2017-09-14 13:27:48 -07:00
2123ed44e4 fixed 'typing' for deprecated get_config
(cherry picked from commit 7a12314d54)
2017-09-14 13:21:15 -07:00
afbcbf81b7 Use safe_load to load yaml
Replad `yaml.load` with `yaml.safe_load`

(cherry picked from commit 8c3bf20a13)
2017-09-14 11:20:08 -07:00
6294f3ebfe Add sudo/su become_methods for become tests (#30266)
* Add sudo/su become_methods for become tests

* Fix test on osx

(cherry picked from commit dc5f83c09b)
2017-09-14 09:18:42 -07:00
7794b1e465 Fix Dell OS network module timeout (#30355)
The dellos action plugins should add the remote address of the switch
provider to the play context. This was fixed in issue #23589 in an
almost identical manner for the eos, ios, iosxr, and vyos action
plugins.

Fixes: #30350
(cherry picked from commit ac69fcccdc)
2017-09-14 09:11:20 -07:00
f25f03b539 Generalize nxos_bgp event-history detection (#28890)
* More general handling of event-history

* Update unit tests

(cherry picked from commit f84ff216b6)
2017-09-14 09:05:21 -07:00
ae59390321 better error on bad playbook encoding
(cherry picked from commit 1950bcc14e)
2017-09-14 08:55:40 -07:00
2439dc24e9 Specify default delay (DOCUMENTATION only change) (#30344)
* Specify default delay

Also clarify that tx_rate is in bps

* aggregates -> aggregate

(cherry picked from commit 4c9ad00c50)
2017-09-14 07:43:27 -07:00
a886b2b11e Set default value for provider transport
Fixes #30331
Set defualt value of provider to avoid
behaviour change before and after sub spec
validation was added as part of PR #28894
2017-09-14 07:38:32 -07:00
8a10472a3d Fix to not warn for context and passwords
The parameters 'context' and 'passwords' were wrongly marked as being
deprecated.
2017-09-14 00:02:19 -07:00
02094eed71 Fix regression in format of lvm facts (#30326)
lvm information should not have leading whitespace in the key names

Fixes #30006
(cherry picked from commit 62f49120cd)
2017-09-14 00:01:01 -07:00
83a74213b1 updated test not that module util checks the path is valid (#30321) 2017-09-13 19:11:55 -07:00
a0e8634fea Correct sl_vm documentation (#29433)
Fix corrects sl_vm documentation from wait_timeout to wait_time

Fixes: #29395

Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
(cherry picked from commit b3cba957e0)
2017-09-13 16:24:19 -07:00
34e624ad9e Add CLI provider with authorize yes to ios tests (#30312)
We are getting failures to do lack of elevated privileges.
(cherry picked from commit dbe9df1289)
2017-09-13 15:32:41 -07:00
6771ade86a New release v2.4.0.0-0.3.rc3 2017-09-13 14:16:03 -07:00
74d2e003ac nxos_udld_interface: improve interface detection (#28682)
* fix for nxos_udld_interface

* Tested Note added back

(cherry picked from commit 4e32c92166)
2017-09-13 14:06:36 -07:00
c07d435781 nxos_snmp cleanup (#28922)
* Clean up nxos_snmp_contact & nxos_snmp_location

* Bring nxos_snmp_community in line

* Bring nxos_snmp_host in line

* And I would have gotten away with it too,

if it weren't for those meddling sanity tests

* Bring nxos_snmp_traps & nxos_snmp_user in line

* Appease Shippable

(cherry picked from commit 8c03609e54)
2017-09-13 14:06:36 -07:00
f815b29a00 Fixes #28793, #27484 (#29745)
(cherry picked from commit 1a266e29a7)
2017-09-13 14:06:36 -07:00
f054d08422 Fixes #28493 (#29061)
(cherry picked from commit 169fbc4c94)
2017-09-13 14:06:36 -07:00
8d305461fb Fix sending facts to Foreman
(cherry picked from commit 9ad90de4bc)
2017-09-13 13:59:06 -07:00
0130da1773 Fix nxos_overlay_global networking modules (#28943)
(cherry picked from commit 7292dd20ed)
2017-09-13 13:45:00 -07:00
ef9c3eb628 fixes #27066 - nxos_acl errors when there are 0 or 1 access lists configured (#29076)
* fixes #27066

* replace type() with isinstance()

(cherry picked from commit 5537218c94)
2017-09-13 13:43:16 -07:00
56852b0a35 Add ec2_remote_facts replacement to changelog
(cherry picked from commit c77e3a74dd)
2017-09-13 13:09:48 -07:00
57683caa44 Improve ansible-test HttpClient error handling. (#30301)
- Automatic retries on DNS lookup failures.
- Handle API errors in shippable.py.
(cherry picked from commit 1a602096f5)
2017-09-13 13:09:42 -07:00
04cc8a9468 [cloud] Don't alter dictionary during iteration in elb_target_group_facts, avoiding RuntimeError (#30247)
Don't update the target_group_attributes dict
while iterating over it.

Fixes #30190
(cherry picked from commit fd18d7ebb5)
2017-09-13 11:37:30 -07:00
692942b37a Update changelog with 2.3.x changes 2017-09-13 11:35:08 -07:00
fa1166dc37 [cloud] ec2_group: Handle duplicate names between EC2 classic and VPC groups (#28931)
* ec2_group: Handle name conflict with empty vpc_id.

If several groups exist with the same name (and vpc_id is None) then
treat the group outside the vpc as preferred (same as it would for a vpc
group with vpc_id specified). Also don't run the egress rules code in
that case.

* Handle lack of `IpPermissionsEgress` attribute on EC2 classic groups

In EC2 classic groups, the `while True` loop checking for egress
permissions will continue infinitely.

* Handle incompatible combinations of EC2 Classic + VPC groups

* Fix integration tests in accounts lacking EC2 classic

This change checks against the security group created, instead of the
module parameters, for VPC ID. This means that new accounts with a
default VPC will still wait properly for the first egress rule to
populate.

* Fix conditional for storing described groups with preference for matching VPC IDs

* Revert `vpc_id is None` on conditional to allow for default VPCs

(cherry picked from commit 4bc4abfe1b)
2017-09-13 11:21:18 -07:00
328689a15b windows command changed to use CreateProcess (#30253)
* windows command changed to use CreateProcess

* change to get become to work

(cherry picked from commit 6d196eaa98)
2017-09-13 10:52:31 -07:00
5fdffe26ee CHANGELOG update for win_shell/command parsing fixes 2017-09-13 10:44:06 -07:00
91f4925de2 Updated Display.do_var_prompt to use to_native on prompt ( Fixes #30265 ) (#30285)
* Updated Display.prompt to use the normalized prompt message.

(cherry picked from commit ea8af15dfe)
2017-09-13 09:58:46 -07:00
6e766c032a Fix conditional inheritance on dynamic includes (tasks and roles) (#30178)
Per the new style of execution, for dynamic tasks conditionals are expected
to only affect the include task itself and should not be inherited by child
tasks. This patch brings the behavior inline with this expectation.

Fixes #27845
(cherry picked from commit b38f746604)
2017-09-13 09:55:08 -07:00
869abfa541 Remove some non-ascii chars from strings
quote some unwieldy strings, etc.

(cherry picked from commit b2ac60cfd7)
2017-09-13 09:24:12 -07:00
d9acf07150 Fixes #27336 - nxos_gir_profile_management issue while creating profile (#29151)
* Fixes #27336

* Correct documentation errors

(cherry picked from commit f1cc5a928c)
2017-09-13 09:15:06 -07:00
4bf6b9aa27 Fixes #27138 (#29064)
(cherry picked from commit bc6e015a86)
2017-09-13 09:15:06 -07:00
1f9495cfaa fix nxos_file_copy and provider getting set to None when transport is cli (#30262)
* nxos_file_copy bug fix

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* provider gets set to None in module level when transport is cli

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

(cherry picked from commit 578ae3b238)
2017-09-13 09:15:06 -07:00
bcfc78b2e4 NXOS Commit Integration tests to Ansible (part 1) (#28935)
* cleanup nxos_bgp_neighbor_af tests

* add timeout and to_json to nxapi testing for nxos_command

* maintain folder naming consistency with other tests

(cherry picked from commit caafc8e591)
2017-09-13 09:01:01 -07:00
aca0d1a2f8 Fix ios_system lookup enable issue (#30263)
Fixes #29974

Add `None` check while comparing module parameter values (want) with the actual
configuration present on device (have).
(cherry picked from commit d8371cec91)
2017-09-13 08:55:54 -07:00
ba30a8e4c7 fixed become to show the stdout and stderr streams instead of the StreamReader (#30254)
(cherry picked from commit 77b2aca5a2)
2017-09-13 08:54:16 -07:00
50d8b390d1 yum: revert incorrect change from 0bbd5c7458 2017-09-13 08:51:55 -07:00
9fc409e126 Fix nxos_mtu nxapi failure (#30153)
(cherry picked from commit cef7ed0310)
2017-09-12 22:43:41 -07:00
f1aa2a4803 Add azure module deprecation to changelog 2017-09-12 15:12:37 -07:00
9dbad4109f deprecated azure classic module (#30241)
(cherry picked from commit 212bb76326)
2017-09-12 15:12:33 -07:00
f13bf9893a ACI EPG TO DOMAIN: Add vm_provider docstring and add support for micr… (#29114)
* ACI EPG TO DOMAIN: Add vm_provider docstring and add support for microsoft and openstack

* Fix typo

* Fix whitespace

(cherry picked from commit 2489eeece0)
2017-09-12 14:54:09 -07:00
ebdbc926ce Fix nxos_smu error (#30157)
(cherry picked from commit f973f93963)
2017-09-12 14:19:30 -07:00
13321de19d windows facts: better way to get machine SID (#29821)
* windows facts: better way to get machine SID

* remove the substring and just get the property that contains the value we need

(cherry picked from commit f6858cdd4d)
2017-09-12 13:41:20 -07:00
0bbd5c7458 yum: fallback to epoch=0 if not available
(cherry picked from commit 59702318e1)
2017-09-12 13:31:07 -07:00
2f3c1867f7 Use 'hostname switch' on setup/teardown tasks for nxos_config non_idempotent (#29132)
inventory_hostname breaks CI due to too long string.
(cherry picked from commit 497e6cf405)
2017-09-12 11:52:33 -07:00
3483040a17 module_utils_fix_dellos6 (#28060)
(cherry picked from commit adc533804a)
2017-09-12 10:29:12 -07:00
c92f44a806 Handle wait_for_deployment_completion during Azure deployment. (#26079)
Pull the get_poller_result inside the if block so that if the caller has
wait_for_deployment_completion=False, it doesnt block and wait for it to
finish.

Also, since the result contains information about the deployment, provide
None values for it in the output.(Not sure if this needs to be documented)

Fixes #26014
(cherry picked from commit c0000bc722)
2017-09-12 10:15:52 -07:00
77d1935f61 only eval values if set from defaults
(cherry picked from commit a2b3bb1e49)
2017-09-12 10:05:38 -07:00
016b323735 Updated pip module to always return changed if venv is created (#24233)
* Updated pip module to always return changed if venv is created

Fixes #23204

* Add integration test to pip (see #23204)

(cherry picked from commit 6dbc3c63f8)
2017-09-12 10:01:57 -07:00
d2f879a266 support missing drive letters in PS path type (#29884)
* fixes #26623
* Test-Path (and thus `-type path` in Get-AnsibleParam) fail on a nonexistent drive letter, since it can't be mapped to a PSProvider.
* added support and basic smoke tests for
(cherry picked from commit 1e2ce4c8ab)
2017-09-12 09:56:16 -07:00
2790df7d1c Bug Fixes for Vlan Name not assigned and Switch Error (#29953)
(cherry picked from commit 32f0c9f809)
2017-09-12 08:27:34 -07:00
2f0144b26a Ignore routes that are not static manually added (#29094)
Fixes #28841
(cherry picked from commit f9f0472ba5)
2017-09-12 08:26:26 -07:00
4067c3616c Fix nxos_user tests (#30048)
On our CI we use SSH port 8022, so parameterized the test passing
-p {{ ansible_ssh_port }}.
Also, force user/pass auth.
(cherry picked from commit b30cd60829)
2017-09-12 08:26:18 -07:00
36f5471f8c Document return values for ec2_vpc_net.py (#21294)
* Document return values for ec2_vpc_net.py

* Prepend "vpc" to return values
2017-09-12 07:42:16 -07:00
61acd35da4 make os_security_group_rule idempotent (#23707)
* Fix issue #19610
(cherry picked from commit 6b6e5665aa)
2017-09-12 07:24:29 -07:00
7b3999560b Remove provider lines from iosxr tests (#29956)
We don't use authorize on iosxr nor we use a special transport,
so no need to use iosxr for CLI at all.
(cherry picked from commit 1da7194534)
2017-09-12 07:24:28 -07:00
9107a9904b nxos_system parse name_servers fix (#29944)
* nxos_system parse name_servers fix

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* fix nxos_system tests

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

(cherry picked from commit 5b1c91bf19)
2017-09-12 07:23:26 -07:00
7d982f9225 nxos_command and nxos_config fix (#29940)
* fix nxos_command nxapi test output

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
(cherry picked from commit 9dee5c65ce)

* nxos_config CI fix

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
(cherry picked from commit 8810a7e584)
2017-09-11 22:24:15 -07:00
8fd3ce0fec New release v2.4.0.0-0.2.rc2 2017-09-11 20:01:16 -07:00
73304f50a3 ec2: fixes #19521, fixes #29456 - create instance-store AMI instances with correct shutdown behavior (#28885)
* Create instance-store AMI instances with 'terminate' as the shutdown behavior since it is required.

* Match on the error code instead of searching for a string in the message.

* Narrow conditional to only fix shutdown behavior if fixing it would help

* Fix pep8.
2017-09-11 19:54:35 -07:00
0d2154646f Port ansible doc for plugins to use DOCUMENTATION variables
* Using docstrings conflicts with the standard use of docstrings
* PYTHON_OPTIMIZE=2 will omit docstrings.  Using docstrings makes future
  changes to the plugin and module code subject to the requirement that we
  ensure it won't be run with optimization.

(cherry picked from commit cc343a4376)
2017-09-11 18:35:29 -07:00
b4e4a44314 Fix pylint issue.
(cherry picked from commit 4de6076d78)
2017-09-11 18:11:36 -07:00
525c318678 module and vault fixes (#29663)
* module and vault fixes

- fix module_path cli option and usage, which fixes #29653
- move --output to be in subset of vault cli, no need for all vault enabled cli to use it
- added debug to loader to see directories added

(cherry picked from commit 2165bac212)
2017-09-11 18:07:23 -07:00
527380ac91 Fix bugs with modules_support.rst
(cherry picked from commit 88aa0b7645)
2017-09-11 17:33:36 -07:00
0742e58e78 Fix ansible-test unicode and sanity tests. (#29743)
* Show warning when using pylint on Python 2.6.
* Add pylint disable entries for Python 2.
* Fix unicode handling in ansible-test.
* Add missing documentation.

(cherry picked from commit 79bc49e150)
2017-09-11 17:31:29 -07:00
525c2a3e85 Expand disabled pylint rules. (#29162)
* Expand disabled pylint rules.
* Fix pylint and unicode issues in ansible-test.
(cherry picked from commit f88750d665)
2017-09-11 17:31:26 -07:00
404b02a1cb Add python3 fixes to changelog 2017-09-11 15:48:37 -07:00
46f75e0f3d Refactor easy_install module
* PEP8 fix
* Rectified string check in package install command stdout
* Add abadger's code review changes

Fixes #22245

Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
(cherry picked from commit b5eca624d0)
2017-09-11 15:46:12 -07:00
670b09224f Adds missing docs and downstream fixes (#29664)
Partition docs are not a documentation fragment, so they need to
be added
(cherry picked from commit a36ebd979d)
2017-09-11 15:36:51 -07:00
e842ac4e3f win_unzip: added support for Server core by using .net zip functions (#29272)
* win_unzip: added support for Server core by using .net zip functions

* fixed unzip behaviour with folders

(cherry picked from commit 5623e679b8)
2017-09-11 15:35:11 -07:00
c3bf59eb79 ec2_vol: wait for delete_on_termination to be set to the correct value. Fixes #22534. (#28848)
wait for delete_on_termination to be set to the correct value, it can take some time to correctly reflect the setting sent in the API call.
2017-09-11 14:37:30 -07:00
1586274fe5 Use JSON returns values to create RETURN docs
After running hacking/test-module to generate some output,
the JSON output can be fed into the return skeletion generator
to create an excellent starting point for RETURN docs

(cherry picked from commit 5e978b0f2b)
2017-09-11 14:33:29 -07:00
cc995a2477 openssl_csr: consistent param namings (#29604)
* harmonize openssl-csr argument names

* the module has been introduced by 2.4 not only the privatekey_passphrase

(cherry picked from commit 177ce3014c)
2017-09-11 14:11:59 -07:00
1c7a91a725 refactor firewalld module with object abstraction (#26487)
* refactor firewalld module with object abstraction

This change creates a FirewallTransaction object that each
individual transaction type is a sub-class of as they all follow the
same pattern to enable or disable something in the firewall.

Also, there's a few bugfixes here:
    - Fix the "source" type to handle permanent operations
    - Remove ambiguity of required parameters for only specific use
      cases that can lead to transactions effectively being a no-op.
      Instead, pick sane defaults and document them.
    - Change how imports are done so globals are no longer needed

This is based on the original feedback by Toshio from the last
refactor attempt:

    https://github.com/ansible/ansible-modules-extras/pull/3383

Signed-off-by: Adam Miller <maxamillion@fedoraproject.org>

* fix line too long for pep8 for shippable tests

Signed-off-by: Adam Miller <maxamillion@fedoraproject.org>

* remove firewalld from pep8/legacy-files

Signed-off-by: Adam Miller <maxamillion@fedoraproject.org>

(cherry picked from commit 75127092f2)
2017-09-11 14:10:37 -07:00
34db3cd9be allow config for callbaks and some fixes
* only complain about ini deprecation if value is set
 * set plugin config for stdout and other types
 * updated plugin docs, moved several plugins to new config
 * finished ssh docs
 * fixed some issues seen in plugins while modifying docs
 * placeholder for 'required'
 * callbacks must use _plugin_options as _options already in use

(cherry picked from commit 869a318492)
2017-09-11 14:00:32 -07:00
61315cd3c5 Remove use of unicode_literals as it is an anti-pattern
from __future__ unicode_literals leads to developer confusion as
developers no longer can tell whether a bare literal string is a byte
string or a unicode string.  Explicit marking as u"" or b"" is the way
to solve the same problem in the Ansbile codebase.

(cherry picked from commit ff13d58c14)
2017-09-11 13:34:21 -07:00
baec8cf95a dnf: add environment upgrade test
(cherry picked from commit 0daacdccf8)
2017-09-11 11:45:44 -07:00
d396351817 Change ansible-doc usage to show -a is for internal use (#29603)
* Change ansible-doc usage to show -a is for internal use

ansible-doc -a is for testing that documentation is sane.  It should not
be used by normal users in production.  The main reason for this is that
it is designed to fail if there are any undocumented modules or plugins.
This is good for testing that all plugins we ship are documented.  It is
not good for end users who may have undocumented third-party plugins.
(cherry picked from commit cfaea8a053)
2017-09-11 11:27:05 -07:00
305d5b4d5f Define byte strings versus text strings in docker connection
Fixes python3 string handling in the docker connection plugin

Fixes #24776

(cherry picked from commit 3277e6328b)
2017-09-11 09:55:31 -07:00
5db6b61cf0 dnf: fix TypeError when env/group failed
(cherry picked from commit de299ef77c)
2017-09-11 09:39:23 -07:00
f64c55e58f fix cs_zone_facts tests, namespace feature removed (#29184)
* fix cszonefacts .. namespace feature removed

* also removed the 2nd instance of ansible_facts

(cherry picked from commit 444a5b5389)
2017-09-11 09:38:44 -07:00
557cf0d17a rename nxos test basic-no-exec to basic-no-motd (#29144)
Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
(cherry picked from commit 2ff9888923)
2017-09-11 09:13:27 -07:00
91ca89063c nxos_banner CI fix (#29134)
Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
(cherry picked from commit 588bddbc35)
2017-09-11 09:13:27 -07:00
9f4b8d115a Disable nxapi test for nxos_banner (#29088)
Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
(cherry picked from commit 757983d808)
2017-09-11 09:13:27 -07:00
c439b9e009 Create a new pipe for sshpass on retries. Fixes #29095
(cherry picked from commit d043ba2673)
2017-09-11 08:49:34 -07:00
c47da38d43 Update docs version string
Hack until https://github.com/ansible/ansible/issues/28553 is fixes
2017-09-11 07:52:35 -07:00
b9a4fdd616 Fix handling of config vars with eval expression (#29536)
The config variables defined with eval, like INVENTORY_IGNORE_EXTS,
are not stored properly once the eval is processed.
This causes references to the constant to still have the eval in the
value.
(cherry picked from commit f0aa31b49e)
2017-09-11 07:22:48 -07:00
54cfca0ea3 Fixes #20443 - Adjust version checking regex to account fo no comma in IOS-XE (#29157)
* Adjust version checking regex to account fo no comma in IOS-XE
* Adjusted regex to include last character of version number

(cherry picked from commit e5d247fdc0)
2017-09-11 07:08:55 -07:00
18db4089a7 Fix wheel dependency on python 2.6. (#29388)
* Fix wheel dependency on python 2.6.
* Limit wheel version for tox on python 2.6.

(cherry picked from commit 50ae33d3c1)
2017-09-11 07:01:04 -07:00
3aa1cedc4a Add check for port and host in ios_interface (#29119)
Fixes #29118
(cherry picked from commit 772dab55c6)
2017-09-11 07:00:29 -07:00
993eedaa94 Fix section in known_hosts documentation
SSHD is part of section 8, SSH is part of section 1.
(cherry picked from commit 61d2620098)
2017-09-10 20:25:37 -07:00
51a9875cfd Handle missing docker-py better (#27540)
* Update docker inventory to use APIClient

docker-py has been updated, and the `Client` class no longer
exists. We use the new `APIClient` class.

To provide graceful failure when docker-py is not installed,
we need to create a dummy `Client` class so that the inventory
script will get as far as displaying a useful error message

Before

```
$ contrib/inventory/docker.py --pretty
Traceback (most recent call last):
  File "contrib/inventory/docker.py", line 418, in <module>
    class AnsibleDockerClient(Client):
NameError: name 'Client' is not defined
```

After

```
$ contrib/inventory/docker.py --pretty
Failed to import docker-py. Try `pip install docker-py` - cannot import name Client
```

* docker inventory configuration file location

Allow docker.yml to live next to docker.py, as well as in the
current directory

(cherry picked from commit f9a179f770)
2017-09-10 19:07:16 -07:00
b62c60ef86 remove fact namespacing
since we want to make namespaced facts drop ansible_ prefix but don't have the
time before release to perfect this feature, we are going to postpone it for now
until we have the resources to fix this issue. That way we won't have people relying
on the 'incorrect' names for a release.

(cherry picked from commit 0c291ece1a)
2017-09-10 14:47:44 -07:00
db363160a6 Fix SID Lookup Issues on Assorted Windows Modules (#28979)
* fix sid lookup issues and update copyright/license to latest format

* simplify win_owner and win_share by removing unnecessary function

(cherry picked from commit 8f050d3719)
2017-09-10 14:45:23 -07:00
b4c7812747 consul + Python 3.5 (#23935)
* Fix #23934 - consul + Python 3.5
* List comprehension instead of filter with lambda

(cherry picked from commit ab7c850360)
2017-09-09 18:41:25 -07:00
738f08d627 Fixes #23680 bug with py3.x due to binary string handling (#23688)
* This commit includes a unit test to exercise the _is_role
function and make sure it doesn't break in any Python version.
* Import os.path and other minor fixups

(cherry picked from commit 8e4f112b39)
2017-09-09 18:40:30 -07:00
a0989d125d conn,buildah: don't pass bytes to shlex.split (#27896)
* conn,buildah: don't pass bytes to shlex.split on python3
(cherry picked from commit 0274835add)
2017-09-09 17:41:05 -07:00
8eab6a43f7 Fix set theory filters for python3
The set theory filters need to use lists rather than generators on python3.

Also add unit tests for most of the mathstuff filters

Fixes #26494

(cherry picked from commit 75249e311e)
2017-09-09 17:40:55 -07:00
4e5051fe00 Romain dartigues fixes (#29169)
* cloud: azure: fix typo introduced in commit 16d23e9

The commit "Add reference to VNET resource group (#26052)"
removed an used variable.

* network: aos: error hint never shown

(cherry picked from commit 6797221107)
2017-09-09 16:21:20 -07:00
1478d0fcf3 Fixes #26793: convert insert regex to_bytes before searching
(cherry picked from commit fcad4f38b4)
2017-09-09 12:49:24 -07:00
75309386d7 Update qos parameter for volume manager and update example. (#27594)
(cherry picked from commit 2bab91551d)
2017-09-09 12:29:32 -07:00
0521f9d26f Fix py3 string issue in jail connection plugin (take 2) (#28374)
* Fix py3 string issue in jail connection plugin

(cherry picked from commit 436b173b24)
2017-09-09 11:53:07 -07:00
80b41165cb Misc typo corrections
Fix adds correction for typos

* Anisble to Ansible
* Fasle to False

Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
(cherry picked from commit 8f6626bd8f)
2017-09-09 10:26:30 -07:00
dbcdf97252 ec2_group: unnest variable assignment. Fixes #29113.
(cherry picked from commit 0ac4a82f3b)
2017-09-09 10:20:42 -07:00
972fbbba22 cloudtrail: import botocore.exceptions in a try/except.
(cherry picked from commit 6ae201d3b1)
2017-09-09 10:11:04 -07:00
63b4e41d0c fixes to config/setting retrieval
- better variable precedence management
- universal plugin option handling
- also updated comments for future directions
- leverage fragments for plugins
- removed fact namespacing
- added 'firendly name' field
- updated missing descriptions
- removed some unused yaml entries, updated others to reflect possible future
- documented more plugins
- allow reading docs using alias
- short licenses
- corrected args for 'all plugins'
- fixed -a option for ansible-doc
- updated vars plugins to allow docs
- fixed 'gathering'
- only set options IF connection
- added path list and renamed pathspec mostly the diff is , vs : as separator
- readded removed config entries that were deprecated but had no message ... and deprecated again
- now deprecated entries give warning when set

(cherry picked from commit 075ead8fb0)
2017-09-09 09:50:11 -07:00
57f2fee4d9 Fixes #19666 Correct AMI information output by ec2_ami module (#27021)
Add AMI name and platform to outputs on AMI creation
2017-09-08 15:08:57 -07:00
51949fdeec generate rst doc pages for command line tools (#27530)
* let generate_man also gen rst pages for cli tools
* make template-file, output-dir, output format cli options for generate_man
* update main Makefile to use generate_man.py for docs (man pages and rst)
* update vault docs that use :option:
* Edits based on
6e34ea6242 and
a3afc78535

* add a optparse 'desc' to lib/ansible/cli/config.py

  The man page needs a short desc for the 'NAME' field
  which it gets from the option parse 'desc' value.

  Fixes building ansible-config man page.

* add trim_docstring from pep257 to generate_man

  use pep258 docstring trim function to fix up any indention
  weirdness inherit to doc strings (ie, lines other than
  first line being indented.

* Add refs to cli command actions

To reference ansible-vaults --vault-id option, use:

:option:`The link text here <ansible-vault --vault-id>`

or:

:option:`--vault-id <ansible-vault --vault-id>`

To reference ansible-vault's 'encrypt' action, use:

:ref:`The link text here <ansible_vault_encrypt>`

or most of the time:

:ref:`ansible-vault encrypt <ansible_vault_encrypt>`
(cherry picked from commit 89c973445c)
2017-09-08 12:16:33 -07:00
66a244facc change generated playbooks_keywords.rst to use an rst 'glossary' (#28843)
* Use a rst glossary for playbooks_keywords docs
* Add a 'Task' and 'Tasks' to glossary.
* Update keywords desciptions,
* use :term: rst ref, some quoting
* Make it more obvious that 'retries' and 'until' need to be used in combination.

(cherry picked from commit 52f2edf19d)
2017-09-08 12:15:22 -07:00
84203a45e9 config: use path list for default inventory
This allows to use a pathlist in the ansible.cfg:

  [default]
  inventory = path/inventory:other_path/inventory

Since ansible allows to use --inventory on CLI more then once, we should also support a pathlist in the config.

(cherry picked from commit da488a8db5)
2017-09-08 11:37:48 -07:00
c072a5406f [cloud] EC2 AutoScaling fix for respecting zero as the desired, min&max size values (#27870) 2017-09-08 10:05:33 -07:00
69721cade6 Revert "Temporarily disable failing opensuse test jobs."
This reverts commit 31d2eb0828.

(cherry picked from commit 67c7bd8745)
2017-09-08 09:56:10 -07:00
a9d81ef3db Db cache fix (#29048)
* cleaner get for file based caches
* now db based facts behave like file ones
we now keep local in mem cache to avoid race conditions on expiration during ansible runs
(cherry picked from commit 13d1520f3d)
2017-09-07 09:22:34 -07:00
6d5eb06cc5 win_regedit: fixed up diff output to be more representative of type (#28974)
* win_regedit: fixed up diff output to be more representative of type

* added diff fix for creation of key and prop in one go

(cherry picked from commit 91e7c3ec81)
2017-09-07 04:07:40 -07:00
37c174b5ec win_user: add return info (#28975)
(cherry picked from commit 4a577bd67f)
2017-09-07 04:06:59 -07:00
18fdc34ecf clarify import_ docs (#28395)
* clarify import_ docs

* fixed izpellz

* Copy edits.

(cherry picked from commit f4fff54f68)
2017-09-06 21:59:07 -07:00
647170b040 introducing ALSO YAML inventory (#28596)
* introducing ALSO YAML inventory

* Copy edits

(cherry picked from commit c3550b58ed)
2017-09-06 21:57:24 -07:00
9ff5ac344f Fix rst syntax issue in docs. 2017-09-06 20:45:56 -07:00
dbc7444376 fix check mode for solaris enable/disable (#29049)
(cherry picked from commit 7804049592)
2017-09-06 18:11:57 -07:00
78cae22938 updated modules support page with new information (#29071)
* updated modules support page with new information

* Minor wording tweaks.
2017-09-06 17:15:12 -07:00
294560e91e Improve handling of first CI run for new branch. (#29070)
(cherry picked from commit a1453a7917)
2017-09-06 16:40:48 -07:00
5ce6066e4c less confusing 'args' message (#29053)
* less confusing 'args' message

* fix test

* gone native

(cherry picked from commit fe3b4325c2)
2017-09-06 15:33:09 -07:00
39dd34f05e Revert "Remove windows tests so that we can workaround a timeout running all windows tests on shippable"
This reverts commit a61fd31e2e.

Now that shippable has run once, it won't run the complete windows tests
anymore so we don't have to worry about any timeouts anymore.
2017-09-06 15:26:41 -07:00
a61fd31e2e Remove windows tests so that we can workaround a timeout running all windows tests on shippable 2017-09-06 15:25:12 -07:00
e18aff861e New release v2.4.0.0-0.1.rc1 2017-09-06 13:36:33 -07:00
686 changed files with 16895 additions and 8407 deletions

View File

@ -13,7 +13,7 @@ Also test if the latest release, and master branch are affected too.
<!--- Name of the module/plugin/task/feature -->
##### ANSIBLE VERSION
<!--- Paste verbatim output from “ansible --version” between quotes below -->
<!--- Paste verbatim output from "ansible --version" between quotes below -->
```
```
@ -27,7 +27,7 @@ Mention any settings you have changed/added/removed in ansible.cfg
##### OS / ENVIRONMENT
<!---
Mention the OS you are running Ansible from, and the OS you are
managing, or say “N/A” for anything that is not platform-specific.
managing, or say "N/A" for anything that is not platform-specific.
Also mention the specific version of what you are trying to control,
e.g. if this is a network bug the version of firmware on the network device.
-->

View File

@ -18,7 +18,7 @@ the change does.
<!--- Name of the module/plugin/module/task -->
##### ANSIBLE VERSION
<!--- Paste verbatim output from “ansible --version” between quotes below -->
<!--- Paste verbatim output from "ansible --version" between quotes below -->
```
```

2
.gitignore vendored
View File

@ -38,6 +38,8 @@ docs/docsite/rst/partner_maintained.rst
docs/docsite/rst/playbook_keywords.rst
docs/docsite/rst/playbooks_directives.rst
docs/docsite/*.html
docs/docsite/rst/ansible.rst
docs/docsite/rst/ansible-*.rst
docs/docsite/_static/*.gif
docs/docsite/_static/*.png
docs/docsite/_static/websupport.js

View File

@ -1,7 +1,152 @@
Ansible Changes By Release
==========================
## 2.4 "Dancing Days" - ACTIVE DEVELOPMENT
<a id="2.4.1"></a>
## 2.4.1 "Dancing Days" - TBD
### Bugfixes
* Security fix for CVE-2017-7550 the jenkins_plugin module was logging the jenkins
server password if the url_password was passed via the params field:
https://github.com/ansible/ansible/pull/30875
* Update openssl\* module documentation to show openssl-0.16 is the minimum version
* Fix openssl_certificate's csr handling
* Python-3 fixes
* Fix openssl_certificate parameter assertion on Python3
* Fix for python3 and nonascii strings in inventory plugins (https://github.com/ansible/ansible/pull/30666)
* Fix missing urllib in iam_policy
* Fix crypttab module for bytes<=>text string mismatch ( https://github.com/ansible/ansible/pull/30457 )
* Fix lxc_container module combining bytes with text ( https://github.com/ansible/ansible/pull/30572 )
* Fix map doesn't return a list on python3 in ec2_snapshot_facts module (https://github.com/ansible/ansible/pull/30606)
* Fix uri (and other url retrieving) modules when used with a proxy. (https://github.com/ansible/ansible/issues/31109)
* Fix azure_rm dynamic inventory script ConfigParser usage.
* Fix for win_file to respect check mode when deleting directories
* Fix for Ansible.ModuleUtils.Legacy.psm1 to return list params correctly
* Fix for a proper logout in the module ovirt_vms
* Fixed docs for 'password' lookup
* Corrected and added missing feature and porting docs for 2.4
* Fix for Ansible.ModuleUtils.CamelConversion to handle empty lists and lists with one entry
* Fix nxos terminal regex to parse username correctly.
* Fix colors for selective callback
* Fix for 'New password' prompt on 'ansible-vault edit' (https://github.com/ansible/ansible/issues/30491)
* Fix for 'ansible-vault encrypt' with vault_password_file in config and --ask-vault-pass cli (https://github.com/ansible/ansible/pull/30514#pullrequestreview-63395903)
* updated porting guide with notes for callbacks and config
* Added backwards compatiblity shim for callbacks that do not inherit from CallbackBase
* Corrected issue with configuration and multiple ini entries being overwriten even when not set.
* backported fix for doc generation (plugin_formatter)
* Fix ec2_lc module for an unknown parameter name (https://github.com/ansible/ansible/pull/30573)
* Change configuration of defaults to use standard jinja2 instead of custom
eval() for using variables in the default field of config (https://github.com/ansible/ansible/pull/30650)
* added missing entry in chlog deprecation
* Fixed precedence and values for become flags and executable settings
* Fix for win_domain_membership to throw more helpful error messages and check/fix when calling WMI function after changing workgroup
* Fix for win_power_plan to compare the OS version's correctly and work on Windows 10/Server 2016
* Fix module doc for typo in telnet command option
* Fix OpenBSD pkg_mgr fact (https://github.com/ansible/ansible/issues/30623)
* Fix encoding error when there are nonascii values in the path to the ssh binary
* removed YAML inventory group name validation, broke existing setups and should be global in any case, and configurable
* performance improvment for inventory, had slown down considerably from 2.3
* Fix cpu facts on sparc64 (https://github.com/ansible/ansible/pull/30261)
* Fix ansible_distribution fact for Arch linux (https://github.com/ansible/ansible/issues/30600)
* remove print statements from play_context/become
* Fix vault errors after 'ansible-vault edit' (https://github.com/ansible/ansible/issues/30575)
* updated api doc example to match api changes
* corrected issues with slack callback plugin
* it is import_playbook .. not import_plays .. docs now reflect this
* fixed typo and missed include/import conversion in import_tasks docs
* updated porting docs with note about inventory_dir
* removed extension requirement for yaml inventory plugin to restore previous behaviour
* fixed ansible-pull to now correctly deal with inventory
* corrected dig lookup docs
* fix type handling for sensu_silence so the module works
* added fix for win_iis_webapppool to correctly handle array elements
* Fix bugs caused by lack of collector ordering like service_mgr being incorrect (https://github.com/ansible/ansible/issues/30753)
* Fix os_image when the id parameter is not set in the task. ( https://github.com/ansible/ansible/pull/29147 )
* Fix for the winrm connection to use proper task vars
* removed typo from dig lookup docs
* Updated win_chocolatey example to be clearer around what should be used with become
* Fix for copy module when permissions are changed but the file contents are not ( https://github.com/ansible/ansible/issues/30556 )
* corrected YAML_FILENAME_EXTENSIONS ini setter as key/section were swapped
* Better error message when a yaml inventory is invalid
* avoid include_Xs conflating vars with options
* Fix aws_s3 module handling `encrypt` option (https://github.com/ansible/ansible/pull/31203)
* Fix for win_msg to document and show error when message is greater than 255 characters
* Fix for win_dotnet_ngen to work after recent regression
* fixed backwards compat method for config
* removed docs for prematurely added ssh specific pipelining settings
* fixed redis cache typo
* Fix AttributeError during inventory group deserialization (https://github.com/ansible/ansible/issues/30903)
* Fix 'ansible-vault encrypt --output=-' (https://github.com/ansible/ansible/issues/30550)
* restore pre 2.4 pipeline configuration options (env and ini)
* Fix win_copy regression: handling of vault-encrypted source files (https://github.com/ansible/ansible/pull/31084)
* Updated return values for win_reg_stat to correctly show what is being returned (https://github.com/ansible/ansible/pull/31252)
* reduced normal error redundancy and verbosity, display on increased and when needed
* Give an informative error instead of a traceback if include_vars dir is file instead of directory (https://github.com/ansible/ansible/pull/31157)
* Fix monit module's version check for color support (https://github.com/ansible/ansible/pull/31212)
* Make `elasticsearch_plugin` module work with both 2.x and 5.x (https://github.com/ansible/ansible/issues/21989)
* Fix for become on Windows to handle ignored errors (https://github.com/ansible/ansible/issues/30468)
* Fix removal of newlines when writing SELinux config (https://github.com/ansible/ansible/issues/30618)
* clarified extension requirement for constructed inv plugin
* really turn off inventory caching, toggle will be added in 2.5
* for inventory sources, dont follow symlinks to calculate base directory, used for group/host_vars
* Port the uptime.py example script to the new inventory API.
* inventory_file variable again returns full path, not just basename
* added info about cwd group/host vars to porting guide
* Fix name parsing out of envra in the yum module
* give user friendly error on badly formatted yaml inventory source
* Fix any_errors_fatal setting in playbooks.
* Fix setting of ssh-extra-args from the cli (https://github.com/ansible/ansible/pull/31326)
* Change SELinux fact behavior to always return a dictionary. (https://github.com/ansible/ansible/issues/18692)
* Revert a fix for using non /bin/sh shells for modules' running commands as
this was causing output from commands to change, thus breaking playbooks.
See the original bug for details and links to the eventual fix:
https://github.com/ansible/ansible/issues/24169
* Do not log data field in `docker_secrets` module (https://github.com/ansible/ansible/pull/31366)
* Fix rpm_key taking the wrong 8 chars from the keyid (https://github.com/ansible/ansible/pull/31045)
* chown errors now more informative
* Fix for win_copy to copy a source file that has invalid windows characters in the filename, the dest still must be have valid windows characters (https://github.com/ansible/ansible/issues/31336#issuecomment-334649927)
* Fix systemd module to not run daemon-reload in check mode.
* fixed some parsing and selection issues with inventory manager, fixed minor bugs in yaml and constructed plugins
* Fix the ping module documentation to reference win_ping instead of itself: https://github.com/ansible/ansible/pull/31444
* Fix for ec2_win_password to allow blank key_passphrase again (https://github.com/ansible/ansible/pull/28791)
* added toggle for vars_plugin behaviour to execute relative to playbook, set default to revert to previous way.
* Fix for win_copy to not remove destination file on change when in check mode (https://github.com/ansible/ansible/pull/31469)
* Fix include_role usage of role_name (https://github.com/ansible/ansible/pull/31463)
* Fix service and package forcing a second run of the setup module to function (https://github.com/ansible/ansible/issues/31485)
* Better error message when attempting to use include or import with /usr/bin/ansible (https://github.com/ansible/ansible/pull/31492/)
* Fix `sysctl` module to remove etries when `state=absent` (https://github.com/ansible/ansible/issues/29920)
* Fix for ec2_group to avoid trying to iterate over None (https://github.com/ansible/ansible/pull/31531)
* Fix for ec2_group for a possible KeyError bug (https://github.com/ansible/ansible/pull/31540)
* Fix for the rpm_key module when importing the first gpg key on a system (https://github.com/ansible/ansible/pull/31514)
* Fix for aws_s3 metadata to use the correct parameters when uploading a file (https://github.com/ansible/ansible/issues/31232)
* Fix for the yum module when installing from file/url crashes (https://github.com/ansible/ansible/pull/31529)
* Improved error messaging for Windows become/runas when username is bogus (https://github.com/ansible/ansible/pull/31551)
* Fix rollback feature in junos_config to now allow configuration rollback on device (https://github.com/ansible/ansible/pull/31424)
* Remove command executed log from ansible-connection (https://github.com/ansible/ansible/pull/31581)
* Fix relative paths to be relative to config file when there is no playbook available (https://github.com/ansible/ansible/issues/31533)
* Fix Inventory plugins to use the configured inventory plugin path (https://github.com/ansible/ansible/issues/31605)
* Fix include task to be dynamic (https://github.com/ansible/ansible/issues/31593)
* A couple fixes to the test process to account for new testing resources in
our ci system and an upstream cryptography update that didn't work with
pip-8.x
* Document backup_path in a few dellos modules and vyos_config (https://github.com/ansible/ansible/issues/31844)
* Fix for vmware_vm_facts with dangling inaccessible VM which don't have MAC addresses (https://github.com/ansible/ansible/pull/31629)
* Fix for win_regedit sending extra data that could confuse ansible's result parsing (https://github.com/ansible/ansible/pull/31813)
* Fix git module to correctly cleanup temporary dirs (https://github.com/ansible/ansible/pull/31541)
* Fix for modules which use atomic_move() to rename files raising an exception
if a file could not be opened. Fix will return a nice error message instead:
https://github.com/ansible/ansible/issues/31786
* Fix ansible-doc and ansible-console module-path option (https://github.com/ansible/ansible/pull/31744)
* Fix for hostname module on RHEL 7.5 (https://github.com/ansible/ansible/issues/31811)
### Known Bugs
* Implicit localhost is getting ansible_connection from all:vars instead of
from the implicit localhost definition (https://github.com/ansible/ansible/issues/31420)
<a id="2.4"></a>
## 2.4 "Dancing Days" - 2017-09-19
### Major Changes
@ -9,8 +154,6 @@ Ansible Changes By Release
* New import/include keywords to replace the old bare `include` directives. The use of `static: {yes|no}` on such includes is now deprecated.
- Using `import_*` (`import_playbook`, `import_tasks`, `import_role`) directives are static.
- Using `include_*` (`include_tasks`, `include_role`) directives are dynamic.
* Added fact namespacing, from now on facts will be available under `ansible_facts` namespace (i.e. `ansible_facts.ansible_os_distribution`).
They will continue to be added into the main namespace directly, but now a configuration toggle to disable this, currently off by default, in the future it will be on by default.
This is done to avoid collisions and possible security issues as facts come from the remote targets and they might be compromised.
* New `order` play level keyword that allows the user to change the order in which Ansible processes hosts when dispatching tasks.
* Users can now set group merge priority for groups of the same depth (parent child relationship), using the new `ansible_group_priority` variable, when values are the same or don't exist it will fallback to the previous sorting by name'.
@ -22,14 +165,14 @@ Ansible Changes By Release
- New inventory plugins for creating inventory
- Old inventory formats are still supported via plugins
- Inline host_list is also an inventory plugin, an example alternative `advanced_host_list` is also provided (it supports ranges)
- New configuration option to list enabled plugins and precedence order: `whitelist_inventory` in ansible.cfg
- New configuration option to list enabled plugins and precedence order `[inventory]enable_plugins` in ansible.cfg
- vars_plugins have been reworked, they are now run from Vars manager and API has changed (need docs)
- Loading group_vars/host_vars is now a vars plugin and can be overridden
- It is now possible to specify mulitple inventory sources in the command line (-i /etc/hosts1 -i /opt/hosts2)
- Inventory plugins can use the cache plugin (i.e. virtualbox) and is affected by `meta: refresh_inventory`
- Group variable precedence is now configurable via new 'precedence' option in ansible.cfg (needs docs)
- Improved warnings and error messages across the board
* Configuration has been changed from a hardcoded into the constants module to dynamically loaded from yaml definitions
* Configuration has been changed from a hardcoded listing in the constants module to dynamically loaded from yaml definitions
- Also added an ansible-config CLI to allow for listing config options and dumping current config (including origin)
- TODO: build upon this to add many features detailed in ansible-config proposal https://github.com/ansible/proposals/issues/35
* Windows modules now support the use of multiple shared module_utils files in the form of Powershell modules (.psm1), via `#Requires -Module Ansible.ModuleUtils.Whatever.psm1`
@ -49,30 +192,33 @@ Ansible Changes By Release
moved to `ansible.utils.unsafe_proxy` to avoid a circular import.
* The win_get_url module has the dictionary 'win_get_url' in its results deprecated,
its content is now also available directly in the resulting output, like other modules.
* previouslly deprecated 'hostfile' config settings have been 're-deprecated' as before the code did not warn about deprecated configuration settings
, but it does now.
#### Deprecated Modules (to be removed in 2.8):
* ec2_facts: replaced by ec2_metadata_facts
* azure: use M(azure_rm_virtualmachine) instead
* cs_nic: replaced by cs_instance_nic_secondaryip, also see new module cs_instance_nic for managing nics
* ec2_facts: replaced by ec2_metadata_facts
* ec2_remote_facts: replaced by ec2_instance_facts
* panos_address: use M(panos_object) instead
* panos_service: use M(panos_object) instead
* panos_security_policy: use M(panos_security_rule) instead
* panos_nat_policy: use M(panos_nat_rule) instead
* panos_security_policy: use M(panos_security_rule) instead
* panos_service: use M(panos_object) instead
* s3: replaced by aws_s3
* ec2_remote_facts: replaced by
* win_msi: use M(win_package) instead
#### Removed Modules (previouslly deprecated):
#### Removed Modules (previously deprecated):
* eos_template: use eos_config instead
* ios_template: use ios_config instead
* iosxr_template: use iosxr_config instead
* junos_template: use junos_config instead
* nxos_template: use nxos_config instead
* ops_template: use ops_config instead
* openswitch
* ops_template: use ops_config instead
### Minor Changes
* Removed previously deprecated config option `hostfile` and env var `ANSIBLE_HOSTS`
* Now deprecated configuration options issue warnings when set.
* Removed unused and deprecated config option `pattern`
* Updated the copy of six bundled for modules to use from 1.4.1 to 1.10.0
* The `include_dir` var is not a global anymore, as we now allow multiple inventory sources, it is now host dependant.
@ -130,21 +276,51 @@ Ansible Changes By Release
- extensions of files to ignore when using inventory directory
- patterns of flies to ignore when using inventory directory
- option to toggle failed inventory source parsing between an error or a warning
* More fixes for Python 3 across the code base.
* win_shell and win_command modules now properly preserve quoted arguments passed on the command-line. Tasks that attempted to work around the issue by adding extra quotes/escaping may need to be reworked. See https://github.com/ansible/ansible/issues/23019 for additional detail.
* All configuration paths are now relative to the `ansible.cfg` file used.
* By user request, a 'configuration macro' (``CWD``) is available to force configured paths to be relative to the current working directory. Please note that this is unsafe and not recommended.
#### New Callbacks:
- full_skip
- profile_roles
- stderr
#### New Connection plugins:
- buildah
- saltstack
#### New Filters:
- ipaddr filter gained several new suboptions
- first_usable
- ip/prefix
- ip_netmask
- last_usable
- next_usable
- network_id
- network/prefix
- network_netmask
- network_wildcard
- previous_usable
- range_usable
- size_usable
- wildcard
- next_nth_usable
- network_in_network
- network_in_usable
- previous_nth_usable
- parse_cli
- parse_cli_textfsm
- strftime
- urlsplit
#### New Inventory Plugins:
- advanced_host_list
- constructed
- host_list
- ini
- openstack
- script
- virtualbox
- yaml
@ -152,11 +328,22 @@ Ansible Changes By Release
#### New Inventory scripts:
- lxd
#### New: Tests
#### New Lookups:
- chef_databag
- cyberarkpassword
- hiera
#### New Tests:
- any : true if any element is true
- all: true if all elements are true
### Module Notes
- By mistake, an early version of elb_classic_lb, elb_instance, and elb_classic_lb_facts modules
were released and marked as stableinterface. These are now marked as preview in 2.4.1 and their
parameters and return values may change in 2.5.0. Part of this mistake included deprecating the
ec2_elb_lb, ec2_lb, and ec2_elb_facts modules prematurely. These modules won't be deprecated
until the replacements above have a stableinterface and the erroneous deprecation has been fixed
in 2.4.1.
- The docker_container module has gained a new option, `working_dir` which allows
specifying the working directory for the command being run in the image.
- The ec2_win_password module now requires the cryptography python module be installed to run
@ -578,6 +765,141 @@ Ansible Changes By Release
* win_wait_for
* win_wakeonlan
<a id="2.3.3"></a>
## 2.3.3 "Ramble On" - TBD
### Bugfixes
* Fix alternatives module handlling of non existing options
* Fix synchronize traceback with the docker connection plugin
* Do not escape backslashes in the template lookup plugin to mirror what the template module does
* Fix the expires option of the postgresq_user module
* Fix for win_acl when settings permissions on registry objects that use `ALL APPLICATION PACKAGES` and `ALL RESTRICTED APPLICATION PACKAGES`
* Python3 fixes
* asorted azure modules
* pause module
* hacking/env-setup script
* Fix traceback when checking for passwords in logged strings when logging executed commands.
* docker_login module
* Workaround python-libselinux API change in the seboolean module
* digital_ocean_tag module
* Fix the zip filter
* Fix user module combining bytes and text
* Fix for security groups in the amazon efs module
* Fix for the jail connection plugin not finding the named jail
* Fix for blockinfile's parameters insertbefore and insertafter
* ios_config: Fix traceback when the efaults parameter is not set
* iosxr_config: Fixed unicode error when UTF-8 characters are in configs
* Fix check mode in archive module
* Fix UnboundLocalError in check mode in cs_role module
* Fix to always use lowercase hostnames for host keys in known_hosts module
* Added missing return results for win_stat
* Fix rabbitmq modules to give a helpful error if requests is not installed
* Fix yum module not deleting rpms that it downloaded
* Fix yum module failing with a URL to an rpm
* Fix file module inappropriately expanding literal dollar signs in a path read
from the filesystem as an environment variable.
* Fix the ssh "smart" transport setting which automatically selects the best means of
transferring files over ssh (sftp, ssh, piped).
* Fix authentication by api_key parameter in exoscale modules.
* vmware module_utils shared code ssl/validate_certs fixes in connection logic
* allow 'bridge' facts to work for certain containers that create conflicting ones with connection plugins
* Fix for win_get_url to use TLS 1.2/1.1 if it is available on the host
* Fix for the filetree lookup with non-ascii group names
* Better message for invalid keywords/options in task due to undefined expressions
* Fixed check mode for enable on Solaris for service module
* Fix cloudtrail module to allow AWS profiles other than the default
* Fix an encoding issue with secret (password) vars_prompts
<a id="2.3.2"></a>
## 2.3.2 "Ramble On" - 2017-08-04
### Bugfixes
* Fix partend i18n issues
* fixed handling of extra vars for tower_job_template (#25272)
* Python3 bugfixes
* Fix sorting of ec2 policies
* Fix digital_ocean dynamic inventory script
* Fix for the docker connection plugin
* Fix pip module when using python3's pyvenv and python3 -m venv to create virtualenvs
* Fix for the AnsiBallZ wrapper so that it gives a better error message when
there's not enough disk space to create its tempdir.
* Fix so ansilbe-galaxy install --force with unversioned roles will once again
overwrite old versions.
* Fix for RabbitMQ 3.6.7 endpoint return code changing.
* Fix for Foreman organization creation
* fixed incorrect fail_json ref in rpm_key
* Corrected requried on hash_name for dynamodb_table
* Fix for fetch action plugin not validating correctly
* Avoid vault view writing display to logs
* htpasswd: fix passlib module version comparison
* Fix for flowdock error message when external_user_name is missing
* fixed corner case for delegate_to, loops and delegate_facts
* fixed wait_for python2.4/2.5 compatibility (this is last version this is needed)
* fix for adhoc not obeying callback options
* fix for win_find where it fails to recursively scan empty nested directories
* fix non-pipelined code paths for Windows (eg, ANSIBLE_KEEP_REMOTE_FILES, non-pipelined connection plugins)
* fix for win_updates where args and check mode were ignored due to common code change
* fix for unprivileged users to Windows runas become method
* fix starttls code path for mail module
* fix missing LC_TYPE in parted module
* fix CN parsing with OpenSSL 1.1 in letsencrypt module
* fix params assignment in jabber module
* fix TXT record type handling in exo_dns_record module
* fix message queue message ttl can't be 0 in rabbitmq_queue module
* CloudStack bugfixes:
* fix template upload for users in cs_template module, change default to is_routing=None
* several fixes in cs_host module fixes hypervisor handling
* fix network param ignored due typo in cs_nic module
* fix missing type bool in module cs_zone
* fix KeyError: 'sshkeypair' in cs_instance module for CloudStack v4.5 and before
* fix for win_chocolatey where trying to upgrade all the packages as per the example docs fails
* fix for win_chocolatey where it did not fail if the version set did not exist
* fix for win_regedit always changing a reg key if the dword values set is a hex
* fix for wait_for on non-Linux systems with newer versions of psutil
* fix eos_banner code and test issues
* run tearup and teardown of EAPI service only on EAPI tests
* fix eos_config tests so only Eth1 and Eth2 are used
* Fix for potential bug when using legacy inventory vars for configuring the su password.
* Fix crash in file module when directories contain non-utf8 filenames
* Fix for dnf groupinstall with dnf-2.x
* Fix seboolean module for incompatibility in newer Python3 selinux bindings
* Optimization for inventory, no need to dedup at every stage, its redundant and slow
* Fix fact gathering for package and service action plugins
* make random_choice more error resilient (#27380)
* ensure prefix in plugin loading to avoid conflicts
* fix for a small number of modules (tempfile, possibly copy) which could fail
if the tempdir on the remote box was a symlink
+ fix non-pipelined code paths for Windows (eg, ANSIBLE_KEEP_REMOTE_FILES, non-pipelined connection plugins)
* fix for win_updates where args and check mode were ignored due to common code change
<a id="2.3.1"></a>
## 2.3.1 "Ramble On" - 2017-06-01
### Bugfixes
* Security fix for CVE-2017-7481 - data for lookup plugins used as variables was not being correctly marked as "unsafe".
* Fix default value of fetch module's validate_checksum to be True
* Added fix for "meta: refresh_connection" not working with default 'smart' connection.
* Fix template so that the --diff command line option works when the destination is a directory
* Fix python3 bugs in pam_limits
* Fix unbound error when using module deprecation as a single string
* Several places in which error handling was broken due to bad conversions or just typos
* Fix to user module for appending/setting groups on OpenBSD (flags were reversed)
* assemble fix to use safer os.join.path, avoids charset issues
* fixed issue with solaris facts and i18n
* added python2.4 compatiblity fix to sysctl module
* Fix comparison of exisiting container security opts in the docker_container module
* fixed service module invocation of insserv on certain platforms
* Fix traceback in os_user in an error case.
* Fix docker container to restart a container when changing to fewer exposed ports
* Fix tracebacks in docker_network
* Fixes to detection of updated docker images
* Handle detection of docker image changes when published ports is changed
* Fix for docker_container restarting images when links list is empty.
<a id="2.3"></a>
## 2.3 "Ramble On" - 2017-04-12
@ -613,6 +935,7 @@ Moving to Ansible 2.3 guide http://docs.ansible.com/ansible/porting_guide_2.3.ht
* 'service' tasks can now use async again, we had lost this capability when changed into an action plugin.
* made any_errors_fatal inheritable from play to task and all other objects in between.
* many small performance improvements in inventory and variable handling and in task execution.
* Added a retry class to the ec2_asg module since customers were running into throttling errors (AWSRetry is a solution for modules using boto3 which isn't applicable here).
### Deprecations
* Specifying --tags (or --skip-tags) multiple times on the command line
@ -844,6 +1167,14 @@ Moving to Ansible 2.3 guide http://docs.ansible.com/ansible/porting_guide_2.3.ht
* panos_service
- postgresql_schema
- proxmox_kvm
- proxysql:
* proxysql_backend_servers
* proxysql_global_variables
* proxysql_manage_config
* proxysql_mysql_users
* proxysql_query_rules
* proxysql_replication_hostgroups
* proxysql_scheduler
- pubnub_blocks
- pulp_repo
- runit
@ -1640,7 +1971,7 @@ Module fixes:
This re-executes inventory scripts, but does not force them to ignore any cache they might use.
* 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.
* 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).

View File

@ -29,6 +29,7 @@ ASCII2HTMLMAN = a2x -L -D docs/html/man/ -d manpage -f xhtml
else
ASCII2MAN = @echo "ERROR: AsciiDoc 'a2x' command is not installed but is required to build $(MANPAGES)" && exit 1
endif
GENERATE_CLI = docs/bin/generate_man.py
PYTHON=python
SITELIB = $(shell $(PYTHON) -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
@ -343,8 +344,9 @@ webdocs:
.PHONY: generate_asciidoc
generate_asciidoc: lib/ansible/cli/*.py
mkdir -p ./docs/man/man1/
PYTHONPATH=./lib ./docs/bin/generate_man.py
mkdir -p ./docs/man/man1/ ; \
PYTHONPATH=./lib $(GENERATE_CLI) --template-file=docs/templates/man.j2 --output-dir=docs/man/man1/ --output-format man lib/ansible/cli/*.py
docs: generate_asciidoc
make $(MANPAGES)

View File

@ -4,7 +4,9 @@ Ansible Releases at a Glance
VERSION RELEASE CODE NAME
++++++++++++++++++++++++++++++
2.4.0 TBD "Dancing Days"
2.5.0 TBD "Kashmir"
2.4.1 10-25-2017 "Dancing Days"
2.4.0 09-19-2017 "Dancing Days"
2.3.2 08-04-2017 "Ramble On"
2.3.1 06-01-2017 "Ramble On"
2.3.0 04-12-2017 "Ramble On"

View File

@ -1 +1 @@
2.4.0 0.0.devel
2.4.1.0 1

View File

@ -214,7 +214,6 @@ class Server():
def do_EXEC(self, data):
cmd = data.split(b'EXEC: ')[1]
display.display('Command executed: %s' % cmd, log_only=True)
return self.connection.exec_command(cmd)
def do_PUT(self, data):

View File

@ -187,14 +187,18 @@ Version: 1.0.0
'''
import argparse
import ConfigParser
import json
import os
import re
import sys
import inspect
import traceback
try:
# python2
import ConfigParser as cp
except ImportError:
# python3
import configparser as cp
from packaging.version import Version
@ -326,7 +330,7 @@ class AzureRM(object):
path = expanduser("~")
path += "/.azure/credentials"
try:
config = ConfigParser.ConfigParser()
config = cp.ConfigParser()
config.read(path)
except Exception as exc:
self.fail("Failed to access {0}. Check that the file exists and you have read "
@ -795,7 +799,7 @@ class AzureInventory(object):
config = None
settings = None
try:
config = ConfigParser.ConfigParser()
config = cp.ConfigParser()
config.read(path)
except:
pass

View File

@ -371,7 +371,6 @@ HAS_DOCKER_PY = True
HAS_DOCKER_ERROR = False
try:
from docker import Client
from docker.errors import APIError, TLSParameterError
from docker.tls import TLSConfig
from docker.constants import DEFAULT_TIMEOUT_SECONDS, DEFAULT_DOCKER_API_VERSION
@ -379,6 +378,19 @@ except ImportError as exc:
HAS_DOCKER_ERROR = str(exc)
HAS_DOCKER_PY = False
# Client has recently been split into DockerClient and APIClient
try:
from docker import Client
except ImportError as exc:
try:
from docker import APIClient as Client
except ImportError as exc:
HAS_DOCKER_ERROR = str(exc)
HAS_DOCKER_PY = False
class Client:
pass
DEFAULT_DOCKER_HOST = 'unix://var/run/docker.sock'
DEFAULT_TLS = False
DEFAULT_TLS_VERIFY = False
@ -779,6 +791,10 @@ class DockerInventory(object):
if config_path:
try:
config_file = os.path.abspath(config_path)
# default config path is docker.yml in same directory as this script
# old behaviour is docker.yml in current directory. Handle both.
if not os.path.exists(config_file):
config_file = os.path.abspath(os.path.basename(config_path))
except:
config_file = None
@ -813,7 +829,7 @@ class DockerInventory(object):
# Parse command line arguments
basename = os.path.splitext(os.path.basename(__file__))[0]
default_config = basename + '.yml'
default_config = os.path.join(os.path.dirname(__file__), basename + '.yml')
parser = argparse.ArgumentParser(
description='Return Ansible inventory for one or more Docker hosts.')

View File

@ -1,6 +1,8 @@
#!/usr/bin/env python
import optparse
import os
import pprint
import sys
from jinja2 import Environment, FileSystemLoader
@ -8,6 +10,46 @@ from jinja2 import Environment, FileSystemLoader
from ansible.module_utils._text import to_bytes
def generate_parser():
p = optparse.OptionParser(
version='%prog 1.0',
usage='usage: %prog [options]',
description='Generate cli documentation from cli docstrings',
)
p.add_option("-t", "--template-file", action="store", dest="template_file", default="../templates/man.j2", help="path to jinja2 template")
p.add_option("-o", "--output-dir", action="store", dest="output_dir", default='/tmp/', help="Output directory for rst files")
p.add_option("-f", "--output-format", action="store", dest="output_format", default='man', help="Output format for docs (the default 'man' or 'rst')")
return p
# from https://www.python.org/dev/peps/pep-0257/
def trim_docstring(docstring):
if not docstring:
return ''
# Convert tabs to spaces (following the normal Python rules)
# and split into a list of lines:
lines = docstring.expandtabs().splitlines()
# Determine minimum indentation (first line doesn't count):
indent = sys.maxint
for line in lines[1:]:
stripped = line.lstrip()
if stripped:
indent = min(indent, len(line) - len(stripped))
# Remove indentation (first line is special):
trimmed = [lines[0].strip()]
if indent < sys.maxint:
for line in lines[1:]:
trimmed.append(line[indent:].rstrip())
# Strip off trailing and leading blank lines:
while trimmed and not trimmed[-1]:
trimmed.pop()
while trimmed and not trimmed[0]:
trimmed.pop(0)
# Return a single string:
return '\n'.join(trimmed)
def get_options(optlist):
''' get actual options '''
@ -24,107 +66,215 @@ def get_options(optlist):
return opts
def get_option_groups(option_parser):
groups = []
for option_group in option_parser.option_groups:
group_info = {}
group_info['desc'] = option_group.get_description()
group_info['options'] = option_group.option_list
group_info['group_obj'] = option_group
groups.append(group_info)
return groups
def opt_doc_list(cli):
''' iterate over options lists '''
results = []
for optg in cli.parser.option_groups:
results.extend(get_options(optg.option_list))
for option_group in cli.parser.option_groups:
results.extend(get_options(option_group.option_list))
results.extend(get_options(cli.parser.option_list))
return results
def opts_docs(cli, name):
# def opts_docs(cli, name):
def opts_docs(cli_class_name, cli_module_name):
''' generate doc structure from options '''
# cli name
if '-' in name:
name = name.split('-')[1]
else:
name = 'adhoc'
cli_name = 'ansible-%s' % cli_module_name
if cli_module_name == 'adhoc':
cli_name = 'ansible'
# cli info
# WIth no action/subcommand
# shared opts set
# instantiate each cli and ask its options
cli_klass = getattr(__import__("ansible.cli.%s" % cli_module_name,
fromlist=[cli_class_name]), cli_class_name)
cli = cli_klass([])
# parse the common options
try:
cli.parse()
except:
pass
# base/common cli info
docs = {
'cli': name,
'cli': cli_module_name,
'cli_name': cli_name,
'usage': cli.parser.usage,
'short_desc': cli.parser.description,
'long_desc': cli.__doc__,
'long_desc': trim_docstring(cli.__doc__),
'actions': {},
}
option_info = {'option_names': [],
'options': [],
'groups': []}
for extras in ('ARGUMENTS'):
if hasattr(cli, extras):
docs[extras.lower()] = getattr(cli, extras)
common_opts = opt_doc_list(cli)
groups_info = get_option_groups(cli.parser)
shared_opt_names = []
for opt in common_opts:
shared_opt_names.extend(opt.get('options', []))
option_info['options'] = common_opts
option_info['option_names'] = shared_opt_names
option_info['groups'].extend(groups_info)
docs.update(option_info)
# now for each action/subcommand
# force populate parser with per action options
if cli.VALID_ACTIONS:
docs['actions'] = {}
# use class attrs not the attrs on a instance (not that it matters here...)
for action in getattr(cli_klass, 'VALID_ACTIONS', ()):
# instantiate each cli and ask its options
action_cli_klass = getattr(__import__("ansible.cli.%s" % cli_module_name,
fromlist=[cli_class_name]), cli_class_name)
# init with args with action added?
cli = action_cli_klass([])
cli.args.append(action)
try:
cli.parse()
except:
pass
# FIXME/TODO: needed?
# avoid dupe errors
cli.parser.set_conflict_handler('resolve')
for action in cli.VALID_ACTIONS:
cli.args.append(action)
cli.set_action()
docs['actions'][action] = getattr(cli, 'execute_%s' % action).__doc__
cli.set_action()
action_info = {'option_names': [],
'options': []}
# docs['actions'][action] = {}
# docs['actions'][action]['name'] = action
action_info['name'] = action
action_info['desc'] = trim_docstring(getattr(cli, 'execute_%s' % action).__doc__)
# docs['actions'][action]['desc'] = getattr(cli, 'execute_%s' % action).__doc__.strip()
action_doc_list = opt_doc_list(cli)
uncommon_options = []
for action_doc in action_doc_list:
# uncommon_options = []
option_aliases = action_doc.get('options', [])
for option_alias in option_aliases:
if option_alias in shared_opt_names:
continue
# TODO: use set
if option_alias not in action_info['option_names']:
action_info['option_names'].append(option_alias)
if action_doc in action_info['options']:
continue
uncommon_options.append(action_doc)
action_info['options'] = uncommon_options
docs['actions'][action] = action_info
docs['options'] = opt_doc_list(cli)
return docs
if __name__ == '__main__':
template_file = 'man.j2'
parser = generate_parser()
options, args = parser.parse_args()
template_file = options.template_file
template_path = os.path.expanduser(template_file)
template_dir = os.path.abspath(os.path.dirname(template_path))
template_basename = os.path.basename(template_file)
output_dir = os.path.abspath(options.output_dir)
output_format = options.output_format
cli_modules = args
# various cli parsing things checks sys.argv if the 'args' that are passed in are []
# so just remove any args so the cli modules dont try to parse them resulting in warnings
sys.argv = [sys.argv[0]]
# need to be in right dir
os.chdir(os.path.dirname(__file__))
allvars = {}
output = {}
cli_list = []
for binary in os.listdir('../../lib/ansible/cli'):
cli_bin_name_list = []
# for binary in os.listdir('../../lib/ansible/cli'):
for cli_module_name in cli_modules:
binary = os.path.basename(os.path.expanduser(cli_module_name))
if not binary.endswith('.py'):
continue
elif binary == '__init__.py':
continue
libname = os.path.splitext(binary)[0]
print("Found CLI %s" % libname)
cli_name = os.path.splitext(binary)[0]
if libname == 'adhoc':
myclass = 'AdHocCLI'
output[libname] = 'ansible.1.asciidoc.in'
if cli_name == 'adhoc':
cli_class_name = 'AdHocCLI'
# myclass = 'AdHocCLI'
output[cli_name] = 'ansible.1.asciidoc.in'
cli_bin_name = 'ansible'
else:
myclass = "%sCLI" % libname.capitalize()
output[libname] = 'ansible-%s.1.asciidoc.in' % libname
# myclass = "%sCLI" % libname.capitalize()
cli_class_name = "%sCLI" % cli_name.capitalize()
output[cli_name] = 'ansible-%s.1.asciidoc.in' % cli_name
cli_bin_name = 'ansible-%s' % cli_name
# instantiate each cli and ask its options
mycli = getattr(__import__("ansible.cli.%s" % libname, fromlist=[myclass]), myclass)
cli_object = mycli([])
try:
cli_object.parse()
except:
# no options passed, we expect errors
pass
allvars[libname] = opts_docs(cli_object, libname)
for extras in ('ARGUMENTS'):
if hasattr(cli_object, extras):
allvars[libname][extras.lower()] = getattr(cli_object, extras)
# FIXME:
allvars[cli_name] = opts_docs(cli_class_name, cli_name)
cli_bin_name_list.append(cli_bin_name)
cli_list = allvars.keys()
for libname in cli_list:
doc_name_formats = {'man': '%s.1.asciidoc.in',
'rst': '%s.rst'}
for cli_name in cli_list:
# template it!
env = Environment(loader=FileSystemLoader('../templates'))
template = env.get_template('man.j2')
env = Environment(loader=FileSystemLoader(template_dir))
template = env.get_template(template_basename)
# add rest to vars
tvars = allvars[libname]
tvars = allvars[cli_name]
tvars['cli_list'] = cli_list
tvars['cli'] = libname
tvars['cli_bin_name_list'] = cli_bin_name_list
tvars['cli'] = cli_name
if '-i' in tvars['options']:
print('uses inventory')
manpage = template.render(tvars)
filename = '../man/man1/%s' % output[libname]
filename = os.path.join(output_dir, doc_name_formats[output_format] % tvars['cli_name'])
with open(filename, 'wb') as f:
f.write(to_bytes(manpage))
print("Wrote man docs to %s" % filename)
print("Wrote doc to %s" % filename)

View File

@ -120,6 +120,9 @@ def write_data(text, output_dir, outputname, module=None):
if output_dir is not None:
if module:
outputname = outputname % module
if not os.path.exists(output_dir):
os.makedirs(output_dir)
fname = os.path.join(output_dir, outputname)
fname = fname.replace(".py", "")
with open(fname, 'wb') as f:

View File

@ -4,6 +4,7 @@ FORMATTER=../bin/plugin_formatter.py
TESTING_FORMATTER=../bin/testing_formatter.sh
DUMPER=../bin/dump_keywords.py
CONFIG_DUMPER=../bin/dump_config.py
GENERATE_CLI=../bin/generate_man.py
ifeq ($(shell echo $(OS) | egrep -ic 'Darwin|FreeBSD|OpenBSD|DragonFly'),1)
CPUS ?= $(shell sysctl hw.ncpu|awk '{print $$2}')
else
@ -19,7 +20,8 @@ all: docs
docs: clean htmldocs
htmldocs: testing keywords modules staticmin config
htmldocs: testing keywords modules staticmin cli config
CPUS=$(CPUS) $(MAKE) -f Makefile.sphinx html
webdocs: docs
@ -45,9 +47,14 @@ clean:
-rm rst/*_maintained.rst
-rm rst/playbooks_directives.rst
-rm rst/playbooks_keywords.rst
# -rm rst/cli/ansible*.rst
.PHONEY: docs clean
# TODO: make generate_man output dir cli option
cli: $(GENERATE_CLI)
PYTHONPATH=../../lib $(GENERATE_CLI) --template-file=../templates/cli_rst.j2 --output-dir=rst/ --output-format rst ../../lib/ansible/cli/*.py
keywords: $(FORMATTER) ../templates/playbooks_keywords.rst.j2
PYTHONPATH=../../lib $(DUMPER) --template-dir=../templates --output-dir=rst/ -d ./keyword_desc.yml
@ -57,7 +64,7 @@ config:
modules: $(FORMATTER) ../templates/plugin.rst.j2
# Limit building of module documentation if requested.
ifdef MODULES
PYTHONPATH=../../lib $(FORMATTER) -t rst --template-dir=../templates --module-dir=../../lib/ansible/modules -o rst/ -l $(MODULES)
PYTHONPATH=../../lib $(FORMATTER) -t rst --template-dir=../templates --module-dir=../../lib/ansible/modules -o rst/ -l $(MODULES)
else
PYTHONPATH=../../lib $(FORMATTER) -t rst --template-dir=../templates --module-dir=../../lib/ansible/modules -o rst/
endif

View File

@ -160,7 +160,7 @@
<div class="DocSiteProduct-logoText">
Ansible
<div class="DocSiteProduct-CurrentVersion" align="right">
devel
v2.4
</div>
</div>
</div>

View File

@ -1,55 +1,55 @@
accelerate: DEPRECATED, set to True to use accelerate connection plugin.
accelerate_ipv6: DEPRECATED, set to True to force accelerate plugin to use ipv6 for it's connection.
accelerate_ipv6: "DEPRECATED, set to True to force accelerate plugin to use ipv6 for it's connection."
accelerate_port: DEPRECATED, set to override default port use for accelerate connection.
action: The 'action' to execute for a task, it normally translates into a C(module) or action plugin.
action: "The 'action' to execute for a task, it normally translates into a C(module) or action plugin."
args: DEPRECATED, A secondary way to add arguments into a task, it takes a dictionary in which keys map to options and values .. well you get it.
always: List of tasks, in a block, that execute no matter if there is an error in the block or not.
always_run: DEPRECATED, forces a task to run even in check mode, use check_mode directive instead.
always_run: DEPRECATED, forces a task to run even in check mode, use :term:`check_mode` directive instead.
any_errors_fatal: Force any un-handled task errors on any host to propagate to all hosts and end the play.
async: Run a task asyncronouslly if the C(action) supports this.
become: Boolean that controls if privilege escalation is used or not on Task execution.
become_flags: A string of flag(s) to pass to the privilege escalation program when ``become`` is True.
become: Boolean that controls if privilege escalation is used or not on :term:`Task` execution.
become_flags: A string of flag(s) to pass to the privilege escalation program when :term:`become` is True.
become_method: Which method of privilege escalation to use. i.e. sudo/su/etc.
become_user: User that you 'become' after using privilege escalation, the remote/login user must have permissions to become this user.
become_user: "User that you 'become' after using privilege escalation, the remote/login user must have permissions to become this user."
block: List of tasks in a block.
changed_when: Conditional expression that overrides the task's normal 'changed' status.
check_mode: A boolean that controls if a task is executed in 'check' mode
changed_when: "Conditional expression that overrides the task's normal 'changed' status."
check_mode: "A boolean that controls if a task is executed in 'check' mode"
connection: Allows you to change the connection plugin used for tasks to execute on the target.
delay: Number of seconds to delay between retries, this setting only makes sense when used with 'until'.
delay: Number of seconds to delay between retries, this setting is only used in combination with :term:`until`.
delegate_facts: Boolean that allows you to apply facts to delegated host instead of inventory_hostname.
delegate_to: Host to execute task instead of the target (inventory_hostname), connection vars from the delegated host will also be used for the task.
diff: Toggle to make tasks return 'diff' information or not.
diff: "Toggle to make tasks return 'diff' information or not."
environment: A dictionary that gets converted into environment vars to be provided for the task upon execution.
fact_path: Set the fact path option for the fact gathering plugin controlled by ``gather_facts``.
failed_when: Conditional expression that overrides the task's normal 'failed' status.
fact_path: Set the fact path option for the fact gathering plugin controlled by :term:`gather_facts`.
failed_when: "Conditional expression that overrides the task's normal 'failed' status."
force_handlers: Will force notified handler execution for hosts even if they failed during the play, it will not trigger if the play itself fails.
gather_facts: A boolean that controls if the play will automatically run the 'setup' task to gather facts for the hosts.
gather_subset: Allows you to pass subset options to the fact gathering plugin controlled by ``gather_facts``.
gather_timeout: Allows you to set the timeout for the fact gathering plugin controlled by ``gather_facts``.
handlers: A section with tasks that are treated as handlers, these won't get executed normally, only when notified. After each section of tasks is complete.
hosts: A list of groups, hosts or host pattern that translates into a list of hosts that are the play's target.
gather_facts: "A boolean that controls if the play will automatically run the 'setup' task to gather facts for the hosts."
gather_subset: Allows you to pass subset options to the fact gathering plugin controlled by :term:`gather_facts`.
gather_timeout: Allows you to set the timeout for the fact gathering plugin controlled by :term:`gather_facts`.
handlers: "A section with tasks that are treated as handlers, these won't get executed normally, only when notified. After each section of tasks is complete."
hosts: "A list of groups, hosts or host pattern that translates into a list of hosts that are the play's target."
ignore_errors: Boolean that allows you to ignore task failures and continue with play. It does not affect connection errors.
loop_control: Several keys here allow you to modify/set loop behaviour in a task see http://docs.ansible.com/ansible/latest/playbooks_loops.html#loop-control for details.
loop_control: "Several keys here allow you to modify/set loop behaviour in a task see http://docs.ansible.com/ansible/latest/playbooks_loops.html#loop-control for details."
max_fail_percentage: can be used to abort the run after a given percentage of hosts in the current batch has failed.
name: It's a name, works mostly for documentation, in the case of tasks/handlers it can be an identifier.
name: "It's a name, works mostly for documentation, in the case of tasks/handlers it can be an identifier."
no_log: Boolean that controls information disclosure.
notify: list of handlers to notify when the task returns a 'changed=True' status.
notify: "list of handlers to notify when the task returns a 'changed=True' status."
order: Controls the sorting of hosts as they are used for executing the play. Possible values are inventory (default), sorted, reverse_sorted, reverse_inventory and shuffle.
poll: Sets the polling interval in seconds for async tasks (default 10s).
port: Used to override the default port used in a connection.
post_tasks: A list of tasks to execute after the ``tasks`` section.
pre_tasks: A list of tasks to execute before ``roles``.
post_tasks: A list of tasks to execute after the :term:`tasks` section.
pre_tasks: A list of tasks to execute before :term:`roles`.
remote_user: User used to log into the target via the connection plugin. AKA login user.
register: Name of variable that will contain task status and module return data.
rescue: List of tasks in a block that run if there is a task error in the main ``block`` list.
retries: Number of retries before giving up in a 'until' loop, this setting is ignored on it's own.
rescue: List of tasks in a :term:`block` that run if there is a task error in the main :term:`block` list.
retries: "Number of retries before giving up in a :term:`until` loop. This setting is only used in combination with :term:`until`."
roles: List of roles to be imported into the play
run_once: Boolean that will bypass the host loop, forcing the task to execute on the first host available and will also apply any facts to all active hosts.
serial: Defines the 'batch' of hosts to execute the current play until the end.
strategy: Allows you to choose the connection plugin to use for the play.
tags: Tags applied to the task or included tasks, this allows selecting subsets of tasks from the command line.
tasks: Main list of tasks to execute in the play, they run after ``roles`` and before ``post_tasks``.
until: This keyword implies a 'retry loop' that will go on until the condition supplied here is met or we hit the retry limit.
tasks: Main list of tasks to execute in the play, they run after :term:`roles` and before :term:`post_tasks`.
until: "This keyword implies a ':term:`retries` loop' that will go on until the condition supplied here is met or we hit the :term:`retries` limit."
vars: Dictionary/map of variables
vars_files: List of files that contain vars to include in the play.
vars_prompt: list of variables to prompt for.

View File

@ -0,0 +1,15 @@
Command Line Tools
==================
.. toctree:: :maxdepth: 1
ansible
ansible-playbook
ansible-vault
ansible-galaxy
ansible-console
ansible-config
ansible-doc
ansible-inventory
ansible-pull

View File

@ -3,7 +3,7 @@ Committers Guidelines (for people with commit rights to Ansible on GitHub)
These are the guidelines for people with commit access to Ansible. Committers are essentially acting as members of the Ansible Core team, although not necessarily as an employee of Ansible and Red Hat. Please read the guidelines before you commit.
These guidelines apply to everyone. At the same time, this ISN’T a process document. So just use good judgement. You’ve been given commit access because we trust your judgement.
These guidelines apply to everyone. At the same time, this ISN'T a process document. So just use good judgement. You've been given commit access because we trust your judgement.
That said, use the trust wisely.
@ -19,18 +19,18 @@ Any other new features and changes to high level design should go through the pr
Our Workflow on GitHub
======================
As a committer, you may already know this, but our workflow forms a lot of our team policies. Please ensure you’re aware of the following workflow steps:
As a committer, you may already know this, but our workflow forms a lot of our team policies. Please ensure you're aware of the following workflow steps:
* Fork the repository upon which you want to do some work to your own personal repository
* Work on the specific branch upon which you need to commit
* Create a Pull Request back to the Ansible repository and tag the people you would like to review; assign someone as the primary “owner” of your request
* Create a Pull Request back to the Ansible repository and tag the people you would like to review; assign someone as the primary "owner" of your request
* Adjust code as necessary based on the Comments provided
* Ask someone on the Core Team to do a final review and merge
Addendum to workflow for Committers:
------------------------------------
The Core Team is aware that this can be a difficult process at times. Sometimes, the team breaks the rules: Direct commits, merging their own PRs. This section is a set of guidelines. If you’re changing a comma in a doc, or making a very minor change, you can use your best judgement. This is another trust thing. The process is critical for any major change, but for little things or getting something done quickly, use your best judgement and make sure people on the team are aware of your work.
The Core Team is aware that this can be a difficult process at times. Sometimes, the team breaks the rules: Direct commits, merging their own PRs. This section is a set of guidelines. If you're changing a comma in a doc, or making a very minor change, you can use your best judgement. This is another trust thing. The process is critical for any major change, but for little things or getting something done quickly, use your best judgement and make sure people on the team are aware of your work.
Roles on Core
=============
@ -41,12 +41,12 @@ General Rules
=============
Individuals with direct commit access to ansible/ansible are entrusted with powers that allow them to do a broad variety of things--probably more than we can write down. Rather than rules, treat these as general *guidelines*, individuals with this power are expected to use their best judgement.
* Don’t
* Don't
- Commit directly.
- Merge your own PRs. Someone else should have a chance to review and approve the PR merge. If you are a Core Committer, you have a small amount of leeway here for very minor changes.
- Forget about alternate environments. Consider the alternatives--yes, people have bad environments, but they are the ones who need us the most.
- Drag your community team members down. Always discuss the technical merits, but you should never address the person’s limitations (you can later go for beers and call them idiots, but not in IRC/Github/etc.).
- Drag your community team members down. Always discuss the technical merits, but you should never address the person's limitations (you can later go for beers and call them idiots, but not in IRC/Github/etc.).
- Forget about the maintenance burden. Some things are really cool to have, but they might not be worth shoehorning in if the maintenance burden is too great.
- Break playbooks. Always keep backwards compatibility in mind.
- Forget to keep it simple. Complexity breeds all kinds of problems.
@ -55,7 +55,7 @@ Individuals with direct commit access to ansible/ansible are entrusted with powe
- Squash, avoid merges whenever possible, use github's squash commits or cherry pick if needed (bisect thanks you).
- Be active. Committers who have no activity on the project (through merges, triage, commits, etc.) will have their permissions suspended.
- Consider backwards compatibility (goes back to "don’t break existing playbooks").
- Consider backwards compatibility (goes back to "don't break existing playbooks").
- Write tests. PRs with tests are looked at with more priority than PRs without tests that should have them included. While not all changes require tests, be sure to add them for bug fixes or functionality changes.
- Discuss with other committers, specially when you are unsure of something.
- Document! If your PR is a new feature or a change to behavior, make sure you've updated all associated documentation or have notified the right people to do so. It also helps to add the version of Core against which this documentation is compatible (to avoid confusion with stable versus devel docs, for backwards compatibility, etc.).

View File

@ -2,7 +2,7 @@ Community Information & Contributing
````````````````````````````````````
Ansible is an open source project designed to bring together administrators and developers of all kinds to collaborate on building
IT automation solutions that work well for them.
IT automation solutions that work well for them.
Should you wish to get more involved -- whether in terms of just asking a question, helping other users, introducing new people to Ansible, or helping with the software or documentation, we welcome your contributions to the project.
@ -16,7 +16,7 @@ I've Got A Question
We're happy to help!
Ansible questions are best asked on the `Ansible Google Group Mailing List <http://groups.google.com/group/ansible-project>`_.
Ansible questions are best asked on the `Ansible Google Group Mailing List <http://groups.google.com/group/ansible-project>`_.
This is a very large high-traffic list for answering questions and sharing tips
and tricks. Anyone can join, and email delivery is optional if you just want to read the group online. To cut down on spam, your first post is moderated, though posts are approved quickly.
@ -42,10 +42,10 @@ This is a low-traffic read-only list, where we'll share release announcements an
I'd Like To Help Share and Promote Ansible
------------------------------------------
You can help share Ansible with others by telling friends and colleagues, writing a blog post,
or presenting at user groups (like DevOps groups or the local LUG).
You can help share Ansible with others by telling friends and colleagues, writing a blog post,
or presenting at user groups (like DevOps groups or the local LUG).
You are also welcome to share slides on speakerdeck, sign up for a free account and tag it “Ansible”. On Twitter,
You are also welcome to share slides on speakerdeck, sign up for a free account and tag it "Ansible". On Twitter,
you can also share things with #ansible and may wish to `follow us <https://twitter.com/ansible>`_.
I'd Like To Help Ansible Move Faster
@ -73,31 +73,31 @@ more quickly.
Do not use the issue tracker for "how do I do this" type questions. These are great candidates
for IRC or the mailing list instead where things are likely to be more of a discussion.
To be respectful of reviewers' time and allow us to help everyone efficiently, please
To be respectful of reviewers' time and allow us to help everyone efficiently, please
provide minimal well-reduced and well-commented examples versus sharing your entire production
playbook. Include playbook snippets and output where possible.
playbook. Include playbook snippets and output where possible.
When sharing YAML in playbooks, formatting can be preserved by using `code blocks <https://help.github.com/articles/creating-and-highlighting-code-blocks/>`_.
For multiple-file content, we encourage use of gist.github.com. Online pastebin content can expire, so it's nice to have things around for a longer term if they
are referenced in a ticket.
If you are not sure if something is a bug yet, you are welcome to ask about something on
the mailing list or IRC first.
If you are not sure if something is a bug yet, you are welcome to ask about something on
the mailing list or IRC first.
As we are a very high volume project, if you determine that
As we are a very high volume project, if you determine that
you do have a bug, please be sure to open the issue yourself to ensure we have a record of
it. Don’t rely on someone else in the community to file the bug report for you.
it. Don't rely on someone else in the community to file the bug report for you.
It may take some time to get to your report, see our information about priority flags below.
I'd Like To Help With Documentation
-----------------------------------
Ansible documentation is a community project too!
Ansible documentation is a community project too!
If you would like to help with the
documentation, whether correcting a typo or improving a section, or maybe even
If you would like to help with the
documentation, whether correcting a typo or improving a section, or maybe even
documenting a new feature, submit a GitHub pull request to the code that
lives in the ``docsite/rst`` subdirectory of the project for most pages, and there is an "Edit on GitHub"
link up on those.
@ -107,9 +107,9 @@ Module documentation is generated from a ``DOCUMENTATION`` structure embedded in
For more information on module documentation see `How to document modules <http://docs.ansible.com/ansible/dev_guide/developing_modules_documenting.html>`_.
Aside from modules, the main docs are in restructured text
format.
format.
If you aren’t comfortable with restructured text, you can also open a ticket on
If you aren't comfortable with restructured text, you can also open a ticket on
GitHub about any errors you spot or sections you would like to see added. For more information
on creating pull requests, please refer to the
`GitHub help guide <https://help.github.com/articles/using-pull-requests>`_.
@ -155,7 +155,7 @@ If you make a mistake you do not need to close your PR. Instead, create a clean
with ``--force`` to overwrite the existing branch (permissible in this case as no one else should be using that
branch as reference). Code comments won't be lost, they just won't be attached to the existing branch.
We’ll then review your contributions and engage with you about questions and so on.
We'll then review your contributions and engage with you about questions and so on.
Because we have a very large and active community it may take awhile to get your contributions
in! See the notes about priorities in a later section for understanding our work queue.
@ -172,14 +172,14 @@ are interested in writing new modules to be included in the core Ansible distrib
to the `module development documentation <http://docs.ansible.com/developing_modules.html>`_.
Ansible's aesthetic encourages simple, readable code and consistent,
conservatively extending, backwards-compatible improvements. When contributing code to Ansible,
conservatively extending, backwards-compatible improvements. When contributing code to Ansible,
please observe the following guidelines:
- Code developed for Ansible needs to support Python2-2.6 or higher and Python3-3.5 or higher.
- Use a 4-space indent, not tabs.
- We do not enforce 80 column lines; up to 160 columns are acceptable.
- We do not accept 'style only' pull requests unless the code is nearly unreadable.
- We are "PEP8ish", but not strictly compliant, see :doc:`testing_pep8` for more information.
- We are not strictly compliant with PEP8. See :doc:`dev_guide/testing_pep8` for more information.
You can also contribute by testing and revising other requests, especially if it is one you are interested
in using. Please keep your comments clear and to the point, courteous and constructive, tickets are not a
@ -228,7 +228,7 @@ To subscribe to a group from a non-google account, you can send an email to the
IRC Meetings
------------
The Ansible community holds regular IRC meetings on various topics, and anyone who is interested is invited to
The Ansible community holds regular IRC meetings on various topics, and anyone who is interested is invited to
participate. For more information about Ansible meetings, consult the `meeting schedule and agenda page <https://github.com/ansible/community/blob/master/meetings/README.md>`_.
Release Numbering
@ -286,7 +286,7 @@ These labels don't really have a definition - they are a simple ordering. Howev
affecting a major module (yum, apt, etc) is likely to be prioritized higher than a module
affecting a smaller number of users.
Since we place a strong emphasis on testing and code review, it may take a few months for a minor feature to get merged. This doesn't mean that we'll be exhausting all of the higher-priority queues before getting to your ticket; we will also take periodic sweeps through the lower priority queues and give them some attention as well, particularly in the area of new module changes.
Since we place a strong emphasis on testing and code review, it may take a few months for a minor feature to get merged. This doesn't mean that we'll be exhausting all of the higher-priority queues before getting to your ticket; we will also take periodic sweeps through the lower priority queues and give them some attention as well, particularly in the area of new module changes.
Every bit of effort helps - if you're wishing to expedite the inclusion of a P3 feature pull request for instance, the best thing you can do is help close P2 bug reports.

View File

@ -41,9 +41,9 @@ Each module has at least one assigned maintainer, listed in a `maintainer's file
.. _Ansibullbot: https://github.com/ansible/ansibullbot/blob/master/ISSUE_HELP.md
.. _maintainer's file: https://github.com/ansible/ansible/blob/devel/.github/BOTMETA.yml
Some modules have no community maintainers assigned. In this case, the maintainer is listed as ``$team_ansible``. Ultimately, it’s our goal to have at least one community maintainer for every module.
Some modules have no community maintainers assigned. In this case, the maintainer is listed as ``$team_ansible``. Ultimately, it's our goal to have at least one community maintainer for every module.
The maintainer’s job is to review PRs and decide whether that PR should be merged (``shipit``) or revised (``needs_revision``).
The maintainer's job is to review PRs and decide whether that PR should be merged (``shipit``) or revised (``needs_revision``).
The ultimate goal of any pull request is to reach **shipit** status, where the Core team then decides whether the PR is ready to be merged. Not every PR that reaches the **shipit** label is actually ready to be merged, but the better our reviewers are, and the better our guidelines are, the more likely it will be that a PR that reaches **shipit** will be mergeable.
@ -54,7 +54,7 @@ Workflow
Ansibullbot runs continuously. You can generally expect to see changes to your issue or pull request within thirty minutes. Ansibullbot examines every open pull request in the repositories, and enforces state roughly according to the following workflow:
- If a pull request has no workflow labels, it’s considered **new**. Files in the pull request are identified, and the maintainers of those files are pinged by the bot, along with instructions on how to review the pull request. (Note: sometimes we strip labels from a pull request to “reboot” this process.)
- If a pull request has no workflow labels, it's considered **new**. Files in the pull request are identified, and the maintainers of those files are pinged by the bot, along with instructions on how to review the pull request. (Note: sometimes we strip labels from a pull request to "reboot" this process.)
- If the module maintainer is not ``$team_ansible``, the pull request then goes into the **community_review** state.
- If the module maintainer is ``$team_ansible``, the pull request then goes into the **core_review** state (and probably sits for a while).
- If the pull request is in **community_review** and has received comments from the maintainer:
@ -110,4 +110,4 @@ Special Labels
- **new_plugin**: this is for new modules or plugins that are not yet in Ansible.
**Note:** `new_plugin` kicks off a completely separate process, and frankly it doesn’t work very well at present. We’re working our best to improve this process.
**Note:** `new_plugin` kicks off a completely separate process, and frankly it doesn't work very well at present. We're working our best to improve this process.

View File

@ -25,7 +25,7 @@ For multiple-file content, we encourage use of gist.github.com. Online pastebin
If you are not sure if something is a bug yet, you are welcome to ask about something on the mailing list or IRC first.
As we are a very high volume project, if you determine that you do have a bug, please be sure to open the issue yourself to ensure we have a record of it. Don’t rely on someone else in the community to file the bug report for you.
As we are a very high volume project, if you determine that you do have a bug, please be sure to open the issue yourself to ensure we have a record of it. Don't rely on someone else in the community to file the bug report for you.
Requesting a feature
====================

View File

@ -44,8 +44,8 @@ In 2.0 things get a bit more complicated to start, but you end up with much more
import json
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
from ansible.vars.manager import VariableManager
from ansible.inventory.manager import InventoryManager
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase
@ -63,21 +63,21 @@ In 2.0 things get a bit more complicated to start, but you end up with much more
This method could store the result in an instance attribute for retrieval later
"""
host = result._host
print json.dumps({host.name: result._result}, indent=4)
print(json.dumps({host.name: result._result}, indent=4))
Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check'])
Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'diff'])
# initialize needed objects
variable_manager = VariableManager()
loader = DataLoader()
options = Options(connection='local', module_path='/path/to/mymodules', forks=100, become=None, become_method=None, become_user=None, check=False)
options = Options(connection='local', module_path='/path/to/mymodules', forks=100, become=None, become_method=None, become_user=None, check=False,
diff=False)
passwords = dict(vault_pass='secret')
# Instantiate our ResultCallback for handling results as they come in
results_callback = ResultCallback()
# create inventory and pass to var manager
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list='localhost')
variable_manager.set_inventory(inventory)
inventory = InventoryManager(loader=loader, sources=['localhost'])
variable_manager = VariableManager(loader=loader, inventory=inventory)
# create play with tasks
play_source = dict(

View File

@ -55,7 +55,7 @@ The complete module metadata specification is here: `Ansible metadata block <htt
* Examples--include them whenever possible and make sure they are reproducible.
* Document the return structure of the module. Refer to :ref:`common_return_values` and :ref:`module_documenting` for additional information.
* Predictable user interface: This is a particularly important section as it is also an area where we need significant improvements.
* Name consistency across modules (we’ve gotten better at this, but we still have many deviations).
* Name consistency across modules (we've gotten better at this, but we still have many deviations).
* Declarative operation (not CRUD)--this makes it easy for a user not to care what the existing state is, just about the final state. ``started/stopped``, ``present/absent``--don't overload options too much. It is preferable to add a new, simple option than to add choices/states that don't fit with existing ones.
* Keep options small, having them take large data structures might save us a few tasks, but adds a complex requirement that we cannot easily validate before passing on to the module.
* Allow an "expert mode". This may sound like the absolute opposite of the previous one, but it is always best to let expert users deal with complex data. This requires different modules in some cases, so that you end up having one (1) expert module and several 'piecemeal' ones (ec2_vpc_net?). The reason for this is not, as many users express, because it allows a single task and keeps plays small (which just moves the data complexity into vars files, leaving you with a slightly different structure in another YAML file). It does, however, allow for a more 'atomic' operation against the underlying APIs and services.

View File

@ -109,11 +109,11 @@ Structure
Fields
^^^^^^
:metadata_version: An “X.Y” formatted string. X and Y are integers which
:metadata_version: An "X.Y" formatted string. X and Y are integers which
define the metadata format version. Modules shipped with Ansible are
tied to an Ansible release, so we will only ship with a single version
of the metadata. We’ll increment Y if we add fields or legal values
to an existing field. We’ll increment X if we remove fields or values
of the metadata. We'll increment Y if we add fields or legal values
to an existing field. We'll increment X if we remove fields or values
or change the type or meaning of a field.
Current metadata_version is "1.1"
:supported_by: This field records who supports the module.
@ -130,13 +130,13 @@ Fields
`Modules Support <http://docs.ansible.com/ansible/modules_support.html>`_.
:status: This field records information about the module that is
important to the end user. It’s a list of strings. The default value
is a single element list [“preview”]. The following strings are valid
important to the end user. It's a list of strings. The default value
is a single element list ["preview"]. The following strings are valid
statuses and have the following meanings:
:stableinterface: This means that the module’s parameters are
:stableinterface: This means that the module's parameters are
stable. Every effort will be made not to remove parameters or change
their meaning. It is not a rating of the module’s code quality.
their meaning. It is not a rating of the module's code quality.
:preview: This module is a tech preview. This means it may be
unstable, the parameters may change, or it may require libraries or
web services that are themselves subject to incompatible changes.
@ -223,6 +223,8 @@ The following fields can be used and are all required unless specified otherwise
* If `required` is false/missing, `default` may be specified (assumed 'null' if missing).
* Ensure that the default parameter in the docs matches the default parameter in the code.
* The default option must not be listed as part of the description.
* If the option is a boolean value, you can use any of the boolean values recognized by Ansible:
(such as true/false or yes/no). Choose the one that reads better in the context of the option.
:choices:
List of option values. Should be absent if empty.
:type:

View File

@ -26,7 +26,7 @@ Although it's tempting to get straight into coding, there are a few things to be
* Shared code can be placed into ``lib/ansible/module_utils/``
* Shared documentation (for example describing common arguments) can be placed in ``lib/ansible/utils/module_docs_fragments/``.
* With great power comes great responsibility: Ansible module maintainers have a duty to help keep modules up to date. As with all successful community projects, module maintainers should keep a watchful eye for reported issues and contributions.
* Although not required, unit and/or integration tests are strongly recommended. Unit tests are especially valuable when external resources (such as cloud or network devices) are required. For more information see :doc:`testing` and the `Testing Working Group <https://github.com/ansible/community/blob/master/meetings/README.md>`_.
* Although not required, unit and/or integration tests are strongly recommended. Unit tests are especially valuable when external resources (such as cloud or network devices) are required. For more information see :doc:`dev_guide/testing` and the `Testing Working Group <https://github.com/ansible/community/blob/master/meetings/README.md>`_.
* Starting with Ansible 2.4 all :doc:`../list_of_network_modules` MUST have unit tests.

View File

@ -295,7 +295,7 @@ new exception-catching syntax which uses the ``as`` keyword:
Do **not** use the following syntax as it will fail on every version of Python-3:
.. This code block won't highlight because python2 isn't recognized. This is necessary to pass tests under python 3.
.. code-block:: python2
.. code-block:: none
try:
a = 2/0

View File

@ -30,7 +30,6 @@ To get started, select one of the following topics.
developing_core
developing_python3
developing_api
developing_test_pr
developing_rebasing
testing
repomerge

View File

@ -25,7 +25,7 @@ Inventory
By default, Ansible represents what machines it manages using a very simple INI file that puts all of your managed machines in groups of your own choosing.
To add new machines, there is no additional SSL signing server involved, so there's never any hassle deciding why a particular machine didn’t get linked up due to obscure NTP or DNS issues.
To add new machines, there is no additional SSL signing server involved, so there's never any hassle deciding why a particular machine didn't get linked up due to obscure NTP or DNS issues.
If there's another source of truth in your infrastructure, Ansible can also plugin to that, such as drawing inventory, group, and variable information from sources like EC2, Rackspace, OpenStack, and more.
@ -69,4 +69,4 @@ Here's what a simple playbook looks like::
Extending Ansible with Plug-ins and the API
````````````````````````````````````````````
Should you want to write your own, Ansible modules can be written in any language that can return JSON (Ruby, Python, bash, etc). Inventory can also plug in to any datasource by writing a program that speaks to that datasource and returns JSON. There's also various Python APIs for extending Ansible’s connection types (SSH is not the only transport possible), callbacks (how Ansible logs, etc), and even for adding new server side behaviors.
Should you want to write your own, Ansible modules can be written in any language that can return JSON (Ruby, Python, bash, etc). Inventory can also plug in to any datasource by writing a program that speaks to that datasource and returns JSON. There's also various Python APIs for extending Ansible's connection types (SSH is not the only transport possible), callbacks (how Ansible logs, etc), and even for adding new server side behaviors.

View File

@ -110,7 +110,7 @@ Never use "we" when writing. "We" aren't doing anything on the user side. Ansibl
Hyphen
~~~~~~~~~~~~~~
The hyphen’s primary function is the formation of certain compound terms. Do not use a hyphen unless it serves a purpose. If a compound adjective cannot be misread or, as with many psychological terms, its meaning is established, a hyphen is not necessary.
The hyphen's primary function is the formation of certain compound terms. Do not use a hyphen unless it serves a purpose. If a compound adjective cannot be misread or, as with many psychological terms, its meaning is established, a hyphen is not necessary.
Use hyphens to avoid ambiguity or confusion:

View File

@ -78,7 +78,7 @@ Use to describes where to place options for a command, but not where to type the
Daylight saving time (DST)
+++++++++++++++++++++++++++++++
Correct. Do not use daylight savings time. Daylight Saving Time (DST) is often misspelled “Daylight Savings”, with an “s” at the end. Other common variations are “Summer Time”and “Daylight-Saving Time”. (http://www.timeanddate.com/time/dst/daylight-savings-time.html)
Correct. Do not use daylight savings time. Daylight Saving Time (DST) is often misspelled "Daylight Savings", with an "s" at the end. Other common variations are "Summer Time"and "Daylight-Saving Time". (http://www.timeanddate.com/time/dst/daylight-savings-time.html)
Download
@ -99,7 +99,7 @@ When used as a verb, fail over is two words since there can be different tenses
Fewer
+++++++++++++++++++
Fewer is used with plural nouns. Think things you could count. Time, money, distance, and weight are often listed as exceptions to the traditional “can you count it” rule, often thought of a singular amounts (the work will take less than 5 hours, for example).
Fewer is used with plural nouns. Think things you could count. Time, money, distance, and weight are often listed as exceptions to the traditional "can you count it" rule, often thought of a singular amounts (the work will take less than 5 hours, for example).
File name
+++++++++++++

View File

@ -13,8 +13,8 @@ This style guide incorporates current Ansible resources and information so that
<blockquote class="note info">
“If you don't find it in the index, look very carefully through the entire catalogue.”
― Sears, Roebuck and Co., 1897 Sears Roebuck & Co. Catalogue
"If you don't find it in the index, look very carefully through the entire catalogue."
― Sears, Roebuck and Co., 1897 Sears Roebuck & Co. Catalogue
.. raw:: html

View File

@ -0,0 +1,4 @@
Sanity Tests » no-smart-quotes
==============================
Smart quotes (``”“‘’``) should not be used. Use plain ascii quotes (``"'``) instead.

View File

@ -0,0 +1,16 @@
Sanity Tests » no-unicode_literals
==================================
The use of :code:`from __future__ import unicode_literals` has been deemed an anti-pattern. The
problems with it are:
* It makes it so one can't jump into the middle of a file and know whether a bare literal string is
a byte string or text string. The programmer has to first check the top of the file to see if the
import is there.
* It removes the ability to define native strings (a string which should be a byte string on python2
and a text string on python3) via a string literal.
* It makes for more context switching. A programmer could be reading one file which has
`unicode_literals` and know that bare string literals are text strings but then switch to another
file (perhaps tracing program execution into a third party library) and have to switch their
understanding of what bare string literals are.

View File

@ -152,7 +152,7 @@ Content of the *requirements.yml* file:
# from galaxy
- src: yatesr.timezone
- include: <path_to_requirements>/webserver.yml
- import_tasks: <path_to_requirements>/webserver.yml
Content of the *webserver.yml* file:

View File

@ -436,7 +436,7 @@ when a term comes up on the mailing list.
labeled ``ntp``, and then run just the ``ntp`` steps to reconfigure
the time server information on a remote host.
Tasks
Task
:term:`Playbooks` exist to run tasks. Tasks combine an :term:`action`
(a module and its arguments) with a name and optionally some other
keywords (like :term:`looping directives <loops>`). :term:`Handlers`
@ -444,6 +444,9 @@ when a term comes up on the mailing list.
unless they are notified by name when a task reports an underlying
change on a remote system.
Tasks
A list of :term:`Task`.
Templates
Ansible can easily transfer files to remote systems but often it is
desirable to substitute variables in other files. Variables may come

View File

@ -40,11 +40,11 @@ There is now a detailed official tutorial describing `how to create a service pr
After stepping through the tutorial you will have:
* Your Client ID, which is found in the “client id” box in the “Configure” page of your application in the Azure portal
* Your Client ID, which is found in the "client id" box in the "Configure" page of your application in the Azure portal
* Your Secret key, generated when you created the application. You cannot show the key after creation.
If you lost the key, you must create a new one in the “Configure” page of your application.
* And finally, a tenant ID. It’s a UUID (e.g. ABCDEFGH-1234-ABCD-1234-ABCDEFGHIJKL) pointing to the AD containing your
application. You will find it in the URL from within the Azure portal, or in the “view endpoints” of any given URL.
If you lost the key, you must create a new one in the "Configure" page of your application.
* And finally, a tenant ID. It's a UUID (e.g. ABCDEFGH-1234-ABCD-1234-ABCDEFGHIJKL) pointing to the AD containing your
application. You will find it in the URL from within the Azure portal, or in the "view endpoints" of any given URL.
Using Active Directory Username/Password

View File

@ -16,7 +16,7 @@ We believe simplicity is relevant to all sizes of environments, so we design for
Ansible manages machines in an agent-less manner. There is never a question of how to
upgrade remote daemons or the problem of not being able to manage systems because daemons are uninstalled. Because OpenSSH is one of the most peer-reviewed open source components, security exposure is greatly reduced. Ansible is decentralized--it relies on your existing OS credentials to control access to remote machines. If needed, Ansible can easily connect with Kerberos, LDAP, and other centralized authentication management systems.
This documentation covers the current released version of Ansible (2.3) and also some development version features (2.4). For recent features, we note in each section the version of Ansible where the feature was added.
This documentation covers the current released version of Ansible (2.4) and also some development version features ('devel'). For recent features, we note in each section the version of Ansible where the feature was added.
Ansible, Inc. releases a new major release of Ansible approximately every two months. The core application evolves somewhat conservatively, valuing simplicity in language design and setup. However, the community around new modules and plugins being developed and contributed moves very quickly, typically adding 20 or so new modules in each release.
@ -32,6 +32,7 @@ Ansible, Inc. releases a new major release of Ansible approximately every two mo
modules
modules_by_category
vault
command_line_tools
guides
dev_guide/index
tower

View File

@ -195,7 +195,7 @@ Deploying From Source Control
Deploy your webapp straight from git::
$ ansible webservers -m git -a "repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD"
$ ansible webservers -m git -a "repo=https://foo.example.org/repo.git dest=/srv/myapp version=HEAD"
Since Ansible modules can notify change handlers it is possible to
tell Ansible to run specific tasks when the code is updated, such as

View File

@ -27,7 +27,7 @@ Bootstrapping BSD
As mentioned above, you can bootstrap Ansible with the ``raw`` module and remotely install Python on targets. The following example installs Python 2.7 which includes the json library required for full functionality of Ansible.
On your control machine you can simply execute the following for most versions of FreeBSD::
ansible -m raw -a “pkg install -y python27” mybsdhost1
ansible -m raw -a "pkg install -y python27" mybsdhost1
Once this is done you can now use other Ansible modules apart from the ``raw`` module.

View File

@ -443,7 +443,7 @@ value is a TTL in seconds::
fact_path
=========
This option allows you to globally configure a custom path for :ref:`_local_facts`:: for the implied `setup` task when using implied fact gathering.
This option allows you to globally configure a custom path for :ref:`local_facts` for the implied `setup` task when using implied fact gathering.
fact_path = /home/centos/ansible_facts.d
@ -657,15 +657,15 @@ merge_multiple_cli_tags
.. versionadded:: 2.3
This allows changing how multiple :option:`--tags` and :option:`--skip-tags`
arguments are handled on the command line. Specifying :option:`--tags` more
than once merges all of the :option:`--tags` options together. If you want
the pre-2.4.x behaviour where only the last value of :option:`--tags` is used,
then set this to False. The same holds true for :option:`--skip-tags`.
This allows changing how multiple :option:`--tags <ansible-playbook --tags>` and :option:`--skip-tags <ansible-playbook --skip-tags>`
arguments are handled on the command line. Specifying :option:`--tags <ansible-playbook --tags>` more
than once merges all of the :option:`--tags <ansible-playbook --tags>` options together. If you want
the pre-2.4.x behaviour where only the last value of :option:`--tags <ansible-playbook --tags>` is used,
then set this to False. The same holds true for :option:`--skip-tags <ansible-playbook --skip-tags>`.
.. note:: The default value for this in 2.3 is False. In 2.4, the
default value is True. After 2.8, the option will be removed.
Multiple :option:`--tags` and multiple :option:`--skip-tags` will always
Multiple :option:`--tags <ansible-playbook --tags>` and multiple :option:`--skip-tags <ansible-playbook --skip-tags>` will always
be merged together.
.. _module_lang:
@ -814,26 +814,6 @@ always default to the current user if this is not defined::
remote_user = root
.. _restrict_facts_namespace:
restrict_facts_namespace
========================
.. versionadded:: 2.4
This allows restricting facts in their own namespace (under ansible_facts) instead of pushing them into the main.
False by default. Can also be set via the environment variable :envvar:`ANSIBLE_RESTRICT_FACTS`. Using `ansible_system` as an example:
When False::
- debug: var=ansible_system
When True::
- debug: var=ansible_facts.ansible_system
.. _retry_files_enabled:
retry_files_enabled
@ -1025,7 +1005,7 @@ As of 1.7 this file can also be a script. If you are using a script instead of a
Privilege Escalation Settings
-----------------------------
Ansible can use existing privilege escalation systems to allow a user to execute tasks as another. As of 1.9 ‘become’ supersedes the old sudo/su, while still being backwards compatible. Settings live under the [privilege_escalation] header.
Ansible can use existing privilege escalation systems to allow a user to execute tasks as another. As of 1.9 'become' supersedes the old sudo/su, while still being backwards compatible. Settings live under the [privilege_escalation] header.
.. _become:

View File

@ -104,10 +104,10 @@ Installing the Control Machine
Latest Release Via Yum
++++++++++++++++++++++
.. note:: We’ve changed how the Ansible community packages are distributed.
.. note:: We've changed how the Ansible community packages are distributed.
For users of RHEL/CentOS/Scientific Linux version 7, the Ansible community RPM
package will transition from the EPEL repository to the Extras channel. There will be no
change for version 6 of RHEL/CentOS/Scientific Linux since Extras is not a part of version 6.
change for version 6 of RHEL/CentOS/Scientific Linux since Extras is not a part of version 6.
RPMs for RHEL7 are available from `the Extras channel <https://access.redhat.com/solutions/912213>`_.
@ -115,16 +115,16 @@ RPMs for RHEL6 are available from yum for `EPEL
<http://fedoraproject.org/wiki/EPEL>`_ 6 and currently supported
Fedora distributions.
Ansible will also have RPMs/YUM-repo available at `<https://releases.ansible.com/ansible/rpms/`.
Ansible will also have RPMs/YUM-repo available at `<https://releases.ansible.com/ansible/rpm/`_.
Ansible version 2.4 can manage earlier operating
systems that contain Python 2.6 or higher.
You can also build an RPM yourself. From the root of a checkout or tarball, use the ``make rpm`` command to build an RPM you can distribute and install.
You can also build an RPM yourself. From the root of a checkout or tarball, use the ``make rpm`` command to build an RPM you can distribute and install.
.. code-block:: bash
$ git clone git://github.com/ansible/ansible.git
$ git clone https://github.com/ansible/ansible.git
$ cd ./ansible
$ make rpm
$ sudo rpm -Uvh ./rpm-build/ansible-*.noarch.rpm
@ -263,7 +263,7 @@ Then install Ansible with [1]_::
Or if you are looking for the latest development version::
pip install git+git://github.com/ansible/ansible.git@devel
pip install git+https://github.com/ansible/ansible.git@devel
If you are installing on OS X Mavericks, you may encounter some noise from your compiler. A workaround is to do the following::
@ -305,7 +305,7 @@ To install from source, clone the Ansible git repository:
.. code-block:: bash
$ git clone git://github.com/ansible/ansible.git --recursive
$ git clone https://github.com/ansible/ansible.git --recursive
$ cd ./ansible
Once git has cloned the Ansible repository, setup the Ansible environment:

View File

@ -11,7 +11,7 @@ which defaults to being saved in the location ``/etc/ansible/hosts``.
You can specify a different inventory file using the ``-i <path>`` option on the command line.
Not only is this inventory configurable, but you can also use multiple inventory files at the same time and
pull inventory from dynamic or cloud sources, as described in :doc:`intro_dynamic_inventory`.
pull inventory from dynamic or cloud sources or different formats (YAML, ini, etc), as described in :doc:`intro_dynamic_inventory`.
Introduced in version 2.4, Ansible has inventory plugins to make this flexible and customizable.
.. _inventoryformat:
@ -38,12 +38,30 @@ For this example, the format for ``/etc/ansible/hosts`` is an INI-like (one of A
The headings in brackets are group names, which are used in classifying systems
and deciding what systems you are controlling at what times and for what purpose.
A YAML version would look like:
.. code-block:: yaml
all:
hosts:
mail.example.com
children:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:
It is ok to put systems in more than one group, for instance a server could be both a webserver and a dbserver.
If you do, note that variables will come from all of the groups they are a member of. Variable precedence is detailed in a later chapter.
If you have hosts that run on non-standard SSH ports you can put the port number
after the hostname with a colon. Ports listed in your SSH config file won't be used with the `paramiko`
connection but will be used with the `openssh` connection.
If you have hosts that run on non-standard SSH ports you can put the port number after the hostname with a colon.
Ports listed in your SSH config file won't be used with the `paramiko` connection but will be used with the `openssh` connection.
To make things explicit, it is suggested that you set them if things are not running on the default port:
@ -51,20 +69,33 @@ To make things explicit, it is suggested that you set them if things are not run
badwolf.example.com:5309
Suppose you have just static IPs and want to set up some aliases that live in your host file, or you are connecting through tunnels. You can also describe hosts like this:
Suppose you have just static IPs and want to set up some aliases that live in your host file, or you are connecting through tunnels.
You can also describe hosts via variables:
In INI:
.. code-block:: ini
jumper ansible_port=5555 ansible_host=192.0.2.50
In the above example, trying to ansible against the host alias "jumper" (which may not even be a real hostname) will contact 192.0.2.50 on port 5555. Note that this is using a feature of the inventory file to define some special variables. Generally speaking this is not the best
way to define variables that describe your system policy, but we'll share suggestions on doing this later. We're just getting started.
In YAML:
.. note:: Values passed in using the ``key=value`` syntax are interpreted as Python literal structure (strings, numbers, tuples, lists, dicts,
booleans, None), alternatively as string. For example ``var=FALSE`` would create a string equal to 'FALSE'. Do not rely on types set
during definition, always make sure you specify type with a filter when needed when consuming the variable.
.. code-block:: yaml
Adding a lot of hosts? If you have a lot of hosts following similar patterns you can do this rather than listing each hostname:
hosts:
jumper:
ansible_port: 5555
ansible_host: 192.0.2.50
In the above example, trying to ansible against the host alias "jumper" (which may not even be a real hostname) will contact 192.0.2.50 on port 5555.
Note that this is using a feature of the inventory file to define some special variables.
Generally speaking, this is not the best way to define variables that describe your system policy, but we'll share suggestions on doing this later.
.. note:: Values passed in the INI format using the ``key=value`` syntax are not interpreted as Python literal structure
(strings, numbers, tuples, lists, dicts, booleans, None), but as a string. For example ``var=FALSE`` would create a string equal to 'FALSE'.
Do not rely on types set during definition, always make sure you specify type with a filter when needed when consuming the variable.
If you are adding a lot of hosts following similar patterns, you can do this rather than listing each hostname:
.. code-block:: ini
@ -91,15 +122,14 @@ You can also select the connection type and user on a per host basis:
other1.example.com ansible_connection=ssh ansible_user=mpdehaan
other2.example.com ansible_connection=ssh ansible_user=mdehaan
As mentioned above, setting these in the inventory file is only a shorthand, and we'll discuss how to store them in individual files
in the 'host_vars' directory a bit later on.
As mentioned above, setting these in the inventory file is only a shorthand, and we'll discuss how to store them in individual files in the 'host_vars' directory a bit later on.
.. _host_variables:
Host Variables
++++++++++++++
As alluded to above, it is easy to assign variables to hosts that will be used later in playbooks:
As described above, it is easy to assign variables to hosts that will be used later in playbooks:
.. code-block:: ini
@ -112,7 +142,11 @@ As alluded to above, it is easy to assign variables to hosts that will be used l
Group Variables
+++++++++++++++
Variables can also be applied to an entire group at once::
Variables can also be applied to an entire group at once:
The INI way:
.. code-block:: ini
[atlanta]
host1
@ -122,14 +156,30 @@ Variables can also be applied to an entire group at once::
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
Be aware that this is only a convenient way to apply variables to multiple hosts at once; even though you can target hosts by group, variables are always flattened to the host level before a play is executed.
The YAML version:
.. code-block:: yaml
atlanta:
hosts:
host1:
host2:
vars:
ntp_server: ntp.atlanta.example.com
proxy: proxy.atlanta.example.com
Be aware that this is only a convenient way to apply variables to multiple hosts at once; even though you can target hosts by group, **variables are always flattened to the host level** before a play is executed.
.. _subgroups:
Groups of Groups, and Group Variables
+++++++++++++++++++++++++++++++++++++
It is also possible to make groups of groups using the ``:children`` suffix. Just like above, you can apply variables using ``:vars``::
It is also possible to make groups of groups using the ``:children`` suffix in INI or the ``children:`` entry in YAML.
You can apply variables using ``:vars`` or ``vars:``:
.. code-block:: ini
[atlanta]
host1
@ -155,11 +205,38 @@ It is also possible to make groups of groups using the ``:children`` suffix. Jus
southwest
northwest
.. code-block:: yaml
all:
children:
usa:
children:
southeast:
children:
atlanta:
hosts:
host1:
host2:
raleigh:
hosts:
host2:
host3:
vars:
some_server: foo.southeast.example.com
halon_system_timeout: 30
self_destruct_countdown: 60
escape_pods: 2
northeast:
northwest:
southwest:
If you need to store lists or hash data, or prefer to keep host and group specific variables separate from the inventory file, see the next section.
Child groups have a couple of properties to note:
- First, any host that is member of a child group is automatically a member of the parent group.
- Second, a child group's variables will have higher precedence (override) a parent group's variables.
- Any host that is member of a child group is automatically a member of the parent group.
- A child group's variables will have higher precedence (override) a parent group's variables.
- Groups can have multiple parents and children, but not circular relationships.
- Hosts can also be in multiple groups, but there will only be **one** instance of a host, merging the data from the multiple groups.
.. _default_groups:
@ -168,20 +245,20 @@ Default groups
There are two default groups: ``all`` and ``ungrouped``. ``all`` contains every host.
``ungrouped`` contains all hosts that don't have another group aside from ``all``.
Every host will always belong to at least 2 groups.
Though ``all`` and ``ungrouped`` are always present, they can be implicit and not appear in group listings like ``group_names``.
.. _splitting_out_vars:
Splitting Out Host and Group Specific Data
++++++++++++++++++++++++++++++++++++++++++
The preferred practice in Ansible is actually not to store variables in the main inventory file.
The preferred practice in Ansible is to not store variables in the main inventory file.
In addition to storing variables directly in the INI file, host
and group variables can be stored in individual files relative to the
inventory file.
In addition to storing variables directly in the inventory file, host and group variables can be stored in individual files relative to the inventory file (not directory, it is always the file).
These variable files are in YAML format. Valid file extensions include '.yml', '.yaml', '.json',
or no file extension. See :doc:`YAMLSyntax` if you are new to YAML.
These variable files are in YAML format. Valid file extensions include '.yml', '.yaml', '.json', or no file extension.
See :doc:`YAMLSyntax` if you are new to YAML.
Assuming the inventory file path is::
@ -202,9 +279,9 @@ the 'raleigh' group might look like::
ntp_server: acme.example.org
database_server: storage.example.org
It is ok if these files do not exist, as this is an optional feature.
It is okay if these files do not exist, as this is an optional feature.
As an advanced use-case, you can create *directories* named after your groups or hosts, and
As an advanced use case, you can create *directories* named after your groups or hosts, and
Ansible will read all the files in these directories. An example with the 'raleigh' group::
/etc/ansible/group_vars/raleigh/db_settings
@ -372,7 +449,7 @@ Here is an example of how to instantly deploy to created containers::
:doc:`intro_adhoc`
Examples of basic commands
:doc:`playbooks`
Learning Ansible’s configuration, deployment, and orchestration language.
Learning Ansible's configuration, deployment, and orchestration language.
`Mailing List <http://groups.google.com/group/ansible-project>`_
Questions? Help? Ideas? Stop by the list on Google Groups
`irc.freenode.net <http://irc.freenode.net>`_

View File

@ -1,51 +1,50 @@
Module Support
--------------
Module Maintenance & Support
----------------------------
.. toctree:: :maxdepth: 1
Ansible has many modules, but not all of them are maintained by the core project committers. Each module should have associated metadata that indicates which of the following categories they fall into. This should be visible in each module's documentation.
Documentation updates for each module can also be edited directly in the module and by submitting a pull request to the module source code; just look for the "DOCUMENTATION" block in the source tree.
If you believe you have found a bug in a module and are already running the latest stable or development version of Ansible, first look in the `issue tracker at github.com/ansible/ansible <https://github.com/ansible/ansible/issues>`_ to see if a bug has already been filed. If not, we would be grateful if you would file one.
Should you have a question rather than a bug report, inquiries are welcome on the `ansible-project google group <https://groups.google.com/forum/#!forum/ansible-project>`_ or on Ansible's "#ansible" channel, located on irc.freenode.net.
For development-oriented topics, use the `ansible-devel google group <https://groups.google.com/forum/#!forum/ansible-devel>`_ or Ansible's ``#ansible`` and ``#ansible-devel`` channels, located on irc.freenode.net. You should also read :doc:`community`, :doc:`dev_guide/testing` and :doc:`dev_guide/developing_modules`.
The modules are hosted on GitHub in a subdirectory of the `ansible <https://github.com/ansible/ansible/tree/devel/lib/ansible/modules>`_ repo.
To help identify maintainers and understand how the included modules are officially supported, each module now has associated metadata that provides additional clarity for maintenance and support.
Core
````
These are :doc:`modules maintained by the Ansible Core Team<core_maintained>`
and will always ship with Ansible itself.
:doc:`Core modules are maintained by the Ansible Engineering Team<core_maintained>`.
These modules are integral to the basic foundations of the Ansible distribution.
Network
```````
These are :doc:`modules maintained by the Ansible Network Team<network_maintained>` in a relationship
similar to how the Ansible Core Team maintains the Core modules.
:doc:`Network modules are maintained by the Ansible Network Team<network_maintained>`. Please note there are :doc:`additional networking modules<list_of_network_modules>` that are categorized as Certified or Community not maintained by Ansible.
Certified
`````````
Some examples of :doc:`Certified Modules<partner_maintained>` are those submitted by other companies. Maintainers of these types of modules must watch for any issues reported or pull requests raised against the module.
The Ansible Core Team will review all modules becoming certified. Core committers will review proposed changes to existing Certified Modules once the community maintainers of the module have approved the changes. Core committers will also ensure that any issues that arise due to Ansible engine changes will be remediated.
Also, it is strongly recommended (but not presently required) for these types of modules to have unit tests.
These modules are currently shipped with Ansible, but might be shipped separately in the future.
Certified modules are part of a future planned program currently in development.
Community
`````````
These are :doc:`modules maintained by the Ansible Community<community_maintained>`. They **are not** supported by the Ansible Core Team or by companies/partners associated to the module.
:doc:`Community modules are submitted and maintained by the Ansible community<community_maintained>`. These modules are not maintained by Ansible, and are included as a convenience.
They are still fully usable, but the response rate to issues is purely up to the community. Best effort support will be provided but is not covered under any support contracts.
Issue Reporting
```````````````
These modules are currently shipped with Ansible, but will most likely be shipped separately in the future.
If you believe you have found a bug in a module and are already running the latest stable or development version of Ansible, first look at the `issue tracker in the Ansible repo <https://github.com/ansible/ansible/issues>`_ to see if an issue has already been filed. If not, please file one.
Should you have a question rather than a bug report, inquiries are welcome on the `ansible-project Google group <https://groups.google.com/forum/#%21forum/ansible-project>`_ or on Ansible's "#ansible" channel, located on irc.freenode.net.
For development-oriented topics, use the `ansible-devel Google group <https://groups.google.com/forum/#%21forum/ansible-devel>`_ or Ansible's #ansible and #ansible-devel channels, located on irc.freenode.net. You should also read :doc:`Community Information & Contributing <community>`, :doc:`Testing Ansible <dev_guide/testing>`, and :doc:`Developing Modules <dev_guide/developing_modules>`.
The modules are hosted on GitHub in a subdirectory of the `Ansible <https://github.com/ansible/ansible/tree/devel/lib/ansible/modules>`_ repo.
NOTE: If you have a Red Hat Ansible Engine product subscription, please follow the standard issue reporting process via the Red Hat Customer Portal.
Support
```````
For more information on how included Ansible modules are supported by Red Hat,
please refer to the following `knowledgebase article <https://access.redhat.com/articles/3166901>`_ as well as other resources on the `Red Hat Customer Portal. <https://access.redhat.com/>`_
.. seealso::

View File

@ -32,7 +32,7 @@ Errors generally fall into one of the following categories:
* Can occur when trying to pull a large amount of data
* May actually be masking a authentication issue
:Playbook issues:
* Use of ``delegate_to``, instead of ``ProxyCommand``
* Use of ``delegate_to``, instead of ``ProxyCommand``. See :ref:`network proxy guide <network_delegate_to_vs_ProxyCommand>` for more information.
* Not using ``connection: local``
@ -51,7 +51,7 @@ Enabling Networking logging and how to read the logfile
Ansible 2.3 features improved logging to help diagnose and troubleshoot issues regarding Ansible Networking modules.
Because logging is very verbose it is disabled by default. It can be enabled via the :envvar:`ANSIBLE_LOG_PATH` and :envvar:`ANISBLE_DEBUG` options::
Because logging is very verbose it is disabled by default. It can be enabled via the :envvar:`ANSIBLE_LOG_PATH` and :envvar:`ANSIBLE_DEBUG` options::
# Specify the location for the log file
export ANSIBLE_LOG_PATH=~/ansible.log
@ -410,10 +410,10 @@ For example:
Suggestions to resolve:
Increase value of presistent connection idle timeout.
Note: This value should be greater than SSH timeout ie. timeout value under defaults
section in configuration file and less than the value of the persistent
connection idle timeout (connect_timeout)
Increase the value of the persistent connection idle timeout.
Note: This value should be greater than the SSH timeout value (the timeout value under the defaults
section in the configuration file) and less than the value of the persistent
connection idle timeout (connect_timeout).
.. code-block:: yaml
@ -493,7 +493,7 @@ Add ``authorize: yes`` to the task. For example:
If the user requires a password to go into privileged mode, this can be specified with ``auth_pass``; if ``auth_pass`` isn't set, the environment variable :envvar:`ANSIBLE_NET_AUTHORIZE` will be used instead.
Add `authorize: yes` to the task. For example:
Add ``authorize: yes`` to the task. For example:
.. code-block:: yaml
@ -506,40 +506,41 @@ Add `authorize: yes` to the task. For example:
register: result
.. delete_to not honoured
----------------------
Proxy Issues
============
FIXME Do we get an error message
.. _network_delegate_to_vs_ProxyCommand:
FIXME Link to howto
delegate_to vs ProxyCommand
---------------------------
The new connection framework for Network Modules in Ansible 2.3 that uses ``cli`` transport
no longer supports the use of the ``delegate_to`` directive.
In order to use a bastion or intermediate jump host to connect to network devices over ``cli``
transport, network modules now support the use of ``ProxyCommand``.
To use ``ProxyCommand``, configure the proxy settings in the Ansible inventory
file to specify the proxy host.
.. code-block:: ini
[nxos]
nxos01
nxos02
[nxos:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q bastion01"'
With the configuration above, simply build and run the playbook as normal with
no additional changes necessary. The network module will now connect to the
network device by first connecting to the host specified in
``ansible_ssh_common_args``, which is ``bastion01`` in the above example.
fixmes
======
.. note:: Using ``ProxyCommand`` with passwords via variables
Error: "number of connection attempts exceeded, unable to connect to control socket"
------------------------------------------------------------------------------------
By design, SSH doesn't support providing passwords via environment variables.
This is done to prevent secrets from leaking out, for example in ``ps`` output.
**Platforms:** Any
This occurs when Ansible wasn't able to connect to the remote device and obtain a shell with the timeout.
This information is available when :ref:`DEFAULT_LOG_PATH` is set see (FIXMELINKTOSECTION):
.. code-block:: yaml
less $ANSIBLE_LOG_PATH
2017-03-10 15:32:06,173 p=19677 u=fred | connect retry timeout expired, unable to connect to control socket
2017-03-10 15:32:06,174 p=19677 u=fred | persistent_connect_retry_timeout is 15 secs
2017-03-10 15:32:06,222 p=19669 u=fred | fatal: [veos01]: FAILED! => {
Suggestions to resolve:
Do stuff For example:
.. code-block:: yaml
Example stuff
We recommend using SSH Keys, and if needed an ssh-agent, rather than passwords, where ever possible.

View File

@ -94,7 +94,7 @@ of tasks running concurrently, you can do it this way::
- 4
- 5
durations: "{{ item }}"
include: execute_batch.yml
include_tasks: execute_batch.yml
with_items:
- "{{ sleep_durations | batch(2) | list }}"

View File

@ -216,15 +216,15 @@ variables from the file "group_vars/ec2_tag_class_webserver" automatically.
Top Level Playbooks Are Separated By Role
`````````````````````````````````````````
In site.yml, we include a playbook that defines our entire infrastructure. Note this is SUPER short, because it's just including
some other playbooks. Remember, playbooks are nothing more than lists of plays::
In site.yml, we import a playbook that defines our entire infrastructure. This is a very short example, because it's just importing
some other playbooks::
---
# file: site.yml
- include: webservers.yml
- include: dbservers.yml
- import_playbook: webservers.yml
- import_playbook: dbservers.yml
In a file like webservers.yml (also at the top level), we simply map the configuration of the webservers group to the roles performed by the webservers group. Also notice this is incredibly short. For example::
In a file like webservers.yml (also at the top level), we map the configuration of the webservers group to the roles performed by the webservers group::
---
# file: webservers.yml

View File

@ -154,13 +154,13 @@ there will be accessible to future tasks::
.. _when_roles_and_includes:
Applying 'when' to roles and includes
`````````````````````````````````````
Applying 'when' to roles, imports, and includes
```````````````````````````````````````````````
Note that if you have several tasks that all share the same conditional statement, you can affix the conditional
to a task include statement as below. All the tasks get evaluated, but the conditional is applied to each and every task::
- include: tasks/sometasks.yml
- import_tasks: tasks/sometasks.yml
when: "'reticulating splines' in output"
.. note:: In versions prior to 2.0 this worked with task includes but not playbook includes. 2.0 allows it to work with both.
@ -174,6 +174,24 @@ Or with a role::
You will note a lot of 'skipped' output by default in Ansible when using this approach on systems that don't match the criteria.
Read up on the 'group_by' module in the :doc:`modules` docs for a more streamlined way to accomplish the same thing.
When used with `include_*` tasks instead of imports, the conditional is applied _only_ to the include task itself and not any other
tasks within the included file(s). A common situation where this distinction is important is as follows::
# include a file to define a variable when it is not already defined
# main.yml
- include_tasks: other_tasks.yml
when: x is not defined
# other_tasks.yml
- set_fact:
x: foo
- debug:
var: x
In the above example, if ``import_tasks`` had been used instead both included tasks would have also been skipped. With ``include_tasks``
instead, the tasks are executed as expected because the conditional is not applied to them.
.. _conditional_imports:
Conditional Imports

View File

@ -345,7 +345,7 @@ a variable called ``vhost`` in the ``vars`` section, you could do this::
Those same variables are usable in templates, which we'll get to later.
Now in a very basic playbook all the tasks will be listed directly in that play, though it will usually
make more sense to break up tasks using the ``include:`` directive. We'll show that a bit later.
make more sense to break up tasks as described in :doc:`playbooks_reuse`.
.. _action_shorthand:
@ -458,7 +458,7 @@ Let's run a playbook using a parallelism level of 10::
ansible-playbook playbook.yml -f 10
.. _ansible-pull:
.. _playbook_ansible-pull:
Ansible-Pull
````````````

View File

@ -458,7 +458,7 @@ Please check https://api.mongodb.org/python/current/api/pymongo/collection.html?
Since there are too many parameters for this lookup method, below is a sample playbook which shows its usage and a nice way to feed the parameters:
.. code-block:: YAML+Jinja
.. code-block:: yaml
---
- hosts: all

View File

@ -743,7 +743,7 @@ Ansible by default sets the loop variable `item` for each loop, which causes the
As of Ansible 2.1, the `loop_control` option can be used to specify the name of the variable to be used for the loop::
# main.yml
- include: inner.yml
- include_tasks: inner.yml
with_items:
- 1
- 2
@ -807,7 +807,7 @@ Because `loop_control` is not available in Ansible 2.0, when using an include wi
for `item`::
# main.yml
- include: inner.yml
- include_tasks: inner.yml
with_items:
- 1
- 2

View File

@ -27,8 +27,9 @@ Here is a most basic example::
- name: "favcolor"
prompt: "what is your favorite color?"
.. note::
Prompts for individual ``vars_prompt`` variables will be skipped for any variable that is already defined through the command line ``--extra-vars`` option, or when running from a non-interactive session (such as cron or Ansible Tower). See :ref:`_passing_variables_on_the_command_line` in the /Variables/ chapter.
Prompts for individual ``vars_prompt`` variables will be skipped for any variable that is already defined through the command line ``--extra-vars`` option, or when running from a non-interactive session (such as cron or Ansible Tower). See :ref:`passing_variables_on_the_command_line` in the /Variables/ chapter.
If you have a variable that changes infrequently, it might make sense to
provide a default value that can be overridden. This can be accomplished using
@ -77,13 +78,13 @@ You can use any crypt scheme supported by 'Passlib':
- *sun_md5_crypt* - Sun MD5 Crypt
- *sha256_crypt* - SHA-256 Crypt
- *sha512_crypt* - SHA-512 Crypt
- *apr_md5_crypt* - Apache’s MD5-Crypt variant
- *phpass* - PHPass’ Portable Hash
- *apr_md5_crypt* - Apache's MD5-Crypt variant
- *phpass* - PHPass' Portable Hash
- *pbkdf2_digest* - Generic PBKDF2 Hashes
- *cta_pbkdf2_sha1* - Cryptacular’s PBKDF2 hash
- *dlitz_pbkdf2_sha1* - Dwayne Litzenberger’s PBKDF2 hash
- *cta_pbkdf2_sha1* - Cryptacular's PBKDF2 hash
- *dlitz_pbkdf2_sha1* - Dwayne Litzenberger's PBKDF2 hash
- *scram* - SCRAM Hash
- *bsd_nthash* - FreeBSD’s MCF-compatible nthash encoding
- *bsd_nthash* - FreeBSD's MCF-compatible nthash encoding
However, the only parameters accepted are 'salt' or 'salt_size'. You can use your own salt using
'salt', or have one generated automatically using 'salt_size'. If nothing is specified, a salt

View File

@ -9,10 +9,12 @@ Creating Reusable Playbooks
While it is possible to write a playbook in one very large file (and you might start out learning playbooks this way), eventually you'll want to reuse files and start to organize things. In Ansible, there are three ways to do this: includes, imports, and roles.
Includes and imports allow users to break up large playbooks into smaller files, which can be used across multiple parent playbooks or even multiple times within the same Playbook.
Includes and imports (added in 2.4) allow users to break up large playbooks into smaller files, which can be used across multiple parent playbooks or even multiple times within the same Playbook.
Roles allow more than just tasks to be packaged together and can include variables, handlers, or even modules and other plugins. Unlike includes and imports, roles can also be uploaded and shared via Ansible Galaxy.
.. _dynamic_vs_static:
Dynamic vs. Static
``````````````````

View File

@ -13,17 +13,25 @@ As noted in :doc:`playbooks_reuse`, include and import statements are very simil
Please refer to :doc:`playbooks_reuse` for documentation concerning the trade-offs one may encounter when using each type.
Also be aware that this behaviour changed in 2.4; prior to that Ansible version only ``include`` was available, and it behaved differently depending on context.
.. versionadded:: 2.4
Importing Playbooks
```````````````````
It is possible to include playbooks inside a master playbook. For example::
---
import_playbook: webservers.yml
import_playbook: databases.yml
- import_playbook: webservers.yml
- import_playbook: databases.yml
Each playbook listed will be run in the order they are listed.
The plays and tasks in each playbook listed will be run in the order they are listed, just as if they had been defined here directly.
Prior to 2.4 only ``include`` was available and worked for both playbooks and tasks as both import and include.
.. versionadded:: 2.4
Including and Importing Task Files
``````````````````````````````````
@ -61,7 +69,7 @@ Variables can also be passed to include files using an alternative syntax, which
- "{{ lookup('file', 'keys/one.pub') }}"
- "{{ lookup('file', 'keys/two.pub') }}"
Using either syntax, variables passed in can then be used in the included files. These variables will only be available to tasks within the included file. See :doc:`variable_precedence` for more details on variable inheritance and precedence.
Using either syntax, variables passed in can then be used in the included files. These variables will only be available to tasks within the included file. See :ref:`variable_precedence` for more details on variable inheritance and precedence.
Task include statements can be used at arbitrary depth.

View File

@ -33,8 +33,8 @@ Roles expect files to be in certain directory names. Roles must include at least
- ``tasks`` - contains the main list of tasks to be executed by the role.
- ``handlers`` - contains handlers, which may be used by this role or even anywhere outside this role.
- ``defaults`` - default variables for the role (see :doc:`Variables` for more information).
- ``vars`` - other variables for the role (see :doc:`Variables` for more information).
- ``defaults`` - default variables for the role (see :doc:`playbooks_variables` for more information).
- ``vars`` - other variables for the role (see :doc:`playbooks_variables` for more information).
- ``files`` - contains files which can be deployed via this role.
- ``templates`` - contains templates which can be deployed via this role.
- ``meta`` - defines some meta data for this role. See below for more details.
@ -42,7 +42,8 @@ Roles expect files to be in certain directory names. Roles must include at least
Other YAML files may be included in certain directories. For example, it is common practice to have platform-specific tasks included from the ``tasks/main.yml`` file::
# roles/example/tasks/main.yml
- import_tasks: redhat.yml
- name: added in 2.4, previouslly you used 'include'
import_tasks: redhat.yml
when: ansible_os_platform|lower == 'redhat'
- import_tasks: debian.yml
when: ansible_os_platform|lower == 'debian'
@ -57,7 +58,7 @@ Other YAML files may be included in certain directories. For example, it is comm
name: "apache2"
state: present
Roles may also include modules and other plugin types. For more information, please refer to the :doc:`Embedding Modules and Plugins In Roles` section below.
Roles may also include modules and other plugin types. For more information, please refer to the :ref:`embedding_modules_and_plugins_in_roles` section below.
Using Roles
```````````
@ -113,9 +114,9 @@ As of Ansible 2.4, you can now use roles inline with any other tasks using ``imp
When roles are defined in the classic manner, they are treated as static imports and processed during playbook parsing.
.. note::
The ``include_role`` option was introduced in Ansible 2.3. The usage has changed slightly as of Ansible 2.4 to match the include (dynamic) vs. import (static) usage. See :doc:`Dynamic vs. Static` for more details.
The ``include_role`` option was introduced in Ansible 2.3. The usage has changed slightly as of Ansible 2.4 to match the include (dynamic) vs. import (static) usage. See :ref:`dynamic_vs_static` for more details.
The name used for the role can be a simple name (see :doc:`Role Search Path` below), or it can be a fully qualified path::
The name used for the role can be a simple name (see :ref:`role_search_path` below), or it can be a fully qualified path::
---
@ -290,6 +291,8 @@ Note that we did not have to use ``allow_duplicates: true`` for ``wheel``, becau
.. note::
Variable inheritance and scope are detailed in the :doc:`playbooks_variables`.
.. _embedding_modules_and_plugins_in_roles:
Embedding Modules and Plugins In Roles
``````````````````````````````````````
@ -332,6 +335,8 @@ The same mechanism can be used to embed and distribute plugins in a role, using
They can then be used in a template or a jinja template in any role called after 'my_custom_filter'
.. _role_search_path:
Role Search Path
````````````````

View File

@ -80,9 +80,14 @@ You may also apply tags to roles::
roles:
- { role: webserver, port: 5000, tags: [ 'web', 'foo' ] }
And include statements::
And import/include statements::
- include: foo.yml
- import_tasks: foo.yml
tags: [web,foo]
or::
- include_tasks: foo.yml
tags: [web,foo]
All of these apply the specified tags to EACH task inside the play, included

View File

@ -55,7 +55,7 @@ As of version 2.3, Ansible can now use a vaulted variable that lives in an other
34623731376664623134383463316265643436343438623266623965636363326136
other_plain_text: othervalue
To create a vaulted variable, use the :ref:`ansible-vault encrypt_string` command. See :ref:`encrypt_string` for details.
To create a vaulted variable, use the :ref:`ansible-vault encrypt_string <ansible_vault_encrypt_string>` command. See :ref:`encrypt_string` for details.
This vaulted variable will be decrypted with the supplied vault secret and used as a normal variable. The ``ansible-vault`` command line supports stdin and stdout for encrypting data on the fly, which can be used from your favorite editor to create these vaulted variables; you just have to be sure to add the ``!vault`` tag so both Ansible and YAML are aware of the need to decrypt. The ``|`` is also required, as vault encryption results in a multi-line string.

View File

@ -109,7 +109,7 @@ While all items listed here will show a deprecation warning message, they still
* Bare variables in ``with_`` loops should instead use the ``"{ {var }}"`` syntax, which helps eliminate ambiguity.
* The ansible-galaxy text format requirements file. Users should use the YAML format for requirements instead.
* Undefined variables within a ``with_`` loop’s list currently do not interrupt the loop, but they do issue a warning; in the future, they will issue an error.
* Undefined variables within a ``with_`` loop's list currently do not interrupt the loop, but they do issue a warning; in the future, they will issue an error.
* Using dictionary variables to set all task parameters is unsafe and will be removed in a future version. For example::
- hosts: localhost
@ -129,8 +129,8 @@ While all items listed here will show a deprecation warning message, they still
* Host patterns should use a comma (,) or colon (:) instead of a semicolon (;) to separate hosts/groups in the pattern.
* Ranges specified in host patterns should use the [x:y] syntax, instead of [x-y].
* Playbooks using privilege escalation should always use “become*” options rather than the old su*/sudo* options.
* The “short form” for vars_prompt is no longer supported.
* Playbooks using privilege escalation should always use "become*" options rather than the old su*/sudo* options.
* The "short form" for vars_prompt is no longer supported.
For example::
vars_prompt:
@ -138,28 +138,28 @@ While all items listed here will show a deprecation warning message, they still
* Specifying variables at the top level of a task include statement is no longer supported. For example::
- include: foo.yml
- include_tasks: foo.yml
a: 1
Should now be::
- include: foo.yml
- include_tasks: foo.yml
vars:
a: 1
* Setting any_errors_fatal on a task is no longer supported. This should be set at the play level only.
* Bare variables in the `environment` dictionary (for plays/tasks/etc.) are no longer supported. Variables specified there should use the full variable syntax: ‘{{foo}}’.
* Bare variables in the `environment` dictionary (for plays/tasks/etc.) are no longer supported. Variables specified there should use the full variable syntax: '{{foo}}'.
* Tags (or any directive) should no longer be specified with other parameters in a task include. Instead, they should be specified as an option on the task.
For example::
- include: foo.yml tags=a,b,c
- include_tasks: foo.yml tags=a,b,c
Should be::
- include: foo.yml
- include_tasks: foo.yml
tags: [a, b, c]
* The first_available_file option on tasks has been deprecated. Users should use the with_first_found option or lookup (‘first_found’, …) plugin.
* The first_available_file option on tasks has been deprecated. Users should use the with_first_found option or lookup ('first_found', …) plugin.
Other caveats

View File

@ -219,28 +219,6 @@ to connect to network devices, network modules now support the use of
``ProxyCommand``.
To use ``ProxyCommand`` configure the proxy settings in the Ansible inventory
file to specify the proxy host.
.. code-block:: ini
[nxos]
nxos01
nxos02
[nxos:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q bastion01"'
With the configuration above, simply build and run the playbook as normal with
no additional changes necessary. The network module will now connect to the
network device by first connecting to the host specified in
``ansible_ssh_common_args`` which is ``bastion01`` in the above example.
.. notes: Using ``ProxyCommand`` with passwords via variables
It is a feature that SSH doesn't support providing passwords via environment variables.
This is done to prevent secrets from leaking out, for example in ``ps`` output.
We recommend using SSH Keys, and if needed and ssh-agent, rather than passwords, where ever possible.
file to specify the proxy host via ``ansible_ssh_common_args``.
For details on how to do this see the :ref:`network proxy guide <network_delegate_to_vs_ProxyCommand>`.

View File

@ -0,0 +1,163 @@
.. _porting_2.4_guide:
*************************
Ansible 2.4 Porting Guide
*************************
This section discusses the behavioral changes between Ansible 2.3 and Ansible 2.4.
It is intended to assist in updating your playbooks, plugins and other parts of your Ansible infrastructure so they will work with this version of Ansible.
We suggest you read this page along with `Ansible Changelog <https://github.com/ansible/ansible/blob/stable-2.4/CHANGELOG.md#2.4>`_ to understand what updates you may need to make.
This document is part of a collection on porting. The complete list of porting guides can be found at :ref:`porting guides <porting_guides>`.
.. contents:: Topics
Python version
==============
Ansible will not support Python 2.4 or 2.5 on the target hosts anymore. Going forward, Python 2.6+ will be required on targets, as already is the case on the controller.
Inventory
=========
Inventory has been refactored to be implemented via plugins and now allows for multiple sources. This change is mostly transparent to users.
One exception is the ``inventory_dir``, which is now a host variable; previously it could only have one value so it was set globally.
This means you can no longer use it early in plays to determine ``hosts:`` or similar keywords.
This also changes the behaviour of ``add_hosts`` and the implicit localhost;
because they no longer automatically inherit the global value, they default to ``None``. See the module documentation for more information.
The ``inventory_file`` remains unchanged, as it was always host specific.
A bug was fixed with the inventory path/directory, which was defaulting to the current working directory. This caused ``group_vars`` and ``host_vars`` to be picked up from the current working directory instead of just adjacent to the playbook or inventory directory when a host list (comma separated host names) was provided as inventory.
Deprecated
==========
Specifying Inventory sources
-----------------------------
Use of ``--inventory-file`` on the command line is now deprecated. Use ``--inventory`` or ``-i``.
The associated ini configuration key, ``hostfile``, and environment variable, :envvar:`ANSIBLE_HOSTS`,
are also deprecated. Replace them with the configuration key ``inventory`` and environment variable :envvar:`ANSIBLE_INVENTORY`.
Use of multiple tags
--------------------
Specifying ``--tags`` (or ``--skip-tags``) multiple times on the command line currently leads to the last one overriding all the previous ones. This behavior is deprecated. In the future, if you specify --tags multiple times the tags will be merged together. From now on, using ``--tags`` multiple times on one command line will emit a deprecation warning. Setting the ``merge_multiple_cli_tags`` option to True in the ``ansible.cfg`` file will enable the new behavior.
In 2.4, the default has change to merge the tags. You can enable the old overwriting behavior via the config option.
In 2.5, multiple ``--tags`` options will be merged with no way to go back to the old behavior.
Other caveats
-------------
No major changes in this version.
Modules
=======
Major changes in popular modules are detailed here
* The :ref:`win_shell <win_shell>` and :ref:`win_command <win_command>` modules now properly preserve quoted arguments in the command-line. Tasks that attempted to work around the issue by adding extra quotes/escaping may need to be reworked to remove the superfluous escaping. See `Issue 23019 <https://github.com/ansible/ansible/issues/23019>`_ for additional detail.
Modules removed
---------------
The following modules no longer exist:
* None
Deprecation notices
-------------------
The following modules will be removed in Ansible 2.8. Please update update your playbooks accordingly.
* :ref:`azure <azure>`, use :ref:`azure_rm_virtualmachine <azure_rm_virtualmachine>`, which uses the new Resource Manager SDK.
* :ref:`win_msi <win_msi>`, use :ref:`win_package <win_package>` instead
Noteworthy module changes
-------------------------
* The :ref:`win_get_url <win_get_url>` module has the dictionary ``win_get_url`` in its results deprecated, its content is now also available directly in the resulting output, like other modules. This dictionary will be removed in Ansible 2.8.
* The :ref:`win_unzip <win_unzip>` module no longer includes the dictionary ``win_unzip`` in its results; the contents are now included directly in the resulting output, like other modules.
* The :ref:`win_package <win_package>` module return values ``exit_code`` and ``restart_required`` have been deprecated in favour of ``rc`` and ``reboot_required`` respectively. The deprecated return values will be removed in Ansible 2.6.
Plugins
=======
A new way to configure and document plugins has been introduced. This does not require changes to existing setups but developers should start adapting to the new infrastructure now. More details will be available in the developer documentation for each plugin type.
Vars plugin changes
-------------------
There have been many changes to the implementation of vars plugins, but both users and developers should not need to change anything to keep current setups working. Developers should consider changing their plugins take advantage of new features.
The most notable difference to users is that vars plugins now get invoked on demand instead of at inventory build time. This should make them more efficient for large inventories, especially when using a subset of the hosts.
.. note::
- This also creates a difference with group/host_vars when using them adjacent to playbooks. Before, the 'first' playbook loaded determined the variables; now the 'current' playbook does. We are looking to fix this soon, since 'all playbooks' in the path should be considered for variable loading.
- In 2.4.1 we added a toggle to allow you to control this behaviour, 'top' will be the pre 2.4, 'bottom' will use the current playbook hosting the task and 'all' will use them all from top to bottom.
Inventory plugins
-----------------
Developers should start migrating from hardcoded inventory with dynamic inventory scripts to the new Inventory Plugins. The scripts will still work via the ``script`` inventory plugin but Ansible development efforts will now concentrate on writing plugins rather than enhancing existing scripts.
Both users and developers should look into the new plugins because they are intended to alleviate the need for many of the hacks and workarounds found in the dynamic inventory scripts.
Callback plugins
----------------
Users:
* Callbacks are now using the new configuration system. Users should not need to change anything as the old system still works,
but you might see a deprecation notice if any callbacks used are not inheriting from the built in classes. Developers need to update them as stated below.
Developers:
* If your callback does not inherit from ``CallbackBase`` (directly or indirectly via another callback), it will still work, but issue a deprecation notice.
To avoid this and ensure it works in the future change it to inherit from ``callbackBase`` so it has the new options handling methods and properties.
You can also implement the new options handling methods and properties but that won't automatically inherit changes added in the future. You can look at ``CallbackBase`` itself and/or ``AnsiblePlugin`` for details.
* Any callbacks inheriting from other callbacks might need to also be updated to contain the same documented options
as the parent or the options won't be available. This is noted in the developer guide.
Networking
==========
There have been a number of changes to how Networking Modules operate.
Playbooks should still use ``connection: local``.
Persistent Connection
---------------------
The configuration variables ``connection_retries`` and ``connect_interval`` which were added in Ansible 2.3 are now deprecated. For Ansible 2.4 and later use ``connection_retry_timeout``.
To control timeouts use ``command_timeout`` rather than the previous top level ``timeout`` variable under ``[default]``
See :ref:`Ansible Network debug guide <network_debug_troubleshooting>` for more information.
Configuration
=============
The configuration system has had some major changes. Users should be unaffected except for the following:
* All relative paths defined are relative to the `ansible.cfg` file itself. Previously they varied by setting. The new behavior should be more predictable.
* A new macro ``{{CWD}}`` is available for paths, which will make paths relative to the 'current working directory',
this is unsafe but some users really want to rely on this behaviour.
Developers that were working directly with the previous API should revisit their usage as some methods (for example, ``get_config``) were kept for backwards compatibility but will warn users that the function has been deprecated.
The new configuration has been designed to minimize the need for code changes in core for new plugins. The plugins just need to document their settings and the configuration system will use the documentation to provide what they need. This is still a work in progress; currently only 'callback' and 'connection' plugins support this. More details will be added to the specific plugin developer guides.

View File

@ -33,13 +33,15 @@ Release status
``````````````
+-----------------+----------------------------+----------------------------------------+
| Ansible release | Latest version | Status |
| Ansible Release | Latest Version | Status |
+=================+============================+========================================+
| devel | `2.4`_ (unreleased, trunk) | In development |
| devel | `2.5`_ (unreleased, trunk) | In development |
+-----------------+----------------------------+----------------------------------------+
| 2.4 | `2.4.1`_ (2017-10-25) | Supported (bug **and** security fixes) |
+-----------------+----------------------------+----------------------------------------+
| 2.3 | `2.3.2`_ (2017-08-08) | Supported (bug **and** security fixes) |
+-----------------+----------------------------+----------------------------------------+
| 2.2   | `2.2.3`_ (2017-05-09) | Supported (**only** security fixes) |
| 2.2 | `2.2.3`_ (2017-05-09) | Supported (**only** security fixes) |
+-----------------+----------------------------+----------------------------------------+
| 2.1 | `2.1.6`_ (2017-06-01) | Unsupported (end of life) |
+-----------------+----------------------------+----------------------------------------+
@ -47,10 +49,11 @@ Release status
+-----------------+----------------------------+----------------------------------------+
| 1.9 | `1.9.6`_ (2016-04-15) | Unsupported (end of life) |
+-----------------+----------------------------+----------------------------------------+
| <1.9 | n/a | Unsupported (end of life) |
| <1.9 | n/a | Unsupported (end of life) |
+-----------------+----------------------------+----------------------------------------+
.. _2.4: https://github.com/ansible/ansible/blob/devel/CHANGELOG.md
.. _2.5: https://github.com/ansible/ansible/blob/devel/CHANGELOG.md
.. _2.4.1: https://github.com/ansible/ansible/blob/stable-2.4/CHANGELOG.md
.. _2.3.2: https://github.com/ansible/ansible/blob/stable-2.3/CHANGELOG.md
.. _2.2.3: https://github.com/ansible/ansible/blob/stable-2.2/CHANGELOG.md
.. _2.1.6: https://github.com/ansible/ansible/blob/stable-2.1/CHANGELOG.md

View File

@ -95,11 +95,11 @@ Expand module diff support (already in progress in devel)
Other
-----
Things being kicking down the road that we said we’d do
Things being kicking down the road that we said we'd do
- NOT remerging core with ansible/ansible this release cycle
Community
---------
- Define the process/ETA for reviewing PR’s from community
- Define the process/ETA for reviewing PR's from community
- Publish better docs and how-tos for submitting code/features/fixes

View File

@ -19,7 +19,7 @@ Extras split from Core
----------------------
Lead by Jason M and Jimi-c (Targeting 2.2, could move into 2.3).
Targeted towards the 2.2 release or shortly after, we are planning on splitting Extras out of the “Ansible Core” project.  That means that modules that are shipped with Ansible by default are **only** the modules in ansibl-modules-core.  Ansible extras will become a separate project, managed by the community standard.  Over the next few months we’re going to have a lot of work to do on getting all of the modules in the right places for this to work.
Targeted towards the 2.2 release or shortly after, we are planning on splitting Extras out of the "Ansible Core" project.  That means that modules that are shipped with Ansible by default are **only** the modules in ansibl-modules-core.  Ansible extras will become a separate project, managed by the community standard.  Over the next few months we're going to have a lot of work to do on getting all of the modules in the right places for this to work.
- Create proposal (Jason or Jimi)
- Review modules for correct location (extras v core)
@ -40,7 +40,7 @@ AWS
---
Lead by Ryan Brown
- Pagination for all AWS modules (generic pagination exists, but isn’t used everywhere) (bumped to 2.3)
- Pagination for all AWS modules (generic pagination exists, but isn't used everywhere) (bumped to 2.3)
- Refactoring ec2.py to be more digestible (bumped to 2.3)
- Fix inconsistencies with different authentication methods (STS, environment creds, ~/.aws/credentials) (done)
- AWS Lambda modules (lambda_execute done, others pending)
@ -85,7 +85,7 @@ Lead by Matt D
- Feature parity
- PS module API (mirror Python module API where appropriate). Note: We don’t necessarily like the current python module API (AnsibleModule is a huge class with many unrelated utility functions.  Maybe we should redesign both at the same time?) (bumped to 2.3+ due to "moving target" uncertainty)
- PS module API (mirror Python module API where appropriate). Note: We don't necessarily like the current python module API (AnsibleModule is a huge class with many unrelated utility functions.  Maybe we should redesign both at the same time?) (bumped to 2.3+ due to "moving target" uncertainty)
- Environment keyword support (done)
- win_shell/win_command (done)
- Async support (done)
@ -117,7 +117,7 @@ Lead by Nate C, Peter S
Role revamp
-----------
- Implement ‘role revamp’ proposal to give users more control on role/task execution (Brian)
- Implement 'role revamp' proposal to give users more control on role/task execution (Brian)
- **https://github.com/ansible/proposals/blob/master/roles_revamp.md**
@ -125,13 +125,13 @@ Vault
-----
Lead by Jtanner, Adrian
- *Extend ‘transparent vault file usage’ to other action plugins other than 'copy'(https://github.com/ansible/ansible/issues/7298)*
- *Extend 'transparent vault file usage' to other action plugins other than 'copy'(https://github.com/ansible/ansible/issues/7298)*
**done:** https://github.com/ansible/ansible/pull/16957
- Add ‘per variable’ vault support (!vault YAML directive, existing PR already) https://github.com/ansible/ansible/issues/13287 https://github.com/ansible/ansible/issues/14721
- Add 'per variable' vault support (!vault YAML directive, existing PR already) https://github.com/ansible/ansible/issues/13287 https://github.com/ansible/ansible/issues/14721
- Add vault/unvault filters https://github.com/ansible/ansible/issues/12087 (deferred to 2.3)
- Add vault support to lookups (likely deferred to 2.3 or until lookup plugins are revamped)
- Allow for multiple vault secrets https://github.com/ansible/ansible/issues/13243
- Config option to turn ‘unvaulting’ failures into warnings https://github.com/ansible/ansible/issues/13244
- Config option to turn 'unvaulting' failures into warnings https://github.com/ansible/ansible/issues/13244
Python3
-------
@ -139,7 +139,7 @@ Lead by Toshio
A note here from Jason M: Getting to complete, tested Python 3 is both
a critical task and one that has so much work and so many moving parts
that we don’t expect this to be complete by the 2.2 release.  Toshio will
that we don't expect this to be complete by the 2.2 release.  Toshio will
lead this overall effort.
- Motivation:
@ -173,7 +173,7 @@ lead this overall effort.
- Update: copy of the six library (v1.4.1 for python2.4 compat) and unicode helpers are here (ansible.module_utils._text.{to_bytes,to_text,to_native})
- A few basic modules ported to python3
- Stat module best example module since it’s essential.
- Stat module best example module since it's essential.
- Update:
- A handful of modules like stat have been line-by-line ported. They should work reliably with few python3-specific bugs. All but three integration tests pass which means that most essential modules are working to some extent on Python3.
@ -186,7 +186,7 @@ lead this overall effort.
- lib/ansible/* and all modules now compile under Python-3.5
- Side work to do:
- Figure out best ways to run unit-tests on modules.  Start unit-testing modules.  This is going to become important so we don’t regress python3 or python2.4 support in modules  (Going to largely punt on this for 2.2.  Matt Clay is working on building us a testing foundation for the first half of 2.2 development so we’ll re-evaluate towards the middle of the dev cycle).
- Figure out best ways to run unit-tests on modules.  Start unit-testing modules.  This is going to become important so we don't regress python3 or python2.4 support in modules  (Going to largely punt on this for 2.2.  Matt Clay is working on building us a testing foundation for the first half of 2.2 development so we'll re-evaluate towards the middle of the dev cycle).
- More unit tests of module_utils
- More integration tests. Currently integration tests are the best way to test ansible modules so we have to rely on those.
@ -202,7 +202,7 @@ Infrastructure Buildout and Changes
-----------------------------------
Lead by Matt Clay
Another note from Jason M: A lot of this work is to ease the burden of CI, CI performance, increase our testing coverage and all of that sort of thing.  It’s not necessarily feature work, but it’s \*\*critical\*\* to growing our product and our ability to get community changes in more securely and quickly.
Another note from Jason M: A lot of this work is to ease the burden of CI, CI performance, increase our testing coverage and all of that sort of thing.  It's not necessarily feature work, but it's \*\*critical\*\* to growing our product and our ability to get community changes in more securely and quickly.
- **CI Performance**
Reduce time spent waiting on CI for PRs. Combination of optimizing existing Travis setup and offloading work to other services. Will be impacted by available budget.

View File

@ -46,7 +46,7 @@ Lead by nitzmahone
- Become support **(done/experimental)**
- Integrated kerberos ticket management (via ansible_user/ansible_password) **(done)**
- Switch PS input encoding to BOM-less UTF8 **(done)**
- Server 2016 support/testing (now RTM’d) **(partial)**
- Server 2016 support/testing (now RTM'd) **(partial)**
- Modularize Windows module_utils (allow N files) **(partial)**
- Declarative argspec for PS / .NET **(bumped to 2.4)**
- Kerberos encryption (via notting, pywinrm/requests_kerberos/pykerberos) **(in progress, available in pywinrm post 2.3 release)**
@ -98,8 +98,8 @@ Python3
- If users report bugs on python3, these should be fixed and will prioritize our work on porting other modules.
- Still have to solve the python3-only and python2-only modules. Thinking of doing this via metadata. Will mean we have to use metadata at the module_common level. Will also mean we don’t support py2-only or py3-only old style python modules.
- Note: Most of the currently tested ansible features now run. But there’s still a lot of code that’s untested.
- Still have to solve the python3-only and python2-only modules. Thinking of doing this via metadata. Will mean we have to use metadata at the module_common level. Will also mean we don't support py2-only or py3-only old style python modules.
- Note: Most of the currently tested ansible features now run. But there's still a lot of code that's untested.
Testing and CI
--------------
@ -157,7 +157,7 @@ Plugin Loader
ansible-ssh
-----------
- Add a ‘ansible-ssh’ convenience and debugging tool (will slip to 2.4)
- Add a 'ansible-ssh' convenience and debugging tool (will slip to 2.4)
- Tool to invoke an interactive ssh to a host with the same args/env/config that ansible would.
- There are at least three external versions

View File

@ -56,7 +56,7 @@ Inventory
Facts
-----
- Configurable list of ‘fact modules’ for ``gather_facts`` **(done)**
- Configurable list of 'fact modules' for ``gather_facts`` **(done)**
- Fact gathering policy finer grained **(done)**
- Make ``setup.py``/``facts`` more pluggable **(done)**
- Improve testing of ``setup.py``/``facts.py`` **(done)**
@ -104,8 +104,8 @@ Globalize Callbacks
-------------------
**(pushed out to future release)**
- Make send_callback available to other code that cannot use it.
- Would allow for ‘full formatting’ of output (see JSON callback)
- Fixes static ‘include’ display problem
- Would allow for 'full formatting' of output (see JSON callback)
- Fixes static 'include' display problem
Plugins
-------
@ -128,13 +128,13 @@ Runtime Check on Modules for Blacklisting
Disambiguate Includes
---------------------
- Create import_x for ‘static includes’ (import_task, import_play, import_role)
- Create import_x for 'static includes' (import_task, import_playbook, import_role)
- Any directives are applied to the ‘imported’ tasks
- Any directives are applied to the 'imported' tasks
- Create include_x for ‘dynamic includes’ (include_task, include_role)
- Create include_x for 'dynamic includes' (include_task, include_role)
- Any directives apply to the ‘include’ itself
- Any directives apply to the 'include' itself
Windows
-------

View File

@ -5,7 +5,7 @@ Ansible Vault
New in Ansible 1.5, "Vault" is a feature of ansible that allows keeping sensitive data such as passwords or keys in encrypted files, rather than as plaintext in your playbooks or roles. These vault files can then be distributed or placed in source control.
To enable this feature, a command line tool, :ref:`ansible-vault` is used to edit files, and a command line flag `--ask-vault-pass` or `--vault-password-file` is used. Alternately, you may specify the location of a password file or command Ansible to always prompt for the password in your ansible.cfg file. These options require no command line flag usage.
To enable this feature, a command line tool - :ref:`ansible-vault` - is used to edit files, and a command line flag (:option:`--ask-vault-pass <ansible-playbook --ask-vault-pass>` or :option:`--vault-password-file <ansible-playbook --vault-password-file>`) is used. Alternately, you may specify the location of a password file or command Ansible to always prompt for the password in your ansible.cfg file. These options require no command line flag usage.
For best practices advice, refer to :ref:`best_practices_for_variables_and_vaults`.
@ -19,7 +19,7 @@ The vault feature can encrypt any structured data file used by Ansible. This ca
Ansible tasks, handlers, and so on are also data so these can be encrypted with vault as well. To hide the names of variables that you're using, you can encrypt the task files in their entirety. However, that might be a little too much and could annoy your coworkers :)
The vault feature can also encrypt arbitrary files, even binary files. If a vault-encrypted file is
given as the :ref:`src <src>` argument to the :ref:`copy <copy>`, :ref:`template <template>`,
given as the 'src' argument to the :ref:`copy <copy>`, :ref:`template <template>`,
:ref:`unarchive <unarchive>`, :ref:`script <script>` or :ref:`assemble <assemble>` modules, the file will be placed at the destination on the target host decrypted (assuming a valid vault password is supplied when running the play).
As of version 2.3, Ansible also supports encrypting single values inside a YAML file, using the `!vault` tag to let YAML and Ansible know it uses special processing. This feature is covered in more details below.
@ -48,7 +48,7 @@ The default cipher is AES (which is shared-secret based).
Editing Encrypted Files
```````````````````````
To edit an encrypted file in place, use the :ref:`ansible-vault edit` command.
To edit an encrypted file in place, use the :ref:`ansible-vault edit <ansible_vault_edit>` command.
This command will decrypt the file to a temporary file and allow you to edit
the file, saving it back when done and removing the temporary file:
@ -78,7 +78,7 @@ Encrypting Unencrypted Files
````````````````````````````
If you have existing files that you wish to encrypt, use
the :ref:`ansible-vault encrypt` command. This command can operate on multiple files at once:
the :ref:`ansible-vault encrypt <ansible_vault_encrypt>` command. This command can operate on multiple files at once:
.. code-block:: bash
@ -91,8 +91,8 @@ Decrypting Encrypted Files
``````````````````````````
If you have existing files that you no longer want to keep encrypted, you can permanently decrypt
them by running the :ref:`ansible-vault decrypt` command. This command will save them unencrypted
to the disk, so be sure you do not want :ref:`ansible-vault edit` instead:
them by running the :ref:`ansible-vault decrypt <ansible_vault_decrypt>` command. This command will save them unencrypted
to the disk, so be sure you do not want :ref:`ansible-vault edit <ansible_vault_edit>` instead:
.. code-block:: bash
@ -106,7 +106,7 @@ Viewing Encrypted Files
*Available since Ansible 1.8*
If you want to view the contents of an encrypted file without editing it, you can use the :ref:`ansible-vault view` command:
If you want to view the contents of an encrypted file without editing it, you can use the :ref:`ansible-vault view <ansible_vault_view>` command:
.. code-block:: bash
@ -118,10 +118,11 @@ If you want to view the contents of an encrypted file without editing it, you ca
Use encrypt_string to create encrypted variables to embed in yaml
`````````````````````````````````````````````````````````````````
The :ref:`ansible-vault encrypt_string` command will encrypt and format a provided string into a format
The :ref:`ansible-vault encrypt_string <ansible_vault_encrypt_string>` command will encrypt and format a provided string into a format
that can be included in :ref:`ansible-playbook` YAML files.
To encrypt a string provided as a cli arg:
.. code-block:: bash
ansible-vault encrypt_string --vault-id a_password_file 'foobar' --name 'the_secret'
@ -224,7 +225,7 @@ Providing Vault Passwords
`````````````````````````
Since Ansible 2.4, the recommended way to provide a vault password from the cli is
to use the :option:`--vault-id` cli option.
to use the :option:`--vault-id <ansible-playbook --vault-id>` cli option.
For example, to use a password store in the text file :file:`/path/to/my/vault-password-file`:
@ -244,7 +245,7 @@ To get the password from a vault password executable script :file:`my-vault-pass
ansible-playbook --vault-id my-vault-password.py
The value for :option:`--vault-id` can specify the type of vault id (prompt, a file path, etc)
The value for :option:`--vault-id <ansible-playbook --vault-id>` can specify the type of vault id (prompt, a file path, etc)
and a label for the vault id ('dev', 'prod', 'cloud', etc)
For example, to use a password file :file:`dev-password` for the vault-id 'dev':
@ -261,33 +262,26 @@ To prompt for the 'dev' vault id:
*Prior to Ansible 2.4*
To be prompted for a vault password, use the :option:`--ask-vault-pass` cli option:
To be prompted for a vault password, use the :option:`--ask-vault-pass <ansible-playbook --vault-id>` cli option:
.. code-block:: bash
ansible-playbook --ask-vault-pass site.yml
To specify a vault password in a text file 'dev-password', use the :option:`--vault-password-file` option:
To specify a vault password in a text file 'dev-password', use the :option:`--vault-password-file <ansible-playbook --vault-password-file>` option:
.. code-block:: bash
ansible-playbook --vault-password-file dev-password site.yml
There is a config option (:ref:`DEFAULT_VAULT_PASSWORD_FILE`) to specify a vault password file to use
without requiring the :option:`--vault-password-file` cli option.
without requiring the :option:`--vault-password-file <ansible-playbook --vault-password-file>` cli option.
via config
:ref:`ANSIBLE_VAULT_PASSWORD_FILE`
:ref:`ANSIBLE_VAULT_IDENTITY_LIST`
via env
TODO
Multiple vault passwords
^^^^^^^^^^^^^^^^^^^^^^^^
Since Ansible 2.4 and later support using multiple vault passwords, :option:`--vault-id` can
Since Ansible 2.4 and later support using multiple vault passwords, :option:`--vault-id <ansible-playbook --vault-id>` can
be provided multiple times.
If multiple vault passwords are provided, by default Ansible will attempt to decrypt vault content
@ -302,7 +296,7 @@ For example, to use a 'dev' password read from a file and to be prompted for the
In the above case, the 'dev' password will be tried first, then the 'prod' password for cases
where Ansible doesn't know which vault id is used to encrypt something.
If the vault content was encrypted using a :option:`--vault-id` option, then the label of the
If the vault content was encrypted using a :option:`--vault-id <ansible-vault --vault-id>` option, then the label of the
vault id is stored with the vault content. When Ansible knows the right vault-id, it will try
the matching vault id's secret first before trying the rest of the vault-ids.
@ -317,17 +311,17 @@ use. For example, instead of requiring the cli option on every use, the (:ref:`D
ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml
The :option:`--vault-id` can be used in lieu of the :option:`--vault-password-file` or :option:`--ask-vault-pass` options,
The :option:`--vault-id <ansible-playbook --vault-id>` can be used in lieu of the :option:`--vault-password-file <ansible-playbook --vault-password-file>` or :option:`--ask-vault-pass <ansible-playbook --ask-vault-pass>` options,
or it can be used in combination with them.
When using :ref:`ansible-vault` command that encrypt content (:ref:`ansible-vault encrypt`, :ref:`ansible-vault encrypt_string`, etc)
When using :ref:`ansible-vault` commands that encrypt content (:ref:`ansible-vault encrypt <ansible_vault_encrypt>`, :ref:`ansible-vault encrypt_string <ansible_vault_encrypt_string>`, etc)
only one vault-id can be used.
.. note::
Prior to Ansible 2.4, only one vault password could be used in each Ansible run. The
:option:`--vault-id` option is not support prior to Ansible 2.4.
:option:`--vault-id <ansible-playbook --vault-id>` option is not support prior to Ansible 2.4.
.. _speeding_up_vault:

View File

@ -1,3 +1,3 @@
.. note::
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``. If you are using a version of Ansible prior to 2.0, you should continue using the older style variables (``ansible_ssh_*``). These shorter variables are ignored, without warning, in older versions of Ansible.
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``. If you are using a version of Ansible prior to 2.0, you should continue using the older style variables (``ansible_ssh_*``). These shorter variables are ignored, without warning, in older versions of Ansible.

139
docs/templates/cli_rst.j2 vendored Normal file
View File

@ -0,0 +1,139 @@
{% set name = cli_name -%}
{% set name_slug = cli_name -%}
.. _{{name}}:
{% set name_len = name|length + 0-%}
{{ '=' * name_len }}
{{name}}
{{ '=' * name_len }}
:strong:`{{short_desc|default('')}}`
.. contents::
:local:
:depth: 2
.. program:: {{cli_name}}
Synopsis
========
.. code-block:: bash
{{ usage|replace('%prog', cli_name) }}
Description
===========
{{ long_desc|default('', True) }}
{% if options %}
Common Options
==============
{% for option in options|sort(attribute='options') %}
.. option:: {% for switch in option['options'] %}{{switch}}{% if option['arg'] %} <{{option['arg']}}>{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}
{{ option['desc'] }}
{% endfor %}
{% endif %}
{% if arguments %}
ARGUMENTS
=========
.. program:: {{cli_name}}
{% for arg in arguments %}
.. option:: {{ arg }}
{{ (arguments[arg]|default(' '))}}
{% endfor %}
{% endif %}
{% if actions %}
Actions
=======
{% for action in actions %}
.. program:: {{cli_name}} {{action}}
.. _{{cli_name|replace('-','_')}}_{{action}}:
{{ action}}
{{ '-' * action|length}}
{{ (actions[action]['desc']|default(' '))}}
{% if actions[action]['options'] %}
{% for option in actions[action]['options']|sort %}
.. option:: {% for switch in option['options'] if switch in actions[action]['option_names'] %}{{switch}} {% if option['arg'] %} <{{option['arg']}}>{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}
{{ (option['desc']) }}
{% endfor %}
{% endif %}
{% endfor %}
.. program:: {{cli_name}}
{% endif %}
Environment
===========
The following environment variables may be specified.
{% if inventory %}
:envvar:`ANSIBLE_INVENTORY` -- Override the default ansible inventory file
{% endif %}
{% if library %}
:envvar:`ANSIBLE_LIBRARY` -- Override the default ansible module library path
{% endif %}
:envvar:`ANSIBLE_CONFIG` -- Override the default ansible config file
Many more are available for most options in ansible.cfg
Files
=====
{% if inventory %}
:file:`/etc/ansible/hosts` -- Default inventory file
{% endif %}
:file:`/etc/ansible/ansible.cfg` -- Config file, used if present
:file:`~/.ansible.cfg` -- User config file, overrides the default config if present
Author
======
Ansible was originally written by Michael DeHaan.
See the `AUTHORS` file for a complete list of contributors.
Copyright
=========
Copyright © 2017 Red Hat, Inc | Ansible.
Ansible is released under the terms of the GPLv3 License.
See also
========
{% for other in cli_bin_name_list|sort %}:manpage:`{{other}}(1)`, {% endfor %}

30
docs/templates/man.j2 vendored
View File

@ -20,8 +20,17 @@ SYNOPSIS
DESCRIPTION
-----------
*{{name}}* {{ long_desc|default('', True)|wordwrap }}
{{ long_desc|default('', True)|wordwrap }}
{% if options %}
COMMON OPTIONS
--------------
{% for option in options|sort(attribute='options') %}
{% for switch in option['options'] %}*{{switch}}*{% if option['arg'] %} '{{option['arg']}}'{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}::
{{ option['desc'] }}
{% endfor %}
{% endif %}
{% if arguments %}
ARGUMENTS
@ -38,22 +47,19 @@ ARGUMENTS
{% if actions %}
ACTIONS
-------
{% for action in actions %}
{{ action }}
*{{ action }}*::: {{ (actions[action]['desc']|default(' '))|wordwrap}}
{{ (actions[action]|default(' '))|wordwrap}}
{% if actions[action]['options'] %}
{% for option in actions[action]['options']|sort %}
{% for switch in option['options'] if switch in actions[action]['option_names'] %}*{{switch}}*{% if option['arg'] %} '{{option['arg']}}'{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}::
{{ (option['desc']) }}
{% endfor %}
{% endif %}
OPTIONS
-------
{% for option in options|sort(attribute='options') %}
{% for switch in option['options'] %}*{{switch}}* {% if option['arg'] %}'{{option['arg']}}'{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}::
{{ option['desc'] }}
{% endfor %}
{% endif %}
{% if inventory %}
INVENTORY
@ -111,7 +117,7 @@ Ansible is released under the terms of the GPLv3 License.
SEE ALSO
--------
{% for other in cli_list|sort %}{% if other != cli %}*ansible{% if other != 'adhoc' %}-{{other}}{% endif %}*(1){% if not loop.last %}, {% endif %}{% endif %}{% endfor %}
{% for other in cli_list|sort %}{% if other != cli %}*ansible{% if other != 'adhoc' %}-{{other}}{% endif %}*(1){% if not loop.last %}, {% endif %}{% endif %}{% endfor %}
Extensive documentation is available in the documentation site:
<http://docs.ansible.com>.

View File

@ -15,8 +15,12 @@ Be aware that this reflects the 'current development branch' and that the keywor
{{ name }}
{{ '-' * name|length }}
.. glossary::
{% for attribute in oblist[name]|sort %}
- **{{ attribute }}:** {{ oblist[name][attribute] }}
{{ attribute }}
{{ oblist[name][attribute] }}
{% endfor %}
{% endfor %}

View File

@ -297,10 +297,6 @@
# only update this setting if you know how this works, otherwise it can break module execution
#network_group_modules=['eos', 'nxos', 'ios', 'iosxr', 'junos', 'vyos']
# This keeps facts from polluting the main namespace as variables.
# Setting to True keeps them under the ansible_facts namespace, the default is False
#restrict_facts_namespace: True
# When enabled, this option allows lookups (via variables like {{lookup('foo')}} or when used as
# a loop with `with_foo`) to return data that is not marked "unsafe". This means the data may contain
# jinja2 templating language which will be run through the templating engine.
@ -315,7 +311,7 @@
#enable_plugins = host_list, virtualbox, yaml, constructed
# ignore these extensions when parsing a directory as inventory source
#ignore_extensions = '.pyc', '.pyo', '.swp', '.bak', '~', '.rpm', '.md', '.txt', '~', '.orig', '.ini', '.cfg', '.retry'
#ignore_extensions = .pyc, .pyo, .swp, .bak, ~, .rpm, .md, .txt, ~, .orig, .ini, .cfg, .retry
# ignore files matching these patterns when parsing a directory as inventory source
#ignore_patterns=

View File

@ -3,7 +3,7 @@
from collections import namedtuple
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.inventory import Inventory
from ansible.inventory.manager import InventoryManager
from ansible.parsing.dataloader import DataLoader
from ansible.playbook.play import Play
from ansible.plugins.callback import CallbackBase
@ -33,21 +33,21 @@ def main():
host_list = ['localhost', 'www.example.com', 'www.google.com']
Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'remote_user',
'private_key_file', 'ssh_common_args', 'ssh_extra_args', 'sftp_extra_args',
'scp_extra_args', 'become', 'become_method', 'become_user', 'verbosity', 'check'])
'scp_extra_args', 'become', 'become_method', 'become_user', 'verbosity', 'check',
'diff'])
# initialize needed objects
variable_manager = VariableManager()
loader = DataLoader()
options = Options(connection='smart', module_path='/usr/share/ansible', forks=100,
remote_user=None, private_key_file=None, ssh_common_args=None, ssh_extra_args=None,
sftp_extra_args=None, scp_extra_args=None, become=None, become_method=None,
become_user=None, verbosity=None, check=False)
become_user=None, verbosity=None, check=False, diff=False)
passwords = dict()
# create inventory and pass to var manager
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=host_list)
variable_manager.set_inventory(inventory)
inventory = InventoryManager(loader=loader, sources=','.join(host_list))
variable_manager = VariableManager(loader=loader, inventory=inventory)
# create play with tasks
play_source = dict(

View File

@ -0,0 +1,96 @@
#!/usr/bin/env python
# (c) 2017, Will Thames <will@thames.id.au>
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
# return_skeleton_generator.py takes JSON output from a module and
# and creates a starting point for the RETURNS section of a module.
# This can be provided as stdin or a file argument
#
# The easiest way to obtain the JSON output is to use hacking/test-module
#
# You will likely want to adjust this to remove sensitive data or
# ensure the `returns` value is correct, and to write a useful description
from __future__ import print_function
from collections import OrderedDict
import json
import sys
import yaml
# Allow OrderedDicts to be used when dumping YAML
# https://stackoverflow.com/a/16782282/3538079
def represent_ordereddict(dumper, data):
value = []
for item_key, item_value in data.items():
node_key = dumper.represent_data(item_key)
node_value = dumper.represent_data(item_value)
value.append((node_key, node_value))
return yaml.nodes.MappingNode(u'tag:yaml.org,2002:map', value)
def get_return_data(key, value):
# The OrderedDict here is so that, for complex objects, the
# summary data is at the top before the contains information
returns_info = {key: OrderedDict()}
returns_info[key]['description'] = "FIXME *** add description for %s" % key
returns_info[key]['returned'] = "always"
if isinstance(value, dict):
returns_info[key]['type'] = 'complex'
returns_info[key]['contains'] = get_all_items(value)
elif isinstance(value, list) and value and isinstance(value[0], dict):
returns_info[key]['type'] = 'complex'
returns_info[key]['contains'] = get_all_items(value[0])
else:
returns_info[key]['type'] = type(value).__name__
returns_info[key]['sample'] = value
# override python unicode type to set to string for docs
if returns_info[key]['type'] == 'unicode':
returns_info[key]['type'] = 'string'
return returns_info
def get_all_items(data):
items = sorted([get_return_data(key, value) for key, value in data.items()])
result = OrderedDict()
for item in items:
key, value = item.items()[0]
result[key] = value
return result
def main(args):
yaml.representer.SafeRepresenter.add_representer(OrderedDict, represent_ordereddict)
if args:
src = open(args[0])
else:
src = sys.stdin
data = json.load(src, strict=False)
docs = get_all_items(data)
if 'invocation' in docs:
del(docs['invocation'])
print(yaml.safe_dump(docs, default_flow_style=False))
if __name__ == '__main__':
main(sys.argv[1:])

View File

@ -168,6 +168,21 @@ class CLI(with_metaclass(ABCMeta, object)):
else:
display.v(u"No config file found; using defaults")
# warn about deprecated config options
for deprecated in C.config.DEPRECATED:
name = deprecated[0]
why = deprecated[1]['why']
if 'alternative' in deprecated[1]:
alt = ', use %s instead' % deprecated[1]['alternative']
else:
alt = ''
ver = deprecated[1]['version']
display.deprecated("%s option, %s %s" % (name, why, alt), version=ver)
# warn about typing issues with configuration entries
for unable in C.config.UNABLE:
display.warning("Unable to set correct type for configuration entry: %s" % unable)
@staticmethod
def split_vault_id(vault_id):
# return (before_@, after_@)
@ -181,7 +196,8 @@ class CLI(with_metaclass(ABCMeta, object)):
@staticmethod
def build_vault_ids(vault_ids, vault_password_files=None,
ask_vault_pass=None, create_new_password=None):
ask_vault_pass=None, create_new_password=None,
auto_prompt=True):
vault_password_files = vault_password_files or []
vault_ids = vault_ids or []
@ -196,7 +212,7 @@ class CLI(with_metaclass(ABCMeta, object)):
# if an action needs an encrypt password (create_new_password=True) and we dont
# have other secrets setup, then automatically add a password prompt as well.
if ask_vault_pass or (create_new_password and not vault_ids):
if ask_vault_pass or (auto_prompt and not vault_ids):
id_slug = u'%s@%s' % (C.DEFAULT_VAULT_IDENTITY, u'prompt_ask_vault_pass')
vault_ids.append(id_slug)
@ -205,7 +221,8 @@ class CLI(with_metaclass(ABCMeta, object)):
# TODO: remove the now unused args
@staticmethod
def setup_vault_secrets(loader, vault_ids, vault_password_files=None,
ask_vault_pass=None, create_new_password=False):
ask_vault_pass=None, create_new_password=False,
auto_prompt=True):
# list of tuples
vault_secrets = []
@ -235,7 +252,8 @@ class CLI(with_metaclass(ABCMeta, object)):
vault_ids = CLI.build_vault_ids(vault_ids,
vault_password_files,
ask_vault_pass,
create_new_password)
create_new_password,
auto_prompt=auto_prompt)
for vault_id_slug in vault_ids:
vault_id_name, vault_id_value = CLI.split_vault_id(vault_id_slug)
@ -374,17 +392,24 @@ class CLI(with_metaclass(ABCMeta, object)):
@staticmethod
def unfrack_paths(option, opt, value, parser):
paths = getattr(parser.values, option.dest)
if paths is None:
paths = []
if isinstance(value, string_types):
paths[:0] = [unfrackpath(x) for x in value.split(os.pathsep)]
paths[:0] = [unfrackpath(x) for x in value.split(os.pathsep) if x]
elif isinstance(value, list):
paths[:0] = [unfrackpath(x) for x in value]
paths[:0] = [unfrackpath(x) for x in value if x]
else:
pass # FIXME: should we raise options error?
setattr(parser.values, option.dest, paths)
@staticmethod
def unfrack_path(option, opt, value, parser):
setattr(parser.values, option.dest, unfrackpath(value))
if value != '-':
setattr(parser.values, option.dest, unfrackpath(value))
else:
setattr(parser.values, option.dest, value)
@staticmethod
def base_parser(usage="", output_opts=False, runas_opts=False, meta_opts=False, runtask_opts=False, vault_opts=False, module_opts=False,
@ -408,8 +433,8 @@ class CLI(with_metaclass(ABCMeta, object)):
if module_opts:
parser.add_option('-M', '--module-path', dest='module_path', default=None,
help="prepend path(s) to module library (default=%s)" % C.DEFAULT_MODULE_PATH,
action="callback", callback=CLI.unfrack_path, type='str')
help="prepend colon-separated path(s) to module library (default=%s)" % C.DEFAULT_MODULE_PATH,
action="callback", callback=CLI.unfrack_paths, type='str')
if runtask_opts:
parser.add_option('-e', '--extra-vars', dest="extra_vars", action="append",
help="set additional variables as key=value or YAML/JSON, if filename prepend with @", default=[])
@ -425,9 +450,6 @@ class CLI(with_metaclass(ABCMeta, object)):
help="vault password file", action="callback", callback=CLI.unfrack_paths, type='string')
parser.add_option('--new-vault-password-file', default=[], dest='new_vault_password_files',
help="new vault password file for rekey", action="callback", callback=CLI.unfrack_paths, type='string')
parser.add_option('--output', default=None, dest='output_file',
help='output file name for encrypt or decrypt; use - for stdout',
action="callback", callback=CLI.unfrack_path, type='string'),
parser.add_option('--vault-id', default=[], dest='vault_ids', action='append', type='string',
help='the vault identity to use')
parser.add_option('--new-vault-id', default=None, dest='new_vault_id', type='string',
@ -593,12 +615,10 @@ class CLI(with_metaclass(ABCMeta, object)):
self.options.inventory = [self.options.inventory]
# Ensure full paths when needed
self.options.inventory = [unfrackpath(opt) if ',' not in opt else opt for opt in self.options.inventory]
self.options.inventory = [unfrackpath(opt, follow=False) if ',' not in opt else opt for opt in self.options.inventory]
else:
# set default if it exists
if os.path.exists(C.DEFAULT_HOST_LIST):
self.options.inventory = [C.DEFAULT_HOST_LIST]
self.options.inventory = C.DEFAULT_HOST_LIST
@staticmethod
def version(prog):
@ -763,7 +783,8 @@ class CLI(with_metaclass(ABCMeta, object)):
vault_secrets = CLI.setup_vault_secrets(loader,
vault_ids=vault_ids,
vault_password_files=options.vault_password_files,
ask_vault_pass=options.ask_vault_pass)
ask_vault_pass=options.ask_vault_pass,
auto_prompt=False)
loader.set_vault_secrets(vault_secrets)
# create the inventory, and filter it based on the subset specified (if any)

View File

@ -138,7 +138,7 @@ class AdHocCLI(CLI):
raise AnsibleOptionsError(err)
# Avoid modules that don't work with ad-hoc
if self.options.module_name in ('include', 'include_role'):
if self.options.module_name.startswith(('include', 'import_')):
raise AnsibleOptionsError("'%s' is not a valid action for ad-hoc commands" % self.options.module_name)
play_ds = self._play_ds(pattern, self.options.seconds, self.options.poll_interval)

View File

@ -44,7 +44,7 @@ except ImportError:
class ConfigCLI(CLI):
""" Config command line class """
VALID_ACTIONS = ("view", "edit", "update", "dump", "list")
VALID_ACTIONS = ("view", "dump", "list") # TODO: edit, update, search
def __init__(self, args, callback=None):
@ -56,9 +56,9 @@ class ConfigCLI(CLI):
self.parser = CLI.base_parser(
usage = "usage: %%prog [%s] [--help] [options] [ansible.cfg]" % "|".join(self.VALID_ACTIONS),
epilog = "\nSee '%s <command> --help' for more information on a specific command.\n\n" % os.path.basename(sys.argv[0])
epilog = "\nSee '%s <command> --help' for more information on a specific command.\n\n" % os.path.basename(sys.argv[0]),
desc="View, edit, and manage ansible configuration.",
)
self.parser.add_option('-c', '--config', dest='config_file', help="path to configuration file, defaults to first file found in precedence.")
self.set_action()
@ -69,14 +69,11 @@ class ConfigCLI(CLI):
if self.action == "dump":
self.parser.add_option('--only-changed', dest='only_changed', action='store_true',
help="Only show configurations that have changed from the default")
self.parser.set_usage("usage: %prog dump [options] [-c ansible.cfg]")
elif self.action == "view":
self.parser.set_usage("usage: %prog view [options] [-c ansible.cfg] ")
elif self.action == "edit":
self.parser.set_usage("usage: %prog edit [options] [-c ansible.cfg]")
elif self.action == "update":
self.parser.add_option('-s', '--setting', dest='setting', help="config setting, the section defaults to 'defaults'")
self.parser.set_usage("usage: %prog update [options] [-c ansible.cfg] -s '[section.]setting=value'")
elif self.action == "search":
self.parser.set_usage("usage: %prog update [options] [-c ansible.cfg] <search term>")
self.options, self.args = self.parser.parse_args()
display.verbosity = self.options.verbosity

View File

@ -126,9 +126,10 @@ class ConsoleCLI(CLI, cmd.Cmd):
def list_modules(self):
modules = set()
if self.options.module_path is not None:
for i in self.options.module_path.split(os.pathsep):
module_loader.add_directory(i)
if self.options.module_path:
for path in self.options.module_path:
if path:
module_loader.add_directory(path)
module_paths = module_loader._get_paths()
for path in module_paths:

View File

@ -28,9 +28,11 @@ import yaml
from ansible import constants as C
from ansible.cli import CLI
from ansible.errors import AnsibleError, AnsibleOptionsError
from ansible.module_utils._text import to_native
from ansible.module_utils.six import string_types
from ansible.parsing.yaml.dumper import AnsibleDumper
from ansible.plugins.loader import module_loader, action_loader, lookup_loader, callback_loader, cache_loader, connection_loader, strategy_loader, PluginLoader
from ansible.plugins.loader import module_loader, action_loader, lookup_loader, callback_loader, cache_loader, \
vars_loader, connection_loader, strategy_loader, PluginLoader
from ansible.utils import plugin_docs
try:
from __main__ import display
@ -53,7 +55,7 @@ class DocCLI(CLI):
def parse(self):
self.parser = CLI.base_parser(
usage='usage: %prog [options] [plugin]',
usage='usage: %prog [-l|-s] [options] [-t <plugin type] [plugin]',
module_opts=True,
desc="plugin documentation tool",
epilog="See man pages for Ansible CLI options or website for tutorials https://docs.ansible.com"
@ -64,13 +66,16 @@ class DocCLI(CLI):
self.parser.add_option("-s", "--snippet", action="store_true", default=False, dest='show_snippet',
help='Show playbook snippet for specified plugin(s)')
self.parser.add_option("-a", "--all", action="store_true", default=False, dest='all_plugins',
help='Show documentation for all plugins')
help='**For internal testing only** Show documentation for all plugins.')
self.parser.add_option("-t", "--type", action="store", default='module', dest='type', type='choice',
help='Choose which plugin type (defaults to "module")',
choices=['cache', 'callback', 'connection', 'inventory', 'lookup', 'module', 'strategy'])
choices=['cache', 'callback', 'connection', 'inventory', 'lookup', 'module', 'strategy', 'vars'])
super(DocCLI, self).parse()
if [self.options.all_plugins, self.options.list_dir, self.options.show_snippet].count(True) > 1:
raise AnsibleOptionsError("Only one of -l, -s or -a can be used at the same time.")
display.verbosity = self.options.verbosity
def run(self):
@ -90,15 +95,18 @@ class DocCLI(CLI):
loader = lookup_loader
elif plugin_type == 'strategy':
loader = strategy_loader
elif plugin_type == 'vars':
loader = vars_loader
elif plugin_type == 'inventory':
loader = PluginLoader('InventoryModule', 'ansible.plugins.inventory', 'inventory_plugins', 'inventory_plugins')
else:
loader = module_loader
# add to plugin path from command line
if self.options.module_path is not None:
for i in self.options.module_path.split(os.pathsep):
loader.add_directory(i)
if self.options.module_path:
for path in self.options.module_path:
if path:
loader.add_directory(path)
# save only top level paths for errors
search_paths = DocCLI.print_paths(loader)
@ -118,6 +126,7 @@ class DocCLI(CLI):
paths = loader._get_paths()
for path in paths:
self.find_plugins(path, plugin_type)
self.args = sorted(set(self.plugin_list))
if len(self.args) == 0:
raise AnsibleOptionsError("Incorrect options passed")
@ -128,7 +137,7 @@ class DocCLI(CLI):
try:
# if the plugin lives in a non-python file (eg, win_X.ps1), require the corresponding python file for docs
filename = loader.find_plugin(plugin, mod_type='.py', ignore_deprecated=True)
filename = loader.find_plugin(plugin, mod_type='.py', ignore_deprecated=True, check_aliases=True)
if filename is None:
display.warning("%s %s not found in:\n%s\n" % (plugin_type, plugin, search_paths))
continue
@ -220,35 +229,38 @@ class DocCLI(CLI):
deprecated = []
for plugin in sorted(self.plugin_list):
# if the module lives in a non-python file (eg, win_X.ps1), require the corresponding python file for docs
filename = loader.find_plugin(plugin, mod_type='.py', ignore_deprecated=True)
if filename is None:
continue
if filename.endswith(".ps1"):
continue
if os.path.isdir(filename):
continue
doc = None
try:
doc, plainexamples, returndocs, metadata = plugin_docs.get_docstring(filename)
except:
display.warning("%s has a documentation formatting error" % plugin)
# if the module lives in a non-python file (eg, win_X.ps1), require the corresponding python file for docs
filename = loader.find_plugin(plugin, mod_type='.py', ignore_deprecated=True, check_aliases=True)
if not doc:
desc = 'UNDOCUMENTED'
display.warning("%s parsing did not produce documentation." % plugin)
else:
desc = self.tty_ify(doc.get('short_description', '?')).strip()
if filename is None:
continue
if filename.endswith(".ps1"):
continue
if os.path.isdir(filename):
continue
if len(desc) > linelimit:
desc = desc[:linelimit] + '...'
doc = None
try:
doc, plainexamples, returndocs, metadata = plugin_docs.get_docstring(filename)
except:
display.warning("%s has a documentation formatting error" % plugin)
if plugin.startswith('_'): # Handle deprecated
deprecated.append("%-*s %-*.*s" % (displace, plugin[1:], linelimit, len(desc), desc))
else:
text.append("%-*s %-*.*s" % (displace, plugin, linelimit, len(desc), desc))
if not doc or not isinstance(doc, dict):
desc = 'UNDOCUMENTED'
display.warning("%s parsing did not produce documentation." % plugin)
else:
desc = self.tty_ify(doc.get('short_description', 'INVALID SHORT DESCRIPTION').strip())
if len(desc) > linelimit:
desc = desc[:linelimit] + '...'
if plugin.startswith('_'): # Handle deprecated
deprecated.append("%-*s %-*.*s" % (displace, plugin[1:], linelimit, len(desc), desc))
else:
text.append("%-*s %-*.*s" % (displace, plugin, linelimit, len(desc), desc))
except Exception as e:
raise AnsibleError("Failed reading docs at %s: %s" % (plugin, to_native(e)))
if len(deprecated) > 0:
text.append("\nDEPRECATED:")
@ -394,7 +406,7 @@ class DocCLI(CLI):
def get_man_text(self, doc):
IGNORE = frozenset(['module', 'docuri', 'version_added', 'short_description', 'now_date', 'plainexamples', 'returndocs'])
IGNORE = frozenset(['module', 'docuri', 'version_added', 'short_description', 'now_date', 'plainexamples', 'returndocs', self.options.type])
opt_indent = " "
text = []
pad = display.columns * 0.20
@ -410,7 +422,12 @@ class DocCLI(CLI):
text.append("%s\n" % textwrap.fill(CLI.tty_ify(desc), limit, initial_indent=opt_indent, subsequent_indent=opt_indent))
if 'deprecated' in doc and doc['deprecated'] is not None and len(doc['deprecated']) > 0:
text.append("DEPRECATED: \n%s\n" % doc.pop('deprecated'))
text.append("DEPRECATED: \n")
if isinstance(doc['deprecated'], dict):
text.append("\tReason: %(why)s\n\tScheduled removal: Ansible %(version)s\n\tAlternatives: %(alternative)s" % doc.pop('deprecated'))
else:
text.append("%s" % doc.pop('deprecated'))
text.append("\n")
try:
support_block = self.get_support_block(doc)

View File

@ -67,6 +67,21 @@ class PullCLI(CLI):
"look for a playbook based on the host's fully-qualified domain name,"
'on the host hostname and finally a playbook named *local.yml*.', }
def _get_inv_cli(self):
inv_opts = ''
if getattr(self.options, 'inventory'):
for inv in self.options.inventory:
if isinstance(inv, list):
inv_opts += " -i '%s' " % ','.join(inv)
elif ',' in inv or os.path.exists(inv):
inv_opts += ' -i %s ' % inv
if not inv_opts:
inv_opts = " -i localhost, "
return inv_opts
def parse(self):
''' create an options parser for bin/ansible '''
@ -158,15 +173,7 @@ class PullCLI(CLI):
# Attempt to use the inventory passed in as an argument
# It might not yet have been downloaded so use localhost as default
inv_opts = ''
if getattr(self.options, 'inventory'):
for inv in self.options.inventory:
if isinstance(inv, list):
inv_opts += " -i '%s' " % ','.join(inv)
elif ',' in inv or os.path.exists(inv):
inv_opts += ' -i %s ' % inv
else:
inv_opts = "-i 'localhost,'"
inv_opts = self._get_inv_cli()
# FIXME: enable more repo modules hg/svn?
if self.options.module_name == 'git':
@ -231,8 +238,7 @@ class PullCLI(CLI):
if self.options.vault_password_files:
for vault_password_file in self.options.vault_password_files:
cmd += " --vault-password-file=%s" % vault_password_file
if inv_opts:
cmd += ' %s' % inv_opts
for ev in self.options.extra_vars:
cmd += ' -e "%s"' % ev
if self.options.ask_sudo_pass or self.options.ask_su_pass or self.options.become_ask_pass:
@ -250,6 +256,11 @@ class PullCLI(CLI):
os.chdir(self.options.dest)
# redo inventory options as new files might exist now
inv_opts = self._get_inv_cli()
if inv_opts:
cmd += inv_opts
# RUN THE PLAYBOOK COMMAND
display.debug("running ansible-playbook to do actual work")
display.debug('EXEC: %s' % cmd)

View File

@ -66,12 +66,20 @@ class VaultCLI(CLI):
self.new_encrypt_secret = None
self.new_encrypt_vault_id = None
self.can_output = ['encrypt', 'decrypt', 'encrypt_string']
super(VaultCLI, self).__init__(args)
def set_action(self):
super(VaultCLI, self).set_action()
# add output if needed
if self.action in self.can_output:
self.parser.add_option('--output', default=None, dest='output_file',
help='output file name for encrypt or decrypt; use - for stdout',
action="callback", callback=CLI.unfrack_path, type='string')
# options specific to self.actions
if self.action == "create":
self.parser.set_usage("usage: %prog create [options] file_name")
@ -113,16 +121,12 @@ class VaultCLI(CLI):
display.verbosity = self.options.verbosity
can_output = ['encrypt', 'decrypt', 'encrypt_string']
if self.options.vault_ids:
for vault_id in self.options.vault_ids:
if u';' in vault_id:
raise AnsibleOptionsError("'%s' is not a valid vault id. The character ';' is not allowed in vault ids" % vault_id)
if self.action not in can_output:
if self.options.output_file:
raise AnsibleOptionsError("The --output option can be used only with ansible-vault %s" % '/'.join(can_output))
if self.action not in self.can_output:
if len(self.args) == 0:
raise AnsibleOptionsError("Vault requires at least one filename as a parameter")
else:
@ -138,8 +142,7 @@ class VaultCLI(CLI):
if '-' in self.args or len(self.args) == 0 or self.options.encrypt_string_stdin_name:
self.encrypt_string_read_stdin = True
# TODO: prompting from stdin and reading from stdin seem
# mutually exclusive, but verify that.
# TODO: prompting from stdin and reading from stdin seem mutually exclusive, but verify that.
if self.options.encrypt_string_prompt and self.encrypt_string_read_stdin:
raise AnsibleOptionsError('The --prompt option is not supported if also reading input from stdin')
@ -162,7 +165,7 @@ class VaultCLI(CLI):
# TODO: instead of prompting for these before, we could let VaultEditor
# call a callback when it needs it.
if self.action in ['decrypt', 'view', 'rekey']:
if self.action in ['decrypt', 'view', 'rekey', 'edit']:
vault_secrets = self.setup_vault_secrets(loader,
vault_ids=vault_ids,
vault_password_files=self.options.vault_password_files,
@ -170,7 +173,7 @@ class VaultCLI(CLI):
if not vault_secrets:
raise AnsibleOptionsError("A vault password is required to use Ansible's Vault")
if self.action in ['encrypt', 'encrypt_string', 'create', 'edit']:
if self.action in ['encrypt', 'encrypt_string', 'create']:
if len(vault_ids) > 1:
raise AnsibleOptionsError("Only one --vault-id can be used for encryption")
@ -181,6 +184,10 @@ class VaultCLI(CLI):
vault_password_files=self.options.vault_password_files,
ask_vault_pass=self.options.ask_vault_pass,
create_new_password=True)
if len(vault_secrets) > 1:
raise AnsibleOptionsError("Only one --vault-id can be used for encryption. This includes passwords from configuration and cli.")
if not vault_secrets:
raise AnsibleOptionsError("A vault password is required to use Ansible's Vault")

File diff suppressed because it is too large Load Diff

View File

@ -22,11 +22,12 @@ from ansible.parsing.quoting import unquote
from ansible.utils.path import unfrackpath
from ansible.utils.path import makedirs_safe
Plugin = namedtuple('Plugin','name type')
Setting = namedtuple('Setting','name value origin')
Plugin = namedtuple('Plugin', 'name type')
Setting = namedtuple('Setting', 'name value origin type')
# FIXME: see if we can unify in module_utils with similar function used by argspec
def ensure_type(value, value_type):
def ensure_type(value, value_type, origin=None):
''' return a configuration variable with casting
:arg value: The value to ensure correct typing of
:kwarg value_type: The type of the value. This can be any of the following strings:
@ -43,6 +44,11 @@ def ensure_type(value, value_type):
means colon separated strings.) Split the value and then expand
each part for environment variables and tildes.
'''
basedir = None
if origin and os.path.isabs(origin) and os.path.exists(origin):
basedir = origin
if value_type:
value_type = value_type.lower()
@ -65,18 +71,24 @@ def ensure_type(value, value_type):
value = None
elif value_type == 'path':
value = resolve_path(value)
value = resolve_path(value, basedir=basedir)
elif value_type in ('tmp', 'temppath', 'tmppath'):
value = resolve_path(value)
value = resolve_path(value, basedir=basedir)
if not os.path.exists(value):
makedirs_safe(value, 0o700)
prefix = 'ansible-local-%s' % os.getpid()
value = tempfile.mkdtemp(prefix=prefix, dir=value)
elif value_type == 'pathspec':
if isinstance(value, string_types):
value = value.split(os.pathsep)
value = [resolve_path(x, basedir=basedir) for x in value]
elif value_type == 'pathlist':
if isinstance(value, string_types):
value = [resolve_path(x) for x in value.split(os.pathsep)]
value = value.split(',')
value = [resolve_path(x, basedir=basedir) for x in value]
# defaults to string types
elif isinstance(value, string_types):
@ -84,13 +96,15 @@ def ensure_type(value, value_type):
return to_text(value, errors='surrogate_or_strict', nonstring='passthru')
# FIXME: see if this can live in utils/path
def resolve_path(path):
def resolve_path(path, basedir=None):
''' resolve relative or 'varaible' paths '''
if '{{CWD}}' in path: # allow users to force CWD using 'magic' {{CWD}}
if '{{CWD}}' in path: # allow users to force CWD using 'magic' {{CWD}}
path = path.replace('{{CWD}}', os.getcwd())
return unfrackpath(path, follow=False)
return unfrackpath(path, follow=False, basedir=basedir)
# FIXME: generic file type?
def get_config_type(cfile):
@ -107,17 +121,19 @@ def get_config_type(cfile):
return ftype
# FIXME: can move to module_utils for use for ini plugins also?
def get_ini_config_value(p, entry):
''' returns the value of last ini entry found '''
value = None
if p is not None:
try:
value = p.get(entry.get('section','defaults'), entry.get('key',''), raw=True)
except: # FIXME: actually report issues here
value = p.get(entry.get('section', 'defaults'), entry.get('key', ''), raw=True)
except: # FIXME: actually report issues here
pass
return value
def find_ini_config_file():
''' Load INI Config File order(first found is used): ENV, CWD, HOME, /etc/ansible '''
# FIXME: eventually deprecate ini configs
@ -142,6 +158,7 @@ def find_ini_config_file():
return path
class ConfigManager(object):
UNABLE = []
@ -156,8 +173,7 @@ class ConfigManager(object):
self._config_file = conf_file
self.data = ConfigData()
#FIXME: make dynamic? scan for more? make it's own method?
# FIXME: make dynamic? scan for more? make it's own method?
# Create configuration definitions from source
bconfig_def = to_bytes('%s/base.yml' % os.path.dirname(__file__))
if os.path.exists(bconfig_def):
@ -200,11 +216,18 @@ class ConfigManager(object):
else:
raise AnsibleOptionsError("Unsupported configuration file type: %s" % to_native(ftype))
def _find_yaml_config_files(self):
''' Load YAML Config Files in order, check merge flags, keep origin of settings'''
pass
def get_plugin_options(self, plugin_type, name, variables=None):
options = {}
defs = self.get_configuration_definitions(plugin_type, name)
for option in defs:
options[option] = self.get_config_value(option, plugin_type=plugin_type, plugin_name=name, variables=variables)
return options
def get_configuration_definitions(self, plugin_type=None, name=None):
''' just list the possible settings, either base or for specific plugins or plugin '''
@ -215,7 +238,7 @@ class ConfigManager(object):
elif name is None:
ret = self._plugins.get(plugin_type, {})
else:
ret = {name: self._plugins.get(plugin_type, {}).get(name, {})}
ret = self._plugins.get(plugin_type, {}).get(name, {})
return ret
@ -227,12 +250,13 @@ class ConfigManager(object):
for entry in entry_list:
name = entry.get('name')
temp_value = container.get(name, None)
if temp_value is not None: # only set if env var is defined
if temp_value is not None: # only set if env var is defined
value = temp_value
origin = name
# deal with deprecation of setting source, if used
#FIXME: if entry.get('deprecated'):
if 'deprecated' in entry:
self.DEPRECATED.append((entry['name'], entry['deprecated']))
return value, origin
@ -273,15 +297,18 @@ class ConfigManager(object):
if ftype and defs[config].get(ftype):
if ftype == 'ini':
# load from ini config
try: # FIXME: generaelize _loop_entries to allow for files also
try: # FIXME: generaelize _loop_entries to allow for files also, most of this code is dupe
for ini_entry in defs[config]['ini']:
value = get_ini_config_value(self._parser, ini_entry)
origin = cfile
#FIXME: if ini_entry.get('deprecated'):
temp_value = get_ini_config_value(self._parser, ini_entry)
if temp_value is not None:
value = temp_value
origin = cfile
if 'deprecated' in ini_entry:
self.DEPRECATED.append(('[%s]%s' % (ini_entry['section'], ini_entry['key']), ini_entry['deprecated']))
except Exception as e:
sys.stderr.write("Error while loading ini config %s: %s" % (cfile, to_native(e)))
elif ftype == 'yaml':
pass # FIXME: implement, also , break down key from defs (. notation???)
pass # FIXME: implement, also , break down key from defs (. notation???)
origin = cfile
'''
@ -295,37 +322,22 @@ class ConfigManager(object):
if value is None:
value = defs[config].get('default')
origin = 'default'
# FIXME: moved eval to constants as this does not have access to previous vars
if plugin_type is None and isinstance(value, string_types) and (value.startswith('eval(') and value.endswith(')')):
# skip typing as this is a temlated default that will be resolved later in constants, which has needed vars
if plugin_type is None and isinstance(value, string_types) and (value.startswith('{{') and value.endswith('}}')):
return value, origin
#default_value = defs[config].get('default')
#if plugin_type is None and isinstance(default_value, string_types) and (default_value.startswith('eval(') and default_value.endswith(')')):
# try:
# eval_string = default_value.replace('eval(', '', 1)[:-1]
# value = eval(eval_string) # FIXME: safe eval?
# except:
# value = default_value
#else:
# value = default_value
# ensure correct type
try:
value = ensure_type(value, defs[config].get('type'))
value = ensure_type(value, defs[config].get('type'), origin=origin)
except Exception as e:
self.UNABLE.append(config)
# deal with deprecation of the setting
if defs[config].get('deprecated') and origin != 'default':
if 'deprecated' in defs[config] and origin != 'default':
self.DEPRECATED.append((config, defs[config].get('deprecated')))
return value, origin
def update_plugin_config(self, plugin_type, name, defs):
''' really: update constants '''
# no sense?
self.initialize_plugin_configuration_definitions(plugin_type, name, defs)
self.update_config_data(defs)
def initialize_plugin_configuration_definitions(self, plugin_type, name, defs):
if plugin_type not in self._plugins:
@ -346,7 +358,7 @@ class ConfigManager(object):
raise AnsibleOptionsError("Invalid configuration definition type: %s for %s" % (type(defs), defs))
# update the constant for config file
self.data.update_setting(Setting('CONFIG_FILE', configfile, ''))
self.data.update_setting(Setting('CONFIG_FILE', configfile, '', 'string'))
origin = None
# env and config defs can have several entries, ordered in list from lowest to highest precedence
@ -358,12 +370,4 @@ class ConfigManager(object):
value, origin = self.get_config_value_and_origin(config, configfile)
# set the constant
self.data.update_setting(Setting(config, value, origin))
# FIXME: find better way to do this by passing back to where display is available
if self.UNABLE:
sys.stderr.write("Unable to set correct type for:\n\t%s\n" % '\n\t'.join(self.UNABLE))
if self.DEPRECATED:
for k, reason in self.DEPRECATED:
sys.stderr.write("[DEPRECATED] %(k)s: %(why)s. It will be removed in %(version)s. As alternative use one of [%(alternatives)s]\n"
% dict(k=k, **reason))
self.data.update_setting(Setting(config, value, origin, defs[config].get('type', 'string')))

View File

@ -6,14 +6,17 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os # used to set lang
import os # used to set lang and for backwards compat get_config
from ast import literal_eval
from jinja2 import Template
from string import ascii_letters, digits
from ansible.module_utils._text import to_text
from ansible.module_utils.parsing.convert_bool import boolean, BOOLEANS_TRUE
from ansible.module_utils.six import string_types
from ansible.config.manager import ConfigManager
from ansible.config.manager import ConfigManager, ensure_type, get_ini_config_value
def _deprecated(msg):
''' display is not guaranteed here, nor it being the full class, but try anyways, fallback to sys.stderr.write '''
@ -24,36 +27,39 @@ def _deprecated(msg):
import sys
sys.stderr.write('[DEPRECATED] %s, to be removed in 2.8' % msg)
def mk_boolean(value):
''' moved to module_utils'''
_deprecated('ansible.constants.mk_boolean() is deprecated. Use ansible.module_utils.parsing.convert_bool.boolean() instead')
return boolean(value, strict=False)
def get_config(parser, section, key, env_var, default_value, value_type=None, expand_relative_paths=False):
''' kept for backwarsd compatibility, but deprecated '''
_deprecated('ansible.constants.get_config() is deprecated. There is new config API, see porting docs.')
import os
value = None
# small reconstruction of the old code env/ini/default
value = os.environ.get(env_var, None)
if value is None:
try:
value = config.get_ini_config(parser, [{'key': key, 'section': section}])
value = get_ini_config_value(parser, {'key': key, 'section': section})
except:
pass
if value is None:
value = default_value
try:
value = config.ensure_type(value, value_type)
except:
pass
value = ensure_type(value, value_type)
return value
def set_constant(name, value, export=vars()):
''' sets constants and returns resolved options dict '''
export[name] = value
### CONSTANTS ### yes, actual ones
BLACKLIST_EXTS = ('.pyc', '.pyo', '.swp', '.bak', '~', '.rpm', '.md', '.txt')
BECOME_METHODS = ['sudo', 'su', 'pbrun', 'pfexec', 'doas', 'dzdo', 'ksu', 'runas', 'pmrun']
BECOME_ERROR_STRINGS = {
'sudo': 'Sorry, try again.',
@ -75,7 +81,9 @@ BECOME_MISSING_STRINGS = {
'ksu': 'No password given',
'pmrun': ''
} # FIXME: deal with i18n
BLACKLIST_EXTS = ('.pyc', '.pyo', '.swp', '.bak', '~', '.rpm', '.md', '.txt')
BOOL_TRUE = BOOLEANS_TRUE
CONTROLER_LANG = os.getenv('LANG', 'en_US.UTF-8')
DEFAULT_BECOME_PASS = None
DEFAULT_PASSWORD_CHARS = to_text(ascii_letters + digits + ".,:-_", errors='strict') # characters included in auto-generated passwords
DEFAULT_SUDO_PASS = None
@ -98,15 +106,19 @@ config = ConfigManager()
# Generate constants from config
for setting in config.data.get_settings():
# FIXME: find better way to do in manager class and/or ensure types
if isinstance(setting.value, string_types) and (setting.value.startswith('eval(') and setting.value.endswith(')')):
value = setting.value
if setting.origin == 'default' and \
isinstance(setting.value, string_types) and \
(setting.value.startswith('{{') and setting.value.endswith('}}')):
try:
eval_string = setting.value.replace('eval(', '', 1)[:-1]
vars()[setting.name] = eval(eval_string) # FIXME: safe eval?
continue
t = Template(setting.value)
value = t.render(vars())
try:
value = literal_eval(value)
except ValueError:
pass # not a python data structure
except:
pass
vars()[setting.name] = setting.value
pass # not templatable
value = ensure_type(value, setting.name)
set_constant(setting.name, value)

View File

@ -414,6 +414,8 @@ class TaskExecutor:
# We also add "magic" variables back into the variables dict to make sure
# a certain subset of variables exist.
self._play_context.update_vars(variables)
# FIXME: update connection/shell plugin options
except AnsibleError as e:
# save the error, which we'll raise later if we don't end up
# skipping this task during the conditional evaluation step
@ -474,18 +476,11 @@ class TaskExecutor:
not getattr(self._connection, 'connected', False) or
self._play_context.remote_addr != self._connection._play_context.remote_addr):
self._connection = self._get_connection(variables=variables, templar=templar)
hostvars = variables.get('hostvars', None)
# only template the vars if the connection actually implements set_host_overrides
# NB: this is expensive, and should be removed once connection-specific vars are being handled by play_context
sho_impl = getattr(type(self._connection), 'set_host_overrides', None)
if hostvars and sho_impl and sho_impl != ConnectionBase.set_host_overrides:
try:
target_hostvars = hostvars.get(self._host.name)
except:
# FIXME: this should catch the j2undefined error here
# specifically instead of all exceptions
target_hostvars = dict()
self._connection.set_host_overrides(host=self._host, hostvars=target_hostvars)
if sho_impl and sho_impl != ConnectionBase.set_host_overrides:
self._connection.set_host_overrides(self._host, variables, templar)
else:
# if connection is reused, its _play_context is no longer valid and needs
# to be replaced with the one templated above, in case other data changed
@ -731,11 +726,11 @@ class TaskExecutor:
conn_type = self._play_context.connection
connection = self._shared_loader_obj.connection_loader.get(conn_type, self._play_context, self._new_stdin)
self._play_context.set_options_from_plugin(connection)
if not connection:
raise AnsibleError("the connection plugin '%s' was not found" % conn_type)
self._play_context.set_options_from_plugin(connection)
if self._play_context.accelerate:
# accelerate is deprecated as of 2.1...
display.deprecated('Accelerated mode is deprecated. Consider using SSH with ControlPersist and pipelining enabled instead', version='2.6')

View File

@ -84,9 +84,9 @@ class TaskQueueManager:
self._start_at_done = False
# make sure any module paths (if specified) are added to the module_loader
if isinstance(options.module_path, list):
if options.module_path:
for path in options.module_path:
if path is not None:
if path:
module_loader.add_directory(path)
# a special flag to help us exit cleanly
@ -176,6 +176,12 @@ class TaskQueueManager:
raise AnsibleError("Invalid callback for stdout specified: %s" % self._stdout_callback)
else:
self._stdout_callback = callback_loader.get(self._stdout_callback)
try:
self._stdout_callback.set_options(C.config.get_plugin_options('callback', self._stdout_callback._load_name))
except AttributeError:
display.deprecated("%s stdout callback, does not support setting 'options', it will work for now, "
" but this will be required in the future and should be updated,"
" see the 2.4 porting guide for details." % self._stdout_callback._load_name, version="2.9")
stdout_callback_loaded = True
else:
raise AnsibleError("callback must be an instance of CallbackBase or the name of a callback plugin")
@ -198,7 +204,14 @@ class TaskQueueManager:
C.DEFAULT_CALLBACK_WHITELIST is None or callback_name not in C.DEFAULT_CALLBACK_WHITELIST)):
continue
self._callback_plugins.append(callback_plugin())
callback_obj = callback_plugin()
try:
callback_obj .set_options(C.config.get_plugin_options('callback', callback_plugin._load_name))
except AttributeError:
display.deprecated("%s callback, does not support setting 'options', it will work for now, "
" but this will be required in the future and should be updated, "
" see the 2.4 porting guide for details." % self._stdout_callback._load_name, version="2.9")
self._callback_plugins.append(callback_obj)
self._callbacks_loaded = True
@ -366,4 +379,4 @@ class TaskQueueManager:
display.warning(u"Failure using method (%s) in callback plugin (%s): %s" % (to_text(method_name), to_text(callback_plugin), to_text(e)))
from traceback import format_tb
from sys import exc_info
display.debug('Callback Exception: \n' + ' '.join(format_tb(exc_info()[2])))
display.vvv('Callback Exception: \n' + ' '.join(format_tb(exc_info()[2])))

View File

@ -19,7 +19,6 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
import sys
from ansible import constants as C
@ -187,7 +186,7 @@ class InventoryData(object):
h = Host(host, port)
self.hosts[host] = h
if self.current_source: # set to 'first source' in which host was encountered
self.set_variable(host, 'inventory_file', os.path.basename(self.current_source))
self.set_variable(host, 'inventory_file', self.current_source)
self.set_variable(host, 'inventory_dir', basedir(self.current_source))
else:
self.set_variable(host, 'inventory_file', None)
@ -204,7 +203,7 @@ class InventoryData(object):
else:
h = self.hosts[host]
if g and h not in g.get_hosts():
if g:
g.add_host(h)
self._groups_dict_cache = {}
display.debug("Added host %s to group %s" % (host, group))

View File

@ -18,7 +18,6 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
from ansible.errors import AnsibleError
from ansible.utils.vars import combine_vars
class Group:
@ -31,6 +30,7 @@ class Group:
self.depth = 0
self.name = name
self.hosts = []
self._hosts = None
self.vars = {}
self.child_groups = []
self.parent_groups = []
@ -54,11 +54,14 @@ class Group:
for parent in self.parent_groups:
parent_groups.append(parent.serialize())
self._hosts = None
result = dict(
name=self.name,
vars=self.vars.copy(),
parent_groups=parent_groups,
depth=self.depth,
hosts=self.hosts,
)
return result
@ -68,6 +71,8 @@ class Group:
self.name = data.get('name')
self.vars = data.get('vars', dict())
self.depth = data.get('depth', 0)
self.hosts = data.get('hosts', [])
self._hosts = None
parent_groups = data.get('parent_groups', [])
for parent_data in parent_groups:
@ -75,6 +80,12 @@ class Group:
g.deserialize(parent_data)
self.parent_groups.append(g)
@property
def host_names(self):
if self._hosts is None:
self._hosts = set(self.hosts)
return self._hosts
def get_name(self):
return self.name
@ -112,17 +123,19 @@ class Group:
raise AnsibleError("The group named '%s' has a recursive dependency loop." % self.name)
def add_host(self, host):
if host in self.hosts:
return
self.hosts.append(host)
host.add_group(self)
self.clear_hosts_cache()
if host.name not in self.host_names:
self.hosts.append(host)
self._hosts.add(host.name)
host.add_group(self)
self.clear_hosts_cache()
def remove_host(self, host):
self.hosts.remove(host)
host.remove_group(self)
self.clear_hosts_cache()
if host.name in self.host_names:
self.hosts.remove(host)
self._hosts.remove(host.name)
host.remove_group(self)
self.clear_hosts_cache()
def set_variable(self, key, value):

View File

@ -143,7 +143,7 @@ class Host:
results['inventory_hostname_short'] = self.name.split('.')[0]
results['group_names'] = sorted([g.name for g in self.get_groups() if g.name != 'all'])
return combine_vars(self.vars, results)
return results
def get_vars(self):
return combine_vars(self.vars, self.get_magic_vars())

View File

@ -168,6 +168,7 @@ class InventoryManager(object):
return self._inventory.get_groups_dict()
def reconcile_inventory(self):
self.clear_caches()
return self._inventory.reconcile_inventory()
def get_host(self, hostname):
@ -176,7 +177,7 @@ class InventoryManager(object):
def _setup_inventory_plugins(self):
''' sets up loaded inventory plugins for usage '''
inventory_loader = PluginLoader('InventoryModule', 'ansible.plugins.inventory', 'inventory_plugins', 'inventory_plugins')
inventory_loader = PluginLoader('InventoryModule', 'ansible.plugins.inventory', C.DEFAULT_INVENTORY_PLUGIN_PATH, 'inventory_plugins')
display.vvvv('setting up inventory plugins')
for name in C.INVENTORY_ENABLED:
@ -189,7 +190,7 @@ class InventoryManager(object):
if not self._inventory_plugins:
raise AnsibleError("No inventory plugins available to generate inventory, make sure you have at least one whitelisted.")
def parse_sources(self, cache=True):
def parse_sources(self, cache=False):
''' iterate over inventory sources and parse each one to populate it'''
self._setup_inventory_plugins()
@ -213,7 +214,7 @@ class InventoryManager(object):
self._inventory_plugins = []
def parse_source(self, source, cache=True):
def parse_source(self, source, cache=False):
''' Generate or update inventory for the source provided '''
parsed = False
@ -268,7 +269,7 @@ class InventoryManager(object):
if not parsed and failures:
# only if no plugin processed files should we show errors.
if C.INVENTORY_UNPARSED_IS_FAILED:
msg = "Could not parse inventory source %s with availabel plugins:\n" % source
msg = "Could not parse inventory source %s with available plugins:\n" % source
for fail in failures:
msg += 'Plugin %s failed: %s\n' % (fail['plugin'], to_native(fail['exc']))
if display.verbosity >= 3:

View File

@ -733,7 +733,7 @@ class ACIModule(object):
def post_config(self):
"""
This method is used to handle the logic when the modules state is equal to present. The method only pushes a change if
the object has differences than what exists on the APIC, and if check_mode is Fasle. A successful change will mark the
the object has differences than what exists on the APIC, and if check_mode is False. A successful change will mark the
module as changed.
"""
if not self.result['config']:

View File

@ -62,7 +62,7 @@ def check_args(module):
provider = module.params['provider'] or {}
for key in asa_argument_spec:
if key not in ['provider', 'authorize'] and module.params[key]:
if key not in ['context', 'passwords', 'provider', 'authorize'] and module.params[key]:
module.warn('argument %s has been deprecated and will be removed in a future version' % key)
if provider:

View File

@ -149,7 +149,7 @@ class AzureRMModuleBase(object):
def __init__(self, derived_arg_spec, bypass_checks=False, no_log=False,
check_invalid_arguments=True, mutually_exclusive=None, required_together=None,
required_one_of=None, add_file_common_args=False, supports_check_mode=False,
required_if=None, supports_tags=True, facts_module=False):
required_if=None, supports_tags=True, facts_module=False, skip_exec=False):
merged_arg_spec = dict()
merged_arg_spec.update(AZURE_COMMON_ARGS)
@ -252,8 +252,9 @@ class AzureRMModuleBase(object):
if self.module.params.get('tags'):
self.validate_tags(self.module.params['tags'])
res = self.exec_module(**self.module.params)
self.module.exit_json(**res)
if not skip_exec:
res = self.exec_module(**self.module.params)
self.module.exit_json(**res)
def check_client_version(self, client_name, client_version, expected_version):
# Ensure Azure modules are at least 2.0.0rc5.

View File

@ -1133,9 +1133,9 @@ class AnsibleModule(object):
return True
try:
os.lchown(b_path, uid, -1)
except OSError:
except (IOError, OSError) as e:
path = to_text(b_path)
self.fail_json(path=path, msg='chown failed')
self.fail_json(path=path, msg='chown failed: %s' % (to_text(e)))
changed = True
return changed
@ -2533,6 +2533,7 @@ class AnsibleModule(object):
# sadly there are some situations where we cannot ensure atomicity, but only if
# the user insists and we get the appropriate error we update the file unsafely
try:
out_dest = in_src = None
try:
out_dest = open(dest, 'wb')
in_src = open(src, 'rb')
@ -2601,6 +2602,7 @@ class AnsibleModule(object):
strings on python3, use encoding=None to turn decoding to text off.
'''
shell = False
if isinstance(args, list):
if use_unsafe_shell:
args = " ".join([shlex_quote(x) for x in args])
@ -2608,27 +2610,17 @@ class AnsibleModule(object):
elif isinstance(args, (binary_type, text_type)) and use_unsafe_shell:
shell = True
elif isinstance(args, (binary_type, text_type)):
if not use_unsafe_shell:
# On python2.6 and below, shlex has problems with text type
# On python3, shlex needs a text type.
if PY2:
args = to_bytes(args, errors='surrogate_or_strict')
elif PY3:
args = to_text(args, errors='surrogateescape')
args = shlex.split(args)
# On python2.6 and below, shlex has problems with text type
# On python3, shlex needs a text type.
if PY2:
args = to_bytes(args, errors='surrogate_or_strict')
elif PY3:
args = to_text(args, errors='surrogateescape')
args = shlex.split(args)
else:
msg = "Argument 'args' to run_command must be list or string"
self.fail_json(rc=257, cmd=args, msg=msg)
shell = False
if use_unsafe_shell:
if executable is None:
executable = os.environ.get('SHELL')
if executable:
args = [executable, '-c', args]
else:
shell = True
prompt_re = None
if prompt_regex:
if isinstance(prompt_regex, text_type):

View File

@ -61,7 +61,7 @@ ce_provider_spec = {
'use_ssl': dict(type='bool'),
'validate_certs': dict(type='bool'),
'timeout': dict(type='int'),
'transport': dict(choices=['cli']),
'transport': dict(default='cli', choices=['cli']),
}
ce_argument_spec = {
'provider': dict(type='dict', options=ce_provider_spec),

View File

@ -2178,7 +2178,8 @@ def checkVlanNameNotAssigned(
retVal = waitForDeviceResponse(command, prompt, timeout, obj)
if(retVal.find(vlanName) != -1):
return "Nok"
return retVal
else:
return "ok"
# EOM
@ -3158,10 +3159,13 @@ def waitForDeviceResponse(command, prompt, timeout, obj):
if(gotit != -1):
flag = True
except:
if prompt != "(yes/no)?":
retVal = retVal + "\n Error-101"
else:
# debugOutput(prompt)
if prompt == "(yes/no)?":
retVal = retVal
elif prompt == "Password:":
retVal = retVal
else:
retVal = retVal + "\n Error-101"
flag = True
return retVal
# EOM
@ -3175,7 +3179,7 @@ def checkOutputForError(output):
index = output.lower().find("invalid")
startIndex = index + 8
if(index == -1):
index = output.lower().find("Cannot be enabled in L2 Interface")
index = output.lower().find("cannot be enabled in l2 interface")
startIndex = index + 34
if(index == -1):
index = output.lower().find("incorrect")

View File

@ -109,6 +109,12 @@ keyUsageLong = {
}
extendedKeyUsageLong = {
"anyExtendedKeyUsage": "Any Extended Key Usage",
"ipsecEndSystem": "IPSec End System",
"ipsecTunnel": "IPSec Tunnel",
"ipsecUser": "IPSec User",
"msSGC": "Microsoft Server Gated Crypto",
"nsSGC": "Netscape Server Gated Crypto",
"serverAuth": "TLS Web Server Authentication",
"clientAuth": "TLS Web Client Authentication",
"codeSigning": "Code Signing",

View File

@ -159,7 +159,7 @@ def os6_parse(lines, indent=None, comment_tokens=None):
re.compile(r'support-assist.*$'),
re.compile(r'template.*$'),
re.compile(r'address-family.*$'),
re.compile(r'spanning-tree mst.*$'),
re.compile(r'spanning-tree mst configuration.*$'),
re.compile(r'logging.*$'),
re.compile(r'(radius-server|tacacs-server) host.*$')]
@ -205,7 +205,7 @@ def os6_parse(lines, indent=None, comment_tokens=None):
if parent:
cfg._parents.extend(parent)
parent = list()
config.append(cfg)
config.append(cfg)
# handle sublevel children
elif parent_match is False and len(parent) > 0:
if not children:
@ -231,7 +231,11 @@ class Dellos6NetworkConfig(NetworkConfig):
for item in self.items:
if str(item) == "exit":
for diff_item in diff:
if item._parents == diff_item._parents:
if diff_item._parents:
if item._parents == diff_item._parents:
diff.append(item)
break
else:
diff.append(item)
break
elif item not in other:

View File

@ -28,7 +28,6 @@
import os
import re
from time import sleep
from ansible.module_utils._text import to_native
from ansible.module_utils.cloud import CloudRetry
@ -437,7 +436,7 @@ def ansible_dict_to_boto3_filter_list(filters_dict):
return filters_list
def boto3_tag_list_to_ansible_dict(tags_list, tag_name_key_name='Key', tag_value_key_name='Value'):
def boto3_tag_list_to_ansible_dict(tags_list, tag_name_key_name=None, tag_value_key_name=None):
""" Convert a boto3 list of resource tags to a flat dict of key:value pairs
Args:
@ -460,12 +459,17 @@ def boto3_tag_list_to_ansible_dict(tags_list, tag_name_key_name='Key', tag_value
}
"""
tags_dict = {}
for tag in tags_list:
if tag_name_key_name in tag:
tags_dict[tag[tag_name_key_name]] = tag[tag_value_key_name]
if tag_name_key_name and tag_value_key_name:
tag_candidates = {tag_name_key_name: tag_value_key_name}
else:
tag_candidates = {'key': 'value', 'Key': 'Value'}
return tags_dict
if not tags_list:
return {}
for k, v in tag_candidates.items():
if k in tags_list[0] and v in tags_list[0]:
return dict((tag[k], tag[v]) for tag in tags_list)
raise ValueError("Couldn't find tag key (candidates %s) in tag list %s" % (str(tag_candidates), str(tags_list)))
def ansible_dict_to_boto3_tag_list(tags_dict, tag_name_key_name='Key', tag_value_key_name='Value'):

View File

@ -53,7 +53,7 @@ eos_provider_spec = {
'validate_certs': dict(type='bool'),
'timeout': dict(type='int'),
'transport': dict(choices=['cli', 'eapi'])
'transport': dict(default='cli', choices=['cli', 'eapi'])
}
eos_argument_spec = {
'provider': dict(type='dict', options=eos_provider_spec),
@ -79,7 +79,7 @@ def check_args(module, warnings):
module.params[key]):
warnings.append('argument %s has been deprecated and will be removed in a future version' % key)
else:
if key not in ['provider', 'authorize'] and module.params[key]:
if key not in ['provider', 'transport', 'authorize'] and module.params[key]:
warnings.append('argument %s has been deprecated and will be removed in a future version' % key)
# set argument's default value if not provided in input

View File

@ -203,6 +203,28 @@ def build_fact_id_to_collector_map(collectors_for_platform):
return fact_id_to_collector_map, aliases_map
def select_collector_classes(collector_names, all_fact_subsets, all_collector_classes):
# TODO: can be a set()
seen_collector_classes = []
selected_collector_classes = []
for candidate_collector_class in all_collector_classes:
candidate_collector_name = candidate_collector_class.name
if candidate_collector_name not in collector_names:
continue
collector_classes = all_fact_subsets.get(candidate_collector_name, [])
for collector_class in collector_classes:
if collector_class not in seen_collector_classes:
selected_collector_classes.append(collector_class)
seen_collector_classes.append(collector_class)
return selected_collector_classes
def collector_classes_from_gather_subset(all_collector_classes=None,
valid_subsets=None,
minimal_gather_subset=None,
@ -248,19 +270,8 @@ def collector_classes_from_gather_subset(all_collector_classes=None,
aliases_map=aliases_map,
platform_info=platform_info)
# TODO: can be a set()
seen_collector_classes = []
selected_collector_classes = []
for collector_name in collector_names:
collector_classes = all_fact_subsets.get(collector_name, [])
# TODO? log/warn if we dont find an implementation of a fact_id?
for collector_class in collector_classes:
if collector_class not in seen_collector_classes:
selected_collector_classes.append(collector_class)
seen_collector_classes.append(collector_class)
selected_collector_classes = select_collector_classes(collector_names,
all_fact_subsets,
all_collector_classes)
return selected_collector_classes

View File

@ -32,6 +32,7 @@ from ansible.module_utils.facts.system.fips import FipsFactCollector
from ansible.module_utils.facts.system.local import LocalFactCollector
from ansible.module_utils.facts.system.lsb import LSBFactCollector
from ansible.module_utils.facts.system.pkg_mgr import PkgMgrFactCollector
from ansible.module_utils.facts.system.pkg_mgr import OpenBSDPkgMgrFactCollector
from ansible.module_utils.facts.system.platform import PlatformFactCollector
from ansible.module_utils.facts.system.python import PythonFactCollector
from ansible.module_utils.facts.system.selinux import SelinuxFactCollector
@ -72,58 +73,81 @@ from ansible.module_utils.facts.virtual.netbsd import NetBSDVirtualCollector
from ansible.module_utils.facts.virtual.openbsd import OpenBSDVirtualCollector
from ansible.module_utils.facts.virtual.sunos import SunOSVirtualCollector
# these should always be first due to most other facts depending on them
_base = [
PlatformFactCollector,
DistributionFactCollector,
LSBFactCollector
]
# These restrict what is possible in others
_restrictive = [
SelinuxFactCollector,
ApparmorFactCollector,
FipsFactCollector
]
# general info, not required but probably useful for other facts
_general = [
PythonFactCollector,
SystemCapabilitiesFactCollector,
PkgMgrFactCollector,
OpenBSDPkgMgrFactCollector,
ServiceMgrFactCollector,
CmdLineFactCollector,
DateTimeFactCollector,
EnvFactCollector,
SshPubKeyFactCollector,
UserFactCollector
]
# virtual, this might also limit hardware/networking
_virtual = [
VirtualCollector,
DragonFlyVirtualCollector,
FreeBSDVirtualCollector,
LinuxVirtualCollector,
OpenBSDVirtualCollector,
NetBSDVirtualCollector,
SunOSVirtualCollector,
HPUXVirtualCollector
]
_hardware = [
HardwareCollector,
AIXHardwareCollector,
DarwinHardwareCollector,
DragonFlyHardwareCollector,
FreeBSDHardwareCollector,
HPUXHardwareCollector,
HurdHardwareCollector,
LinuxHardwareCollector,
NetBSDHardwareCollector,
OpenBSDHardwareCollector,
SunOSHardwareCollector
]
_network = [
DnsFactCollector,
NetworkCollector,
AIXNetworkCollector,
DarwinNetworkCollector,
DragonFlyNetworkCollector,
FreeBSDNetworkCollector,
HPUXNetworkCollector,
HurdNetworkCollector,
LinuxNetworkCollector,
NetBSDNetworkCollector,
OpenBSDNetworkCollector,
SunOSNetworkCollector
]
# other fact sources
_extra_facts = [
LocalFactCollector,
FacterFactCollector,
OhaiFactCollector
]
# TODO: make config driven
collectors = [ApparmorFactCollector,
CmdLineFactCollector,
DateTimeFactCollector,
DistributionFactCollector,
DnsFactCollector,
EnvFactCollector,
FipsFactCollector,
HardwareCollector,
AIXHardwareCollector,
DarwinHardwareCollector,
DragonFlyHardwareCollector,
FreeBSDHardwareCollector,
HPUXHardwareCollector,
HurdHardwareCollector,
LinuxHardwareCollector,
NetBSDHardwareCollector,
OpenBSDHardwareCollector,
SunOSHardwareCollector,
LocalFactCollector,
LSBFactCollector,
NetworkCollector,
AIXNetworkCollector,
DarwinNetworkCollector,
DragonFlyNetworkCollector,
FreeBSDNetworkCollector,
HPUXNetworkCollector,
HurdNetworkCollector,
LinuxNetworkCollector,
NetBSDNetworkCollector,
OpenBSDNetworkCollector,
SunOSNetworkCollector,
PkgMgrFactCollector,
PlatformFactCollector,
PythonFactCollector,
SelinuxFactCollector,
ServiceMgrFactCollector,
SshPubKeyFactCollector,
SystemCapabilitiesFactCollector,
UserFactCollector,
VirtualCollector,
DragonFlyVirtualCollector,
FreeBSDVirtualCollector,
LinuxVirtualCollector,
OpenBSDVirtualCollector,
NetBSDVirtualCollector,
SunOSVirtualCollector,
HPUXVirtualCollector,
FacterFactCollector,
OhaiFactCollector]
collectors = _base + _restrictive + _general + _virtual + _hardware + _network + _extra_facts

View File

@ -193,6 +193,7 @@ class LinuxHardware(Hardware):
# model name is for Intel arch, Processor (mind the uppercase P)
# works for some ARM devices, like the Sheevaplug.
# 'ncpus active' is SPARC attribute
if key in ['model name', 'Processor', 'vendor_id', 'cpu', 'Vendor', 'processor']:
if 'processor' not in cpu_facts:
cpu_facts['processor'] = []
@ -216,6 +217,8 @@ class LinuxHardware(Hardware):
cores[coreid] = int(data[1].strip())
elif key == '# processors':
cpu_facts['processor_cores'] = int(data[1].strip())
elif key == 'ncpus active':
i = int(data[1].strip())
# Skip for platforms without vendor_id/model_name in cpuinfo (e.g ppc64le)
if vendor_id_occurrence > 0:
@ -671,7 +674,7 @@ class LinuxHardware(Hardware):
if vgs_path:
rc, vg_lines, err = self.module.run_command('%s %s' % (vgs_path, lvm_util_options))
for vg_line in vg_lines.splitlines():
items = vg_line.split(',')
items = vg_line.strip().split(',')
vgs[items[0]] = {'size_g': items[-2],
'free_g': items[-1],
'num_lvs': items[2],
@ -684,7 +687,7 @@ class LinuxHardware(Hardware):
if lvs_path:
rc, lv_lines, err = self.module.run_command('%s %s' % (lvs_path, lvm_util_options))
for lv_line in lv_lines.splitlines():
items = lv_line.split(',')
items = lv_line.strip().split(',')
lvs[items[0]] = {'size_g': items[3], 'vg': items[1]}
pvs_path = self.module.get_bin_path('pvs')
@ -693,7 +696,7 @@ class LinuxHardware(Hardware):
if pvs_path:
rc, pv_lines, err = self.module.run_command('%s %s' % (pvs_path, lvm_util_options))
for pv_line in pv_lines.splitlines():
items = pv_line.split(',')
items = pv_line.strip().split(',')
pvs[self._find_mapper_device_name(items[0])] = {
'size_g': items[4],
'free_g': items[5],

Some files were not shown because too many files have changed in this diff Show More