Compare commits

..

5 Commits

Author SHA1 Message Date
9b6b924e9c Use events instead of sleep for result reading 2017-10-02 12:25:00 -05:00
f860ea10c4 Updating locking in plugins after rebasing 2017-10-02 12:25:00 -05:00
dbd3a0828a Use threading instead of concurrent.futures for py2 and py3 2017-10-02 12:25:00 -05:00
5e63647517 Use persistent threads with job/results queues
Instead of creating a one-time use thread for every host/task
2017-10-02 12:25:00 -05:00
f95160723d Start of work to use threading instead of forking
Rather than using multiprocessing (Process and Queue objects) to do worker
tasks in Ansible:

* Using concurrent.futures
* Using ThreadProcessExecutor
* Making PluginLoader thread-safe
* Gutting a lot of code dealing with message passing
2017-10-02 12:25:00 -05:00
9445 changed files with 189166 additions and 754476 deletions

View File

@ -1,5 +0,0 @@
team = "ansible"
repo = "ansible"
check_sha = "f31421576b00f0b167cdbe61217c31c21a41ac02" # the very first commit in repo
fix_commit_msg = false # Don't replace "#" with "GH-"
default_branch = "devel"

View File

@ -23,4 +23,3 @@ omit =
*/python*/distutils/*
*/pyshared/*
*/pytest
*/AnsiballZ_*.py

2
.gitattributes vendored
View File

@ -1,2 +1,4 @@
CHANGELOG.md merge=union
.github/ export-ignore
hacking/ export-ignore
ticket-stubs/ export-ignore

1239
.github/BOTMETA.yml vendored

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +0,0 @@
# Community Code of Conduct
Please see the official [Ansible Community Code of Conduct](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html).

View File

@ -1,25 +0,0 @@
# WELCOME TO ANSIBLE GITHUB
Hi! Nice to see you here!
## QUESTIONS ?
Please see the [Community Guide](https://docs.ansible.com/ansible/latest/community/index.html) for information on how to ask questions on the [mailing lists](https://docs.ansible.com/ansible/latest/community/communication.html#mailing-list-information) and IRC.
The GitHub issue tracker is not the best place for questions for various reasons, but both IRC and the mailing list are very helpful places for those things, as the community page explains best.
## CONTRIBUTING ?
By contributing you agree that these contributions are your own (or approved by your employer) and you grant a full, complete, irrevocable copyright license to all users and developers of the project, present and future, pursuant to the license of the project. You can also read the same [CLA](https://docs.ansible.com/ansible/latest/community/contributor_license_agreement.html) on the Ansible docsite.
Please review the [Community Guide](https://docs.ansible.com/ansible/latest/community/index.html) for more information on contributing to Ansible.
## BUG TO REPORT ?
First and foremost, also check the [Community Guide](https://docs.ansible.com/ansible/latest/community/index.html).
You can report bugs or make enhancement requests at the [Ansible GitHub issue page](http://github.com/ansible/ansible/issues/new/choose) by filling out the issue template that will be presented.
Also please make sure you are testing on the latest released version of Ansible or the development branch; see the [Installation Guide](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) for details.
Thanks!

View File

@ -1,43 +1,48 @@
<!---
Verify first that your issue/request is not already reported on GitHub.
THIS FORM WILL BE READ BY A MACHINE, COMPLETE ALL SECTIONS AS DESCRIBED.
Also test if the latest release, and devel branch are affected too.
ALWAYS add information AFTER (OUTSIDE) these html comments.
Otherwise it may end up being automatically closed by our bot. -->
##### SUMMARY
<!--- Explain the problem briefly -->
Also test if the latest release, and master branch are affected too.
-->
##### ISSUE TYPE
<!--- Pick one below and delete the rest -->
<!--- Pick one below and delete the rest: -->
- Bug Report
- Feature Idea
- Documentation Report
##### COMPONENT NAME
<!--- Insert, BELOW THIS COMMENT, the name of the module, plugin, task or feature.
Do not include extra details here, e.g. "vyos_command" not "the network module vyos_command" or the full path-->
<!--- Name of the module/plugin/task/feature -->
##### ANSIBLE VERSION
<!--- Paste, BELOW THIS COMMENT, verbatim output from "ansible --version" between quotes below -->
<!--- Paste verbatim output from "ansible --version" between quotes below -->
```
```
##### CONFIGURATION
<!--- If using Ansible 2.4 or above, paste, BELOW THIS COMMENT, the results of "ansible-config dump --only-changed"
<!---
If using Ansible 2.4 or above, paste the results of "ansible-config dump --only-changed"
Otherwise, mention any settings you have changed/added/removed in ansible.cfg
(or using the ANSIBLE_* environment variables).-->
(or using the ANSIBLE_* environment variables).
-->
##### OS / ENVIRONMENT
<!--- Mention, BELOW THIS COMMENT, the OS you are running Ansible from, and the OS you are
<!---
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.
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.-->
e.g. if this is a network bug the version of firmware on the network device.
-->
##### SUMMARY
<!--- Explain the problem briefly -->
##### STEPS TO REPRODUCE
<!--- For bugs, show exactly how to reproduce the problem, using a minimal test-case.
For new features, show how the feature would be used. -->
<!---
For bugs, show exactly how to reproduce the problem, using a minimal test-case.
For new features, show how the feature would be used.
-->
<!--- Paste example playbooks or commands between quotes below -->
```yaml

View File

@ -1,61 +0,0 @@
---
name: 🐛 Bug report
about: Create a report to help us improve
---
<!---
Verify first that your issue/request is not already reported on GitHub.
THIS FORM WILL BE READ BY A MACHINE, COMPLETE ALL SECTIONS AS DESCRIBED.
Also test if the latest release, and devel branch are affected too.
ALWAYS add information AFTER (OUTSIDE) these html comments.
Otherwise it may end up being automatically closed by our bot. -->
##### SUMMARY
<!--- Explain the problem briefly -->
##### ISSUE TYPE
- Bug Report
##### COMPONENT NAME
<!--- Insert, BELOW THIS COMMENT, the name of the module, plugin, task or feature.
Do not include extra details here, e.g. "vyos_command" not "the network module vyos_command" or the full path-->
##### ANSIBLE VERSION
<!--- Paste, BELOW THIS COMMENT, verbatim output from "ansible --version" between quotes below -->
```
```
##### CONFIGURATION
<!--- If using Ansible 2.4 or above, paste, BELOW THIS COMMENT, the results of "ansible-config dump --only-changed"
Otherwise, mention any settings you have changed/added/removed in ansible.cfg
(or using the ANSIBLE_* environment variables).-->
##### OS / ENVIRONMENT
<!--- Mention, BELOW THIS COMMENT, the OS you are running Ansible from, and the OS you are
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.-->
##### STEPS TO REPRODUCE
<!--- For bugs, show exactly how to reproduce the problem, using a minimal test-case.
For new features, show how the feature would be used. -->
<!--- Paste example playbooks or commands between quotes below -->
```yaml
```
<!--- You can also paste gist.github.com links for larger files -->
##### EXPECTED RESULTS
<!--- What did you expect to happen when running the steps above? -->
##### ACTUAL RESULTS
<!--- What actually happened? If possible run with extra verbosity (-vvvv) -->
<!--- Paste verbatim command output between quotes below -->
```
```

View File

@ -1,61 +0,0 @@
---
name: 📝 Documentation Report
about: Ask us about docs
---
<!---
Verify first that your issue/request is not already reported on GitHub.
THIS FORM WILL BE READ BY A MACHINE, COMPLETE ALL SECTIONS AS DESCRIBED.
Also test if the latest release, and devel branch are affected too.
ALWAYS add information AFTER (OUTSIDE) these html comments.
Otherwise it may end up being automatically closed by our bot. -->
##### SUMMARY
<!--- Explain the problem briefly -->
##### ISSUE TYPE
- Documentation Report
##### COMPONENT NAME
<!--- Insert, BELOW THIS COMMENT, the name of the module, plugin, task or feature.
Do not include extra details here, e.g. "vyos_command" not "the network module vyos_command" or the full path-->
##### ANSIBLE VERSION
<!--- Paste, BELOW THIS COMMENT, verbatim output from "ansible --version" between quotes below -->
```
```
##### CONFIGURATION
<!--- If using Ansible 2.4 or above, paste, BELOW THIS COMMENT, the results of "ansible-config dump --only-changed"
Otherwise, mention any settings you have changed/added/removed in ansible.cfg
(or using the ANSIBLE_* environment variables).-->
##### OS / ENVIRONMENT
<!--- Mention, BELOW THIS COMMENT, the OS you are running Ansible from, and the OS you are
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.-->
##### STEPS TO REPRODUCE
<!--- For bugs, show exactly how to reproduce the problem, using a minimal test-case.
For new features, show how the feature would be used. -->
<!--- Paste example playbooks or commands between quotes below -->
```yaml
```
<!--- You can also paste gist.github.com links for larger files -->
##### EXPECTED RESULTS
<!--- What did you expect to happen when running the steps above? -->
##### ACTUAL RESULTS
<!--- What actually happened? If possible run with extra verbosity (-vvvv) -->
<!--- Paste verbatim command output between quotes below -->
```
```

View File

@ -1,61 +0,0 @@
---
name: ✨ Feature request
about: Suggest an idea for this project
---
<!---
Verify first that your issue/request is not already reported on GitHub.
THIS FORM WILL BE READ BY A MACHINE, COMPLETE ALL SECTIONS AS DESCRIBED.
Also test if the latest release, and devel branch are affected too.
ALWAYS add information AFTER (OUTSIDE) these html comments.
Otherwise it may end up being automatically closed by our bot. -->
##### SUMMARY
<!--- Explain the problem briefly -->
##### ISSUE TYPE
- Feature Idea
##### COMPONENT NAME
<!--- Insert, BELOW THIS COMMENT, the name of the module, plugin, task or feature.
Do not include extra details here, e.g. "vyos_command" not "the network module vyos_command" or the full path-->
##### ANSIBLE VERSION
<!--- Paste, BELOW THIS COMMENT, verbatim output from "ansible --version" between quotes below -->
```
```
##### CONFIGURATION
<!--- If using Ansible 2.4 or above, paste, BELOW THIS COMMENT, the results of "ansible-config dump --only-changed"
Otherwise, mention any settings you have changed/added/removed in ansible.cfg
(or using the ANSIBLE_* environment variables).-->
##### OS / ENVIRONMENT
<!--- Mention, BELOW THIS COMMENT, the OS you are running Ansible from, and the OS you are
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.-->
##### STEPS TO REPRODUCE
<!--- For bugs, show exactly how to reproduce the problem, using a minimal test-case.
For new features, show how the feature would be used. -->
<!--- Paste example playbooks or commands between quotes below -->
```yaml
```
<!--- You can also paste gist.github.com links for larger files -->
##### EXPECTED RESULTS
<!--- What did you expect to happen when running the steps above? -->
##### ACTUAL RESULTS
<!--- What actually happened? If possible run with extra verbosity (-vvvv) -->
<!--- Paste verbatim command output between quotes below -->
```
```

View File

@ -1,8 +0,0 @@
---
name: 🔥 Security bug report
about: How to report security vulnerabilities
---
For all security related bugs, email security@ansible.com instead of using this issue tracker and you will receive a prompt response.
For more information, see https://docs.ansible.com/ansible/latest/community/reporting_bugs_and_features.html

View File

@ -1,9 +1,11 @@
##### SUMMARY
<!--- Describe the change, including rationale and design decisions -->
<!--- If you are fixing an existing issue, please include "Fixes #nnn" in your
<!---
If you are fixing an existing issue, please include "Fixes #nnn" in your
commit message and your description; but you should still explain what
the change does.-->
the change does.
-->
##### ISSUE TYPE
<!--- Pick one below and delete the rest: -->
@ -13,7 +15,7 @@ the change does.-->
- Docs Pull Request
##### COMPONENT NAME
<!--- Name of the module, plugin, task or feature -->
<!--- Name of the module/plugin/module/task -->
##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes below -->
@ -23,9 +25,11 @@ the change does.-->
##### ADDITIONAL INFORMATION
<!--- Include additional information to help people understand the change here.
<!---
Include additional information to help people understand the change here.
For bugs that don't have a linked bug report, a step-by-step reproduction
of the problem is helpful. -->
of the problem is helpful.
-->
<!--- Paste verbatim command output below, e.g. before and after your change -->
```

41
.gitignore vendored
View File

@ -17,8 +17,6 @@ rpm-build
.idea
#IntelliJ IDEA stuff..
*.iml
#VSCode stuff..
.vscode/
# Mac OS X stuff...
.DS_Store
# manpage build stuff...
@ -29,22 +27,30 @@ docs/man/man3/*
*.sublime-project
*.sublime-workspace
# docsite stuff...
docs/docsite/_build
docs/api/_build/
docs/api/rst/
docs/docsite/*.html
docs/docsite/htmlout
docs/docsite/rst/cli/ansible-*.rst
docs/docsite/rst/cli/ansible.rst
docs/docsite/rst/modules/*.rst
docs/docsite/rst/playbooks_directives.rst
docs/docsite/rst/plugins_by_category.rst
docs/docsite/rst/plugins/*/*.rst
docs/docsite/rst/reference_appendices/config.rst
docs/docsite/rst/reference_appendices/playbooks_keywords.rst
docs/docsite/rst_warnings
docs/docsite/searchindex.js
docs/docsite/_build
docs/docsite/_static/*.gif
docs/docsite/_static/*.png
docs/docsite/_static/websupport.js
docs/docsite/htmlout
docs/docsite/searchindex.js
docs/docsite/rst_warnings
docs/docsite/rst/*_module.rst
docs/docsite/rst/ansible.rst
docs/docsite/rst/ansible-*.rst
docs/docsite/rst/community_maintained.rst
docs/docsite/rst/config.rst
docs/docsite/rst/core_maintained.rst
docs/docsite/rst/list_of_*.rst
docs/docsite/rst/modules_by_category.rst
docs/docsite/rst/network_maintained.rst
docs/docsite/rst/plugins_by_category.rst
docs/docsite/rst/partner_maintained.rst
docs/docsite/rst/playbook_keywords.rst
docs/docsite/rst/playbooks_directives.rst
docs/docsite/rst/plugins/*/*.rst
# deb building stuff...
/debian/
deb-build
@ -55,15 +61,12 @@ credentials.yml
# test output
*.retry
*.out
.pytest_cache/
.tox
.cache
.pytest_cache
results.xml
coverage.xml
/test/units/cover-html
/test/integration/targets/*/backup/
/test/cache/*
# Development
/test/develop
venv
@ -73,7 +76,6 @@ ansible.egg-info/
/shippable/
/test/integration/cloud-config-*.*
!/test/integration/cloud-config-*.*.template
.python-version
# Release directory
packaging/release/ansible_release
/.cache/
@ -89,7 +91,6 @@ packaging/release/ansible_release
/test/integration/inventory.networking
/test/integration/inventory.winrm
/test/integration/cloud-config-aws.yml
/test/integration/cloud-config-cs.ini
# python 'rope' stuff
.ropeproject
# local 'ack' config files
@ -101,5 +102,3 @@ htmlcov/
# ansible-test coverage results
test/units/.coverage.*
/test/integration/cloud-config-azure.yml
/SYMLINK_CACHE.json
changelogs/.plugin-cache.yaml

View File

@ -1,5 +1,5 @@
Michael DeHaan <michael.dehaan@gmail.com> <michael@ansibleworks.com>
Michael DeHaan <michael.dehaan@gmail.com> Michael DeHaan <michael@ansibleworks.com>
Michael DeHaan <michael.dehaan@gmail.com> Michael DeHaan <Michael DeHaan michael@ansibleworks.com>
Michael DeHaan <michael.dehaan@gmail.com> <michael@ansible.com>
<bcoca@ansible.com> <brian.coca+git@gmail.com>
<bcoca@ansible.com> <briancoca+ansible@gmail.com>

3935
CHANGELOG.md Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,316 @@
Coding Guidelines
=================
Hi! Thanks for your interest in contributing to Ansible. We document our Coding Guidelines in the [Developer Guide](https://docs.ansible.com/ansible/devel/dev_guide/). We particularly suggest you review:
Hi! Thanks for interest in contributing to Ansible.
* [Contributing your module to Ansible](https://docs.ansible.com/ansible/devel/dev_guide/developing_modules_checklist.html)
Here are some guidelines for contributing code. The purpose of this document are to establish what we're looking for in code contributions, and to make sure
new contributions know some of the conventions that we've been using.
* [Development conventions, tips and pitfalls](https://docs.ansible.com/ansible/devel/dev_guide/developing_modules_best_practices.html)
We don't think much of this should be too strange to readers familiar with contributing to Python projects, though it helps if we all get on the same page.
Our [Community Guide](https://docs.ansible.com/ansible/devel/community/) may also help you connect with the community of Ansible developers.
Language
========
* While not all components of Ansible must be in Python, core contributions to the Ansible repo must be written in Python. This is to maximize the ability of everyone to contribute.
* If you want to write non-Python ansible modules or inventory scripts, that's fine, but they are not going to get merged in most likely. Sorry!!
PEP 8 and basic style checks
===========================
* [PEP 8](https://www.python.org/dev/peps/pep-0008/) is a great Python style guide, which you should read.
* PEP 8 must not be strictly followed in all aspects, but most of it is good advice
* In particular, we don't really care about line lengths. Buy a bigger monitor!
* To run checks for things we care about, use [ansible-test](http://docs.ansible.com/ansible/dev_guide/testing_pep8.html#running-locally).
* Similarly, additional checks can be made with "make pyflakes"
* There is no need to submit code changes for PEP 8 and pyflakes fixes, as these break attribution history. Project leadership will make these periodically.
* Do not submit pull requests that simply adjust whitespace in the code
Testing
=======
* Much of ansible's testing needs are in integration, not unit tests. Add module tests there.
* That being said, there are unit tests too!
* Code written must absolutely pass tests (i.e. "make tests")
* You should anticipate any error paths in your code and test down those error paths.
* Additions to tests for core code is welcome, but not always possible. Be sure things are at least well tested manually in that case.
Whitespace
==========
* Four space indent is strictly required
* Include meaningful whitespace between lines of code
Shebang Lines
=============
* /usr/bin/scripts should start with '/usr/bin/env python'
* module code should still use '/usr/bin/python' as this is replaced automatically by 'ansible_python_interpreter', see the FAQ in the docs for more info.
Comments
========
* Readability is one of the most important goals for this project
* Comment any non-trivial code where someone might not know why you are doing something in a particular way
* Though if something should be commented, that's often a sign someone should write a function
* All new functions must have a basic docstring comment
* Commenting above a line is preferable to commenting at the end of a line
Classes
=======
* With the exception of module code (where inline is better), it is desirable to see classes in their own files.
* Classes should generally not cause side effects as soon as they are instantiated, move meaningful behavior to methods rather than constructors.
Functions and Methods
=====================
* In general, functions should not be 'too long' and should describe a meaningful amount of work
* When code gets too nested, that's usually the sign the loop body could benefit from being a function
* Parts of our existing code are not the best examples of this at times.
* Functions should have names that describe what they do, along with docstrings
* Functions should be named with_underscores
* "Don't repeat yourself" is generally a good philosophy
Variables
=========
* Use descriptive variable names instead of variables like 'x', unless x is a obvious loop index
* Ansible python code uses identifiers like 'ClassesLikeThis and variables_like_this
* Module parameters should also use_underscores and not runtogether
Module Security
===============
* Modules must take steps to avoid passing user input from the shell and always check return codes
* always use module.run_command instead of subprocess or Popen or os.system -- this is mandatory
* if you use need the shell you must pass use_unsafe_shell=True to module.run_command
* if you do not need the shell, avoid using the shell
* any variables that can come from the user input with use_unsafe_shell=True must be wrapped by pipes.quote(x)
* downloads of https:// resource urls must import module_utils.urls and use the fetch_url method
Misc Preferences
================
Use the dict constructor where possible when allocating dictionaries:
# not this:
foo = {
'a' : 12,
'b' : 34
}
# this:
foo = dict(
a=12,
b=34,
)
Do not line up variables
# not this
a = 12
foosball = 34
xyz = 'dog'
# this
a = 12
foosball = 34
xyz = 'dog'
Don't use line continuations:
# no
if (this_is_a_very_long_line and foo and \
i_am_going_to_continue_it):
bar()
# better:
if (this_is_a_very_long_line and foo and i_am_going_to_continue_it):
bar()
Spacing:
# no
x = [1,2,3]
# no
x = [ 1, 2, 3 ]
# yes
x = [1, 2, 3]
Spacing continued:
# no
x=foo(12)
# no
x = foo( 12 )
# yes
x = foo(12)
Licenses
========
Every file should have a license header, including the copyright of the original author. Major additions to the module are allowed
to add an additional copyright line, and this is especially true of rewrites, but original authorship copyright messages should be preserved.
All contributions to the core repo should preserve original licenses and new contributions must include the GPLv3 header.
Module Documentation
====================
All module pull requests must include a DOCUMENTATION docstring (YAML format,
see other modules for examples) as well as an EXAMPLES docstring, which is free form.
When adding new modules, any new parameter must have a "version_added" attribute.
When submitting a new module, the module should have a "version_added" attribute in the
pull request as well, set to the current development version.
Be sure to check grammar and spelling.
It's frequently the case that modules get submitted with YAML that isn't valid,
so you can run "make webdocs" from the checkout to preview your module's documentation.
If it fails to build, take a look at your DOCUMENTATION string
or you might have a Python syntax error in there too.
Python Imports
==============
To make it clear what a module is importing, imports should not be sprinkled throughout the code.
Python Imports should happen at the top of the file, exempting code from module_utils.
When a conditional runtime import is required, do so something like this instead:
HAS_FOO = False
try:
import foo
HAS_FOO = True
except ImportError:
pass
...
if not HAS_FOO:
raise Exception("the foo library is required")
This makes it clear what optional dependencies are but allows this to be deferred until runtime. In the case of module code, the raising of the Exception will be replaced
with a "module.exit_json" call.
Exceptions
==========
In the main body of the code, use typed exceptions where possible:
# not this
raise Exception("panic!")
# this
from ansible import errors
...
raise errors.AnsibleError("panic!")
Similarly, exception checking should be fine grained:
# not this
try:
foo()
except:
bar()
# but this
try:
foo()
except SomeTypedException:
bar()
List Comprehensions
===================
In general list comprehensions are always preferred to map() and filter() calls.
However, they can be abused. Optimize for readability, and avoid nesting them too deeply.
Regexes
=======
There is a time and place for them, but here's an illustrative joke.
"A developer had a problem, and used a regular expression to solve it. Now the developer had two problems".
Often regexes are difficult to maintain, and a trusty call to other string operations can be a great solution, faster,
and more readable.
File Conventions
================
If a piece of code looks for a named YAML file in a directory, it should assume it can take no extension, or an extension of '.yml' or '.yaml'.
This should be true against all code that loads files.
Any code that uses directories should consider the possibility that the directory may be symlink.
New Ansible language parameters
===============================
If adding a new parameter, like 'can_fizzbuzz: True/False' be sure the value of the parameter is templated somewhere in the Runner code, as if anything can be parameterized in Ansible,
there is a user that will try to parameterize it.
String Find
===========
Use 'in':
# not this:
if x.find('foo') != -1:
# this:
if 'foo' in x:
String checks
=============
To test if something is a string, consider that it may be unicode.
# no
if type(x) == str:
# yes
from ansible.module_utils.six import string_types
if isinstance(x, string_types):
Cleverness
==========
Ansible's code is intended to be read by as many people as possible, so we don't particularly encourage clever or heavily idiomatic code.
In particular, metaclasses are probably not appropriate, however entertaining they may be to add.
Git Practices
=============
Pull requests cannot be accepted that contain merge commits.
Always do "git pull --rebase" and "git rebase" vs "git pull" or "git merge".
Always create a new branch for each pull request to avoid intertwingling different features or fixes on the same branch.
Python Version Compliance
=========================
All code in Ansible core must support a minimum version of Python 2.6.
Module code must support a minimum of Python 2.4, with occasional exception for modules that require code that themselves require 2.6 and later.
A quick reminder is that list comprehensions in Python 2.4 are not as fully fleshed out, there are no 'dict' comprehensions, and there is no 'with' statement.
But otherwise it's pretty much all the same.
The End
=======
This was not meant to be a scary document, so we hope it wasn't, but we also hope this helps you write code that is easier to maintain by others in the future.
If you have questions about this document, please ask on the ansible-devel mailing list.
Thank you!

29
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,29 @@
# WELCOME TO ANSIBLE GITHUB
Hi! Nice to see you here!
## QUESTIONS ?
Please see the [community page](http://docs.ansible.com/community.html) for information on how to ask questions on the [mailing lists](http://docs.ansible.com/community.html#mailing-list-information) and IRC.
The GitHub issue tracker is not the best place for questions for various reasons, but both IRC and the mailing list are very helpful places for those things, as the community page explains best.
## CONTRIBUTING ?
Please see the [community page](http://docs.ansible.com/community.html) for information regarding the contribution process. Important license agreement information is also included on that page.
## BUG TO REPORT ?
First and foremost, also check the [community page](http://docs.ansible.com/community.html).
You can report bugs or make enhancement requests at the [Ansible GitHub issue page](http://github.com/ansible/ansible/issues/new) by filling out the issue template that will be presented.
Also please make sure you are testing on the latest released version of Ansible or the development branch. You can find the latest releases and development branch at:
- https://github.com/ansible/ansible/releases
- https://github.com/ansible/ansible/archive/devel.tar.gz
Thanks!

View File

@ -1,25 +1,21 @@
include README.rst
include COPYING
prune ticket_stubs
prune hacking
include README.md COPYING
include SYMLINK_CACHE.json
include requirements.txt
include .coveragerc
include shippable.yml
include tox.ini
include bin/ansible-test
include .yamllint
include examples/hosts
include examples/ansible.cfg
include examples/scripts/ConfigureRemotingForAnsible.ps1
include examples/scripts/upgrade_to_ps3.ps1
recursive-include lib/ansible/executor/powershell *
recursive-include lib/ansible/module_utils/powershell *
recursive-include lib/ansible/modules *
recursive-include lib/ansible/galaxy/data *
recursive-include docs *
recursive-include licenses *
recursive-include packaging *
recursive-include test *
include Makefile
include VERSION
include MANIFEST.in
include changelogs/CHANGELOG*.rst
include CHANGELOG.md
include contrib/README.md
recursive-include contrib/inventory *

View File

@ -1,5 +1,70 @@
# Module Maintainer Guidelines
The Ansible Module Maintainer Guidelines can now be found in the [official Ansible community guide](https://docs.ansible.com/ansible/latest/community/maintainers.html).
Thank you for being a maintainer of one Ansible's community modules! This guide provides module maintainers an overview of their responsibilities, resources for additional information, and links to helpful tools.
See also the [Developers Guide](https://docs.ansible.com/ansible/latest/dev_guide/)
In addition to the information below, module maintainers should be familiar with:
* General Ansible community development practices (http://docs.ansible.com/ansible/community.html)
* Documentation on module development (http://docs.ansible.com/ansible/developing_modules.html)
* Any namespace-specific module guidelines (identified as GUIDELINES.md in the appropriate file tree).
***
# Maintainer Responsibilities
When you contribute a new module to the [ansible/ansible](https://github.com/ansible/ansible) repository, you become the maintainer for that module once it has been merged. Maintainership empowers you with the authority to accept, reject, or request revisions to pull requests on your module -- but as they say, "with great power comes great responsibility."
Maintainers of Ansible modules are expected to provide feedback, responses, or actions on pull requests or issues to the module(s) they maintain in a reasonably timely manner.
It is also recommended that you occasionally revisit the [contribution guidelines](https://github.com/ansible/ansible/blob/devel/CONTRIBUTING.md), as they are continually refined. Occasionally, you may be requested to update your module to move it closer to the general accepted standard requirements. We hope for this to be infrequent, and will always be a request with a fair amount of lead time (ie: not by tomorrow!).
Finally, following the [ansible-devel](https://groups.google.com/forum/#!forum/ansible-devel) mailing list can be a great way to participate in the broader Ansible community, and a place where you can influence the overall direction, quality, and goals of Ansible and its modules. If you're not on this relatively low-volume list, please join us here: https://groups.google.com/forum/#!forum/ansible-devel
The Ansible community hopes that you will find that maintaining your module is as rewarding for you as having the module is for the wider community.
***
# Pull Requests, Issues, and Workflow
## Pull Requests
Module pull requests are located in the [main Ansible repository](https://github.com/ansible/ansible/pulls).
Because of the high volume of pull requests, notification of PRs to specific modules are routed by an automated bot to the appropriate maintainer for handling. It is recommended that you set an appropriate notification process to receive notifications which mention your GitHub ID.
## Issues
Issues for modules, including bug reports, documentation bug reports, and feature requests, are tracked in the [ansible repository](https://github.com/ansible/ansible/issues).
Issues for modules are routed to their maintainers via an automated process. This process is still being refined, and currently depends upon the issue creator to provide adequate details (specifically, providing the proper module name) in order to route it correctly. If you are a maintainer of a specific module, it is recommended that you periodically search module issues for issues which mention your module's name (or some variation on that name), as well as setting an appropriate notification process for receiving notification of mentions of your GitHub ID.
## PR Workflow
Automated routing of pull requests is handled by a tool called [Ansibullbot](https://github.com/ansible/ansibullbot). (You could say that he moooo-ves things around.)
Being moderately familiar with how the workflow behind the bot operates can be helpful to you, and -- should things go awry -- your feedback can be helpful to the folks that continually help Ansibullbot to evolve.
A detailed explanation of the PR workflow can be seen here: https://github.com/ansible/community/blob/master/PR-FLOW.md
***
# Maintainers list
The full list of maintainers for modules is located here: https://github.com/ansible/ansible/blob/devel/.github/BOTMETA.yml
## Changing Maintainership
Communities change over time, and no one maintains a module forever. If you'd like to propose an additional maintainer for your module, please submit a PR to the maintainers file with the Github username of the new maintainer.
If you'd like to step down as a maintainer, please submit a PR to the maintainers file removing your Github ID from the module in question. If that would leave the module with no maintainers, put "ansible" as the maintainer. This will indicate that the module is temporarily without a maintainer, and the Ansible community team will search for a new maintainer.
***
# Tools and other Resources
## Useful tools
* https://ansible.sivel.net/pr/byfile.html -- a full list of all open Pull Requests, organized by file.
## Other Resources
* Ansibullbot: https://github.com/ansible/ansibullbot
* Triage / pull request workflow and information, including definitions for Labels in GitHub: https://github.com/ansible/community/blob/master/PR-FLOW.md

124
Makefile
View File

@ -9,7 +9,7 @@
# make deb-src -------------- produce a DEB source
# make deb ------------------ produce a DEB
# make docs ----------------- rebuild the manpages (results are checked in)
# make tests ---------------- run the tests (see https://docs.ansible.com/ansible/devel/dev_guide/testing_units.html for requirements)
# make tests ---------------- run the tests (see https://docs.ansible.com/ansible/dev_guide/testing_units.html for requirements)
# make pyflakes, make pep8 -- source code checks
########################################################
@ -17,34 +17,26 @@
NAME = ansible
OS = $(shell uname -s)
PREFIX ?= '/usr/local'
# Manpages are currently built with asciidoc -- would like to move to markdown
# This doesn't evaluate until it's called. The -D argument is the
# directory of the target file ($@), kinda like `dirname`.
MANPAGES ?= $(patsubst %.rst.in,%,$(wildcard ./docs/man/man1/ansible*.1.rst.in))
ifneq ($(shell which rst2man 2>/dev/null),)
ASCII2MAN = rst2man $< $@
else ifneq ($(shell which rst2man.py 2>/dev/null),)
ASCII2MAN = rst2man.py $< $@
MANPAGES ?= $(patsubst %.asciidoc.in,%,$(wildcard ./docs/man/man1/ansible*.1.asciidoc.in))
ifneq ($(shell which a2x 2>/dev/null),)
ASCII2MAN = a2x -L -D $(dir $@) -d manpage -f manpage $<
ASCII2HTMLMAN = a2x -L -D docs/html/man/ -d manpage -f xhtml
else
ASCII2MAN = @echo "ERROR: rst2man from docutils command is not installed but is required to build $(MANPAGES)" && exit 1
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()")
# fetch version from project release.py as single source-of-truth
VERSION := $(shell $(PYTHON) packaging/release/versionhelper/version_helper.py --raw || echo error)
ifeq ($(findstring error,$(VERSION)), error)
$(error "version_helper failed")
endif
MAJOR_VERSION := $(shell $(PYTHON) packaging/release/versionhelper/version_helper.py --majorversion)
CODENAME := $(shell $(PYTHON) packaging/release/versionhelper/version_helper.py --codename)
# if a specific release was not requested, set to 1 (RPMs have "fancier" logic for this further down)
RELEASE ?= 1
# VERSION file provides one place to update the software version
VERSION := $(shell cat VERSION | cut -f1 -d' ')
RELEASE := $(shell cat VERSION | cut -f2 -d' ')
# Get the branch information from git
ifneq ($(shell which git),)
@ -70,16 +62,15 @@ DEBUILD_OPTS = --source-option="-I"
DPUT_BIN ?= dput
DPUT_OPTS ?=
DEB_DATE := $(shell LC_TIME=C date +"%a, %d %b %Y %T %z")
DEB_VERSION ?= $(shell $(PYTHON) packaging/release/versionhelper/version_helper.py --debversion)
ifeq ($(OFFICIAL),yes)
DEB_RELEASE ?= $(shell $(PYTHON) packaging/release/versionhelper/version_helper.py --debrelease)ppa
DEB_RELEASE = $(RELEASE)ppa
# Sign OFFICIAL builds using 'DEBSIGN_KEYID'
# DEBSIGN_KEYID is required when signing
ifneq ($(DEBSIGN_KEYID),)
DEBUILD_OPTS += -k$(DEBSIGN_KEYID)
endif
else
DEB_RELEASE ?= 100.git$(DATE)$(GITINFO)
DEB_RELEASE = 100.git$(DATE)$(GITINFO)
# Do not sign unofficial builds
DEBUILD_OPTS += -uc -us
DPUT_OPTS += -u
@ -99,7 +90,7 @@ PBUILDER_OPTS ?= --debootstrapopts --variant=buildd --architecture $(PBUILDER_AR
RPMSPECDIR= packaging/rpm
RPMSPEC = $(RPMSPECDIR)/ansible.spec
RPMDIST = $(shell rpm --eval '%{?dist}')
RPMRELEASE = $(RELEASE)
ifneq ($(OFFICIAL),yes)
RPMRELEASE = 100.git$(DATE)$(GITINFO)
endif
@ -107,22 +98,14 @@ ifeq ($(PUBLISH),nightly)
# https://fedoraproject.org/wiki/Packaging:Versioning#Snapshots
RPMRELEASE = $(RELEASE).$(DATE)git.$(GIT_HASH)
endif
RPMVERSION ?= $(shell $(PYTHON) packaging/release/versionhelper/version_helper.py --baseversion)
RPMRELEASE ?= $(shell $(PYTHON) packaging/release/versionhelper/version_helper.py --rpmrelease)
RPMNVR = "$(NAME)-$(RPMVERSION)-$(RPMRELEASE)$(RPMDIST)$(REPOTAG)"
RPMNVR = "$(NAME)-$(VERSION)-$(RPMRELEASE)$(RPMDIST)"
# MOCK build parameters
MOCK_BIN ?= mock
MOCK_CFG ?=
# dynamically add repotag define only if specified
ifneq ($(REPOTAG),)
EXTRA_RPM_DEFINES += --define "repotag $(REPOTAG)"
endif
# ansible-test parameters
ANSIBLE_TEST ?= bin/ansible-test
ANSIBLE_TEST ?= test/runner/ansible-test
TEST_FLAGS ?=
# ansible-test units parameters (make test / make test-py3)
@ -158,15 +141,14 @@ integration:
authors:
sh hacking/authors.sh
# Regenerate %.1.rst if %.1.rst.in has been modified more
# recently than %.1.rst.
%.1.rst: %.1.rst.in
# Regenerate %.1.asciidoc if %.1.asciidoc.in has been modified more
# recently than %.1.asciidoc.
%.1.asciidoc: %.1.asciidoc.in
sed "s/%VERSION%/$(VERSION)/" $< > $@
rm $<
# Regenerate %.1 if %.1.rst or release.py has been modified more
# recently than %.1. (Implicitly runs the %.1.rst recipe)
%.1: %.1.rst lib/ansible/release.py
# Regenerate %.1 if %.1.asciidoc or VERSION has been modified more
# recently than %.1. (Implicitly runs the %.1.asciidoc recipe)
%.1: %.1.asciidoc VERSION
$(ASCII2MAN)
.PHONY: loc
@ -195,7 +177,7 @@ clean:
find . -type f \( -name "*.swp" \) -delete
@echo "Cleaning up manpage stuff"
find ./docs/man -type f -name "*.xml" -delete
find ./docs/man -type f -name "*.rst" -delete
find ./docs/man -type f -name "*.asciidoc" -delete
find ./docs/man/man3 -type f -name "*.3" -delete
rm -f ./docs/man/man1/*
@echo "Cleaning up output from test runs"
@ -217,6 +199,7 @@ clean:
rm -f AUTHORS.TXT
@echo "Cleaning up docsite"
$(MAKE) -C docs/docsite clean
$(MAKE) -C docs/api clean
.PHONY: python
python:
@ -226,10 +209,6 @@ python:
install:
$(PYTHON) setup.py install
install_manpages:
gzip -9 $(wildcard ./docs/man/man1/ansible*.1)
cp $(wildcard ./docs/man/man1/ansible*.1.gz) $(PREFIX)/man/man1/
.PHONY: sdist
sdist: clean docs
$(PYTHON) setup.py sdist
@ -238,23 +217,15 @@ sdist: clean docs
sdist_upload: clean docs
$(PYTHON) setup.py sdist upload 2>&1 |tee upload.log
.PHONY: changelog
changelog:
packaging/release/changelogs/changelog.py release -vv && packaging/release/changelogs/changelog.py generate -vv
.PHONY: rpmcommon
rpmcommon: sdist
@mkdir -p rpm-build
@cp dist/*.gz rpm-build/
@cp $(RPMSPEC) rpm-build/$(NAME).spec
@sed -e 's#^Version:.*#Version: $(VERSION)#' -e 's#^Release:.*#Release: $(RPMRELEASE)%{?dist}$(REPOTAG)#' $(RPMSPEC) >rpm-build/$(NAME).spec
.PHONY: mock-srpm
mock-srpm: /etc/mock/$(MOCK_CFG).cfg rpmcommon
$(MOCK_BIN) -r $(MOCK_CFG) $(MOCK_ARGS) --resultdir rpm-build/ --bootstrap-chroot --old-chroot --buildsrpm --spec rpm-build/$(NAME).spec --sources rpm-build/ \
--define "rpmversion $(RPMVERSION)" \
--define "upstream_version $(VERSION)" \
--define "rpmrelease $(RPMRELEASE)" \
$(EXTRA_RPM_DEFINES)
$(MOCK_BIN) -r $(MOCK_CFG) $(MOCK_ARGS) --resultdir rpm-build/ --buildsrpm --spec rpm-build/$(NAME).spec --sources rpm-build/
@echo "#############################################"
@echo "Ansible SRPM is built:"
@echo rpm-build/*.src.rpm
@ -262,11 +233,7 @@ mock-srpm: /etc/mock/$(MOCK_CFG).cfg rpmcommon
.PHONY: mock-rpm
mock-rpm: /etc/mock/$(MOCK_CFG).cfg mock-srpm
$(MOCK_BIN) -r $(MOCK_CFG) $(MOCK_ARGS) --resultdir rpm-build/ --bootstrap-chroot --old-chroot --rebuild rpm-build/$(NAME)-*.src.rpm \
--define "rpmversion $(RPMVERSION)" \
--define "upstream_version $(VERSION)" \
--define "rpmrelease $(RPMRELEASE)" \
$(EXTRA_RPM_DEFINES)
$(MOCK_BIN) -r $(MOCK_CFG) $(MOCK_ARGS) --resultdir rpm-build/ --rebuild rpm-build/$(NAME)-*.src.rpm
@echo "#############################################"
@echo "Ansible RPM is built:"
@echo rpm-build/*.noarch.rpm
@ -280,10 +247,6 @@ srpm: rpmcommon
--define "_srcrpmdir %{_topdir}" \
--define "_specdir $(RPMSPECDIR)" \
--define "_sourcedir %{_topdir}" \
--define "upstream_version $(VERSION)" \
--define "rpmversion $(RPMVERSION)" \
--define "rpmrelease $(RPMRELEASE)" \
$(EXTRA_RPM_DEFINES) \
-bs rpm-build/$(NAME).spec
@rm -f rpm-build/$(NAME).spec
@echo "#############################################"
@ -299,12 +262,8 @@ rpm: rpmcommon
--define "_srcrpmdir %{_topdir}" \
--define "_specdir $(RPMSPECDIR)" \
--define "_sourcedir %{_topdir}" \
--define "_rpmfilename $(RPMNVR).%%{ARCH}.rpm" \
--define "_rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
--define "__python `which $(PYTHON)`" \
--define "upstream_version $(VERSION)" \
--define "rpmversion $(RPMVERSION)" \
--define "rpmrelease $(RPMRELEASE)" \
$(EXTRA_RPM_DEFINES) \
-ba rpm-build/$(NAME).spec
@rm -f rpm-build/$(NAME).spec
@echo "#############################################"
@ -318,7 +277,7 @@ debian: sdist
mkdir -p deb-build/$${DIST} ; \
tar -C deb-build/$${DIST} -xvf dist/$(NAME)-$(VERSION).tar.gz ; \
cp -a packaging/debian deb-build/$${DIST}/$(NAME)-$(VERSION)/ ; \
sed -ie "s|%VERSION%|$(DEB_VERSION)|g;s|%RELEASE%|$(DEB_RELEASE)|;s|%DIST%|$${DIST}|g;s|%DATE%|$(DEB_DATE)|g" deb-build/$${DIST}/$(NAME)-$(VERSION)/debian/changelog ; \
sed -ie "s|%VERSION%|$(VERSION)|g;s|%RELEASE%|$(DEB_RELEASE)|;s|%DIST%|$${DIST}|g;s|%DATE%|$(DEB_DATE)|g" deb-build/$${DIST}/$(NAME)-$(VERSION)/debian/changelog ; \
done
.PHONY: deb
@ -327,12 +286,12 @@ deb: deb-src
PBUILDER_OPTS="$(PBUILDER_OPTS) --distribution $${DIST} --basetgz $(PBUILDER_CACHE_DIR)/$${DIST}-$(PBUILDER_ARCH)-base.tgz --buildresult $(CURDIR)/deb-build/$${DIST}" ; \
$(PBUILDER_BIN) create $${PBUILDER_OPTS} --othermirror "deb http://archive.ubuntu.com/ubuntu $${DIST} universe" ; \
$(PBUILDER_BIN) update $${PBUILDER_OPTS} ; \
$(PBUILDER_BIN) build $${PBUILDER_OPTS} deb-build/$${DIST}/$(NAME)_$(DEB_VERSION)-$(DEB_RELEASE)~$${DIST}.dsc ; \
$(PBUILDER_BIN) build $${PBUILDER_OPTS} deb-build/$${DIST}/$(NAME)_$(VERSION)-$(DEB_RELEASE)~$${DIST}.dsc ; \
done
@echo "#############################################"
@echo "Ansible DEB artifacts:"
@for DIST in $(DEB_DIST) ; do \
echo deb-build/$${DIST}/$(NAME)_$(DEB_VERSION)-$(DEB_RELEASE)~$${DIST}_amd64.changes ; \
echo deb-build/$${DIST}/$(NAME)_$(VERSION)-$(DEB_RELEASE)~$${DIST}_amd64.changes ; \
done
@echo "#############################################"
@ -346,7 +305,7 @@ local_deb: debian
@echo "#############################################"
@echo "Ansible DEB artifacts:"
@for DIST in $(DEB_DIST) ; do \
echo deb-build/$${DIST}/$(NAME)_$(DEB_VERSION)-$(DEB_RELEASE)~$${DIST}_amd64.changes ; \
echo deb-build/$${DIST}/$(NAME)_$(VERSION)-$(DEB_RELEASE)~$${DIST}_amd64.changes ; \
done
@echo "#############################################"
@ -358,42 +317,43 @@ deb-src: debian
@echo "#############################################"
@echo "Ansible DEB artifacts:"
@for DIST in $(DEB_DIST) ; do \
echo deb-build/$${DIST}/$(NAME)_$(DEB_VERSION)-$(DEB_RELEASE)~$${DIST}_source.changes ; \
echo deb-build/$${DIST}/$(NAME)_$(VERSION)-$(DEB_RELEASE)~$${DIST}_source.changes ; \
done
@echo "#############################################"
.PHONY: deb-upload
deb-upload: deb
@for DIST in $(DEB_DIST) ; do \
$(DPUT_BIN) $(DPUT_OPTS) $(DEB_PPA) deb-build/$${DIST}/$(NAME)_$(DEB_VERSION)-$(DEB_RELEASE)~$${DIST}_amd64.changes ; \
$(DPUT_BIN) $(DPUT_OPTS) $(DEB_PPA) deb-build/$${DIST}/$(NAME)_$(VERSION)-$(DEB_RELEASE)~$${DIST}_amd64.changes ; \
done
.PHONY: deb-src-upload
deb-src-upload: deb-src
@for DIST in $(DEB_DIST) ; do \
$(DPUT_BIN) $(DPUT_OPTS) $(DEB_PPA) deb-build/$${DIST}/$(NAME)_$(DEB_VERSION)-$(DEB_RELEASE)~$${DIST}_source.changes ; \
$(DPUT_BIN) $(DPUT_OPTS) $(DEB_PPA) deb-build/$${DIST}/$(NAME)_$(VERSION)-$(DEB_RELEASE)~$${DIST}_source.changes ; \
done
.PHONY: epub
epub:
(cd docs/docsite/; CPUS=$(CPUS) $(MAKE) epub)
(cd docs/docsite/; CPUS=$(CPUS) make epub)
# for arch or gentoo, read instructions in the appropriate 'packaging' subdirectory directory
.PHONY: webdocs
webdocs:
(cd docs/docsite/; CPUS=$(CPUS) $(MAKE) docs)
(cd docs/docsite/; CPUS=$(CPUS) make docs)
.PHONY: generate_rst
generate_rst: lib/ansible/cli/*.py
.PHONY: generate_asciidoc
generate_asciidoc: lib/ansible/cli/*.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_rst
$(MAKE) $(MANPAGES)
docs: generate_asciidoc
make $(MANPAGES)
.PHONY: alldocs
alldocs: docs webdocs
version:
@echo $(VERSION)

56
README.md Normal file
View File

@ -0,0 +1,56 @@
[![PyPI version](https://img.shields.io/pypi/v/ansible.svg)](https://pypi.python.org/pypi/ansible)
[![Build Status](https://api.shippable.com/projects/573f79d02a8192902e20e34b/badge?branch=devel)](https://app.shippable.com/projects/573f79d02a8192902e20e34b)
Ansible
=======
Ansible is a radically simple IT automation system. It handles configuration-management, application deployment, cloud provisioning, ad-hoc task-execution, and multinode orchestration - including trivializing things like zero downtime rolling updates with load balancers.
Read the documentation and more at https://ansible.com/
You can find installation instructions [here](https://docs.ansible.com/ansible/intro_installation.html) for a variety of platforms. Most users should probably install a released version of Ansible from `pip`, a package manager or our [release repository](https://releases.ansible.com/ansible/). [Officially supported](https://www.ansible.com/ansible-engine) builds of Ansible are also available. Some power users run directly from the development branch - while significant efforts are made to ensure that `devel` is reasonably stable, you're more likely to encounter breaking changes when running Ansible this way.
Design Principles
=================
* Have a dead simple setup process and a minimal learning curve
* Manage machines very quickly and in parallel
* Avoid custom-agents and additional open ports, be agentless by leveraging the existing SSH daemon
* Describe infrastructure in a language that is both machine and human friendly
* Focus on security and easy auditability/review/rewriting of content
* Manage new remote machines instantly, without bootstrapping any software
* Allow module development in any dynamic language, not just Python
* Be usable as non-root
* Be the easiest IT automation system to use, ever.
Get Involved
============
* Read [Community Information](https://docs.ansible.com/community.html) for all kinds of ways to contribute to and interact with the project, including mailing list information and how to submit bug reports and code to Ansible.
* All code submissions are done through pull requests. Take care to make sure no merge commits are in the submission, and use `git rebase` vs `git merge` for this reason. If submitting a large code change (other than modules), it's probably a good idea to join ansible-devel and talk about what you would like to do or add first and to avoid duplicate efforts. This not only helps everyone know what's going on, it also helps save time and effort if we decide some changes are needed.
* Users list: [ansible-project](https://groups.google.com/group/ansible-project)
* Development list: [ansible-devel](https://groups.google.com/group/ansible-devel)
* Announcement list: [ansible-announce](https://groups.google.com/group/ansible-announce) - read only
* irc.freenode.net: #ansible
Branch Info
===========
* Releases are named after Led Zeppelin songs. (Releases prior to 2.0 were named after Van Halen songs.)
* The devel branch corresponds to the release actively under development.
* Various release-X.Y branches exist for previous releases.
* We'd love to have your contributions, read [Community Information](https://docs.ansible.com/community.html) for notes on how to get started.
Authors
=======
Ansible was created by [Michael DeHaan](https://github.com/mpdehaan) (michael.dehaan/gmail/com) and has contributions from over 1000 users (and growing). Thanks everyone!
Ansible is sponsored by [Ansible, Inc](https://ansible.com)
License
=======
GNU General Public License v3.0
See [COPYING](COPYING) to see the full text.

View File

@ -1,113 +0,0 @@
|PyPI version| |Docs badge| |Chat badge| |Build Status|
*******
Ansible
*******
Ansible is a radically simple IT automation system. It handles
configuration-management, application deployment, cloud provisioning,
ad-hoc task-execution, and multinode orchestration -- including
trivializing things like zero-downtime rolling updates with load
balancers.
Read the documentation and more at https://ansible.com/
You can find installation instructions
`here <https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html>`_ for a
variety of platforms.
Most users should probably install a released version of Ansible from ``pip``, a package manager or
our `release repository <https://releases.ansible.com/ansible/>`_. `Officially supported
<https://www.ansible.com/ansible-engine>`_ builds of Ansible are also available. Some power users
run directly from the development branch - while significant efforts are made to ensure that
``devel`` is reasonably stable, you're more likely to encounter breaking changes when running
Ansible this way.
Design Principles
=================
* Have a dead simple setup process and a minimal learning curve.
* Manage machines very quickly and in parallel.
* Avoid custom-agents and additional open ports, be agentless by
leveraging the existing SSH daemon.
* Describe infrastructure in a language that is both machine and human
friendly.
* Focus on security and easy auditability/review/rewriting of content.
* Manage new remote machines instantly, without bootstrapping any
software.
* Allow module development in any dynamic language, not just Python.
* Be usable as non-root.
* Be the easiest IT automation system to use, ever.
Get Involved
============
* Read `Community
Information <https://docs.ansible.com/ansible/latest/community>`_ for all
kinds of ways to contribute to and interact with the project,
including mailing list information and how to submit bug reports and
code to Ansible.
* All code submissions are done through pull requests to the ``devel`` branch.
* Feel free to talk to us before making larger changes
to avoid duplicate efforts. This not only helps everyone
know what's going on, it also helps save time and effort if we decide
some changes are needed.
* Users list:
`ansible-project <https://groups.google.com/group/ansible-project>`_
* Development list:
`ansible-devel <https://groups.google.com/group/ansible-devel>`_
* Announcement list:
`ansible-announce <https://groups.google.com/group/ansible-announce>`_
-- read only
* irc.freenode.net: #ansible
* For the full list of Email Lists, IRC channels see the
`Communication page <https://docs.ansible.com/ansible/latest/community/communication.html>`_
Branch Info
===========
* Releases are named after Led Zeppelin songs. (Releases prior to 2.0
were named after Van Halen songs.)
* The ``devel`` branch corresponds to the release actively under
development.
* The ``stable-2.x`` branches exist for current releases.
* Various release-X.Y branches exist for previous releases.
* For information about the active branches see the
`Ansible release and maintenance <https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html>`_ page.
* We'd love to have your contributions, read the `Community
Guide <https://docs.ansible.com/ansible/latest/community>`_ for notes on
how to get started.
Roadmap
=======
Based on team and community feedback, an initial roadmap will be published for a major or minor version (ex: 2.0, 2.1).
Subminor versions will generally not have roadmaps published.
The `Ansible Roadmap page <https://docs.ansible.com/ansible/devel/roadmap/>`_ details what is planned and how to influence the roadmap.
Authors
=======
Ansible was created by `Michael DeHaan <https://github.com/mpdehaan>`_
(michael.dehaan/gmail/com) and has contributions from over 3700 users
(and growing). Thanks everyone!
`Ansible <https://www.ansible.com>`_ is sponsored by `Red Hat, Inc.
<https://www.redhat.com>`_
License
=======
GNU General Public License v3.0
See `COPYING <COPYING>`_ to see the full text.
.. |PyPI version| image:: https://img.shields.io/pypi/v/ansible.svg
:target: https://pypi.org/project/ansible
.. |Docs badge| image:: https://img.shields.io/badge/docs-latest-brightgreen.svg
:target: https://docs.ansible.com/ansible/latest/
.. |Build Status| image:: https://api.shippable.com/projects/573f79d02a8192902e20e34b/badge?branch=devel
:target: https://app.shippable.com/projects/573f79d02a8192902e20e34b
.. |Chat badge| image:: https://img.shields.io/badge/chat-IRC-brightgreen.svg
:target: https://docs.ansible.com/ansible/latest/community/communication.html

84
RELEASES.txt Normal file
View File

@ -0,0 +1,84 @@
Ansible Releases at a Glance
============================
VERSION RELEASE CODE NAME
++++++++++++++++++++++++++++++
2.4.0 TBD "Dancing Days"
2.3.2 2017-08-04 "Ramble On"
2.3.1 2017-06-01 "Ramble On"
2.3.0 2017-04-12 "Ramble On"
2.2.3 2017-05-09 "The Battle of Evermore"
2.2.2 2017-03-27 "The Battle of Evermore"
2.2.1 2017-01-16 "The Battle of Evermore"
2.2.0 2016-11-01 "The Battle of Evermore"
2.1.6 2017-06-01 "The Song Remains the Same"
2.1.5 2017-03-27 "The Song Remains the Same"
2.1.4 2017-01-16 "The Song Remains the Same"
2.1.3 2016-11-04 "The Song Remains the Same"
2.1.2 2016-09-29 "The Song Remains the Same"
2.1.1 2016-07-28 "The Song Remains the Same"
2.1.0 2016-05-25 "The Song Remains the Same"
2.0.2 2016-04-19 "Over the Hills and Far Away"
2.0.1 2016-02-24 "Over the Hills and Far Away"
2.0.0 2016-01-12 "Over the Hills and Far Away"
1.9.6 2016-04-15 "Dancing In the Streets"
1.9.5 2016-03-21 "Dancing In the Streets"
1.9.4 2015-10-09 "Dancing In the Streets"
1.9.3 2015-09-03 "Dancing In the Streets"
1.9.2 2015-06-24 "Dancing In the Streets"
1.9.1 2015-04-27 "Dancing In the Streets"
1.9.0 2015-03-25 "Dancing In the Streets"
1.8.4 2015-02-19 "You Really Got Me"
1.8.3 2015-02-17 "You Really Got Me"
1.8.2 2014-12-04 "You Really Got Me"
1.8.1 2014-11-26 "You Really Got Me"
1.8.0 2014-11-25 "You Really Got Me"
1.7.2 2014-09-24 "Summer Nights"
1.7.1 2014-08-14 "Summer Nights"
1.7.0 2014-08-06 "Summer Nights"
1.6.10 2014-07-25 "The Cradle Will Rock"
1.6.9 2014-07-24 "The Cradle Will Rock"
1.6.8 2014-07-22 "The Cradle Will Rock"
1.6.7 2014-07-21 "The Cradle Will Rock"
1.6.6 2014-07-01 "The Cradle Will Rock"
1.6.5 2014-06-25 "The Cradle Will Rock"
1.6.4 2014-06-25 "The Cradle Will Rock"
1.6.3 2014-06-09 "The Cradle Will Rock"
1.6.2 2014-05-23 "The Cradle Will Rock"
1.6.1 2014-05-07 "The Cradle Will Rock"
1.6.0 2014-05-05 "The Cradle Will Rock"
1.5.5 2014-04-18 "Love Walks In"
1.5.4 2014-04-01 "Love Walks In"
1.5.3 2014-03-13 "Love Walks In"
1.5.2 2014-03-11 "Love Walks In"
1.5.1 2014-03-10 "Love Walks In"
1.5.0 2014-02-28 "Love Walks In"
1.4.5 2014-02-12 "Could This Be Magic?"
1.4.4 2014-01-06 "Could This Be Magic?"
1.4.3 2013-12-20 "Could This Be Magic?"
1.4.2 2013-12-18 "Could This Be Magic?"
1.4.1 2013-11-27 "Could This Be Magic?"
1.4.0 2013-11-21 "Could This Be Magic?"
1.3.4 2013-10-29 "Top of the World"
1.3.3 2013-10-09 "Top of the World"
1.3.2 2013-09-19 "Top of the World"
1.3.1 2013-09-16 "Top of the World"
1.3.0 2013-09-13 "Top of the World"
1.2.3 2013-08-21 "Right Now"
1.2.2 2013-07-05 "Right Now"
1.2.1 2013-07-04 "Right Now"
1.2.0 2013-06-10 "Right Now"
1.1.0 2013-04-02 "Mean Street"
1.0.0 2013-02-01 "Eruption"
0.9.0 2012-11-30 "Dreams"
0.8.0 2012-10-19 "Cathedral"
0.7.0 2012-09-06 "Panama"
0.6.0 2012-08-06 "Cabo"
0.5.0 2012-07-04 "Amsterdam"
0.4.0 2012-05-23 "Unchained"
0.3.0 2012-04-23 "Baluchitherium"
0.2.0 ? "Untitled"
0.1.0 ? "Untitled"
0.0.2 ? "Untitled"
0.0.1 ? "Untitled"

28
ROADMAP.rst Normal file
View File

@ -0,0 +1,28 @@
*******************************
Roadmap For Ansible by Red Hat
*******************************
This document is now the location for published Ansible Core roadmaps.
The roadmap will be updated by version. Based on team and community feedback, an initial roadmap will be published for a major or minor version (2.0, 2.1). Subminor versions will generally not have roadmaps published.
2.1 was the first time Ansible has published this and asked for feedback in this manner. So feedback on the roadmap and the new process is quite welcome. The team is aiming for further transparency and better inclusion of both community desires and submissions.
These roadmaps are the team's *best guess* roadmaps based on the Ansible team's experience and are also based on requests and feedback from the community. There are things that may not make it on due to time constraints, lack of community maintainers, etc. And there may be things that got missed, so each roadmap is published both as an idea of what is upcoming in Ansible, and as a medium for seeking further feedback from the community. Here are the good places for you to submit feedback:
- Add to the agenda of a `Core IRC Meetings <https://github.com/ansible/community/blob/master/meetings/README.md>`_ (preferred)
- Ansible's google-group: ansible-devel
- AnsibleFest conferences.
- IRC freenode channel: #ansible-devel (this one may have things lost in lots of conversation, so a caution).
=======================================
Current 2.4 Roadmap is open for comment
=======================================
We are starting to build the 2.4 Roadmap. We are seeking community feedback! That document is here:
- `2.4 Roadmap Document <docs/docsite/rst/roadmap/ROADMAP_2_4.rst>`_
**Old Roadmaps are found here:**
- `2.3 Roadmap Document <docs/docsite/rst/roadmap/ROADMAP_2_3.rst>`_
- `2.2 Roadmap Document <docs/docsite/rst/roadmap/ROADMAP_2_2.rst>`_
- `2.1 Roadmap Document <docs/docsite/rst/roadmap/ROADMAP_2_1.rst>`_

1
VERSION Normal file
View File

@ -0,0 +1 @@
2.5.0 0.0.devel

2716
ansible-core-sitemap.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -41,15 +41,6 @@ from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError
from ansible.module_utils._text import to_text
# Used for determining if the system is running a new enough python version
# and should only restrict on our documented minimum versions
_PY3_MIN = sys.version_info[:2] >= (3, 5)
_PY2_MIN = (2, 6) <= sys.version_info[:2] < (3,)
_PY_MIN = _PY3_MIN or _PY2_MIN
if not _PY_MIN:
raise SystemExit('ERROR: Ansible requires a minimum of Python2 version 2.6 or Python3 version 3.5. Current version: %s' % ''.join(sys.version.splitlines()))
class LastResort(object):
# OUTPUT OF LAST RESORT
def display(self, msg, log_only=None):
@ -138,26 +129,17 @@ if __name__ == '__main__':
display.error("User interrupted execution")
exit_code = 99
except Exception as e:
if C.DEFAULT_DEBUG:
# Show raw stacktraces in debug mode, It also allow pdb to
# enter post mortem mode.
raise
have_cli_options = cli is not None and cli.options is not None
display.error("Unexpected Exception, this is probably a bug: %s" % to_text(e), wrap_text=False)
if not have_cli_options or have_cli_options and cli.options.verbosity > 2:
log_only = False
if hasattr(e, 'orig_exc'):
display.vvv('\nexception type: %s' % to_text(type(e.orig_exc)))
why = to_text(e.orig_exc)
if to_text(e) != why:
display.vvv('\noriginal msg: %s' % why)
else:
display.display("to see the full traceback, use -vvv")
log_only = True
display.display(u"the full traceback was:\n\n%s" % to_text(traceback.format_exc()), log_only=log_only)
exit_code = 250
finally:
# Remove ansible tmpdir
# Remove ansible tempdir
shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)
sys.exit(exit_code)

View File

@ -1,6 +1,23 @@
#!/usr/bin/env python
# Copyright: (c) 2017, Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
# (c) 2017, Ansible, Inc. <support@ansible.com>
#
# 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/>.
########################################################
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
@ -12,312 +29,361 @@ except Exception:
pass
import fcntl
import hashlib
import os
import shlex
import signal
import socket
import sys
import time
import traceback
import datetime
import errno
import json
from contextlib import contextmanager
from ansible import constants as C
from ansible.module_utils._text import to_bytes, to_text
from ansible.module_utils._text import to_bytes, to_native, to_text
from ansible.module_utils.six import PY3
from ansible.module_utils.six.moves import cPickle, StringIO
from ansible.module_utils.connection import Connection, ConnectionError, send_data, recv_data
from ansible.module_utils.service import fork_process
from ansible.module_utils.six.moves import cPickle
from ansible.module_utils.connection import send_data, recv_data
from ansible.playbook.play_context import PlayContext
from ansible.plugins.loader import connection_loader
from ansible.utils.path import unfrackpath, makedirs_safe
from ansible.errors import AnsibleConnectionFailure
from ansible.utils.display import Display
from ansible.utils.jsonrpc import JsonRpcServer
def read_stream(byte_stream):
size = int(byte_stream.readline().strip())
data = byte_stream.read(size)
if len(data) < size:
raise Exception("EOF found before data was complete")
data_hash = to_text(byte_stream.readline().strip())
if data_hash != hashlib.sha1(data).hexdigest():
raise Exception("Read {0} bytes, but data did not match checksum".format(size))
# restore escaped loose \r characters
data = data.replace(br'\r', b'\r')
return data
@contextmanager
def file_lock(lock_path):
"""
Uses contextmanager to create and release a file lock based on the
given path. This allows us to create locks using `with file_lock()`
to prevent deadlocks related to failure to unlock properly.
"""
lock_fd = os.open(lock_path, os.O_RDWR | os.O_CREAT, 0o600)
fcntl.lockf(lock_fd, fcntl.LOCK_EX)
yield
fcntl.lockf(lock_fd, fcntl.LOCK_UN)
os.close(lock_fd)
class ConnectionProcess(object):
def do_fork():
'''
The connection process wraps around a Connection object that manages
the connection to a remote device that persists over the playbook
Does the required double fork for a daemon process. Based on
http://code.activestate.com/recipes/66012-fork-a-daemon-process-on-unix/
'''
def __init__(self, fd, play_context, socket_path, original_path, ansible_playbook_pid=None):
self.play_context = play_context
self.socket_path = socket_path
self.original_path = original_path
try:
pid = os.fork()
if pid > 0:
return pid
# This is done as a 'good practice' for daemons, but we need to keep the cwd
# leaving it here as a note that we KNOW its good practice but are not doing it on purpose.
# os.chdir("/")
os.setsid()
os.umask(0)
self.fd = fd
self.exception = None
self.srv = JsonRpcServer()
self.sock = None
self.connection = None
self._ansible_playbook_pid = ansible_playbook_pid
def start(self, variables):
try:
messages = list()
result = {}
pid = os.fork()
if pid > 0:
sys.exit(0)
messages.append('control socket path is %s' % self.socket_path)
if C.DEFAULT_LOG_PATH != '':
out_file = open(C.DEFAULT_LOG_PATH, 'ab+')
err_file = open(C.DEFAULT_LOG_PATH, 'ab+', 0)
else:
out_file = open('/dev/null', 'ab+')
err_file = open('/dev/null', 'ab+', 0)
# If this is a relative path (~ gets expanded later) then plug the
# key's path on to the directory we originally came from, so we can
# find it now that our cwd is /
if self.play_context.private_key_file and self.play_context.private_key_file[0] not in '~/':
self.play_context.private_key_file = os.path.join(self.original_path, self.play_context.private_key_file)
self.connection = connection_loader.get(self.play_context.connection, self.play_context, '/dev/null',
ansible_playbook_pid=self._ansible_playbook_pid)
self.connection.set_options(var_options=variables)
self.connection._connect()
os.dup2(out_file.fileno(), sys.stdout.fileno())
os.dup2(err_file.fileno(), sys.stderr.fileno())
os.close(sys.stdin.fileno())
self.connection._socket_path = self.socket_path
self.srv.register(self.connection)
messages.extend(sys.stdout.getvalue().splitlines())
messages.append('connection to remote device started successfully')
return pid
except OSError as e:
sys.exit(1)
except OSError as e:
sys.exit(1)
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.sock.bind(self.socket_path)
self.sock.listen(1)
messages.append('local domain socket listeners started successfully')
except Exception as exc:
result['error'] = to_text(exc)
result['exception'] = traceback.format_exc()
finally:
result['messages'] = messages
self.fd.write(json.dumps(result))
self.fd.close()
class Server():
def __init__(self, socket_path, play_context):
self.socket_path = socket_path
self.play_context = play_context
display.display(
'creating new control socket for host %s:%s as user %s' %
(play_context.remote_addr, play_context.port, play_context.remote_user),
log_only=True
)
display.display('control socket path is %s' % socket_path, log_only=True)
display.display('current working directory is %s' % os.getcwd(), log_only=True)
self._start_time = datetime.datetime.now()
display.display("using connection plugin %s" % self.play_context.connection, log_only=True)
self.connection = connection_loader.get(play_context.connection, play_context, sys.stdin)
self.connection._connect()
if not self.connection.connected:
raise AnsibleConnectionFailure('unable to connect to remote host %s' % self._play_context.remote_addr)
connection_time = datetime.datetime.now() - self._start_time
display.display('connection established to %s in %s' % (play_context.remote_addr, connection_time), log_only=True)
self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.socket.bind(self.socket_path)
self.socket.listen(1)
display.display('local socket is set to listening', log_only=True)
def run(self):
try:
while self.connection.connected:
while True:
signal.signal(signal.SIGALRM, self.connect_timeout)
signal.signal(signal.SIGTERM, self.handler)
signal.alarm(self.connection.get_option('persistent_connect_timeout'))
signal.alarm(C.PERSISTENT_CONNECT_TIMEOUT)
self.exception = None
(s, addr) = self.sock.accept()
(s, addr) = self.socket.accept()
display.display('incoming request accepted on persistent socket', log_only=True)
signal.alarm(0)
signal.signal(signal.SIGALRM, self.command_timeout)
while True:
data = recv_data(s)
if not data:
break
signal.alarm(self.connection.get_option('persistent_command_timeout'))
resp = self.srv.handle_request(data)
signal.signal(signal.SIGALRM, self.command_timeout)
signal.alarm(self.play_context.timeout)
op = to_text(data.split(b':')[0])
display.display('socket operation is %s' % op, log_only=True)
method = getattr(self, 'do_%s' % op, None)
rc = 255
stdout = stderr = ''
if not method:
stderr = 'Invalid action specified'
else:
rc, stdout, stderr = method(data)
signal.alarm(0)
send_data(s, to_bytes(resp))
display.display('socket operation completed with rc %s' % rc, log_only=True)
send_data(s, to_bytes(rc))
send_data(s, to_bytes(stdout))
send_data(s, to_bytes(stderr))
s.close()
except Exception as e:
# socket.accept() will raise EINTR if the socket.close() is called
if hasattr(e, 'errno'):
if e.errno != errno.EINTR:
self.exception = traceback.format_exc()
else:
self.exception = traceback.format_exc()
if e.errno != errno.EINTR:
display.display(traceback.format_exc(), log_only=True)
finally:
# allow time for any exception msg send over socket to receive at other end before shutting down
time.sleep(0.1)
# when done, close the connection properly and cleanup the socket file so it can be recreated
# when done, close the connection properly and cleanup
# the socket file so it can be recreated
self.shutdown()
end_time = datetime.datetime.now()
delta = end_time - self._start_time
display.display('shutdown local socket, connection was active for %s secs' % delta, log_only=True)
def connect_timeout(self, signum, frame):
msg = 'persistent connection idle timeout triggered, timeout value is %s secs.\nSee the timeout setting options in the Network Debug and ' \
'Troubleshooting Guide.' % self.connection.get_option('persistent_connect_timeout')
display.display(msg, log_only=True)
raise Exception(msg)
display.display('persistent connection idle timeout triggered, timeout value is %s secs' % C.PERSISTENT_CONNECT_TIMEOUT, log_only=True)
self.shutdown()
def command_timeout(self, signum, frame):
msg = 'command timeout triggered, timeout value is %s secs.\nSee the timeout setting options in the Network Debug and Troubleshooting Guide.'\
% self.connection.get_option('persistent_command_timeout')
display.display(msg, log_only=True)
raise Exception(msg)
display.display('command timeout triggered, timeout value is %s secs' % self.play_context.timeout, log_only=True)
self.shutdown()
def handler(self, signum, frame):
msg = 'signal handler called with signal %s.' % signum
display.display(msg, log_only=True)
raise Exception(msg)
display.display('signal handler called with signal %s' % signum, log_only=True)
self.shutdown()
def shutdown(self):
""" Shuts down the local domain socket
"""
if os.path.exists(self.socket_path):
try:
if self.sock:
self.sock.close()
if self.connection:
self.connection.close()
except:
pass
finally:
if os.path.exists(self.socket_path):
os.remove(self.socket_path)
setattr(self.connection, '_socket_path', None)
setattr(self.connection, '_connected', False)
display.display('shutdown persistent connection requested', log_only=True)
if not os.path.exists(self.socket_path):
display.display('persistent connection is not active', log_only=True)
return
try:
if self.socket:
display.display('closing local listener', log_only=True)
self.socket.close()
if self.connection:
display.display('closing the connection', log_only=True)
self.connection.close()
except:
pass
finally:
if os.path.exists(self.socket_path):
display.display('removing the local control socket', log_only=True)
os.remove(self.socket_path)
display.display('shutdown complete', log_only=True)
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):
(op, src, dst) = shlex.split(to_native(data))
return self.connection.fetch_file(src, dst)
def do_FETCH(self, data):
(op, src, dst) = shlex.split(to_native(data))
return self.connection.put_file(src, dst)
def do_CONTEXT(self, data):
pc_data = data.split(b'CONTEXT: ', 1)[1]
if PY3:
pc_data = cPickle.loads(pc_data, encoding='bytes')
else:
pc_data = cPickle.loads(pc_data)
pc = PlayContext()
pc.deserialize(pc_data)
try:
self.connection.update_play_context(pc)
except AttributeError:
pass
return (0, 'ok', '')
def do_RUN(self, data):
timeout = self.play_context.timeout
while bool(timeout):
if os.path.exists(self.socket_path):
break
time.sleep(1)
timeout -= 1
socket_bytes = to_bytes(self.socket_path, errors='surrogate_or_strict')
return 0, b'\n#SOCKET_PATH#: %s\n' % socket_bytes, ''
def communicate(sock, data):
send_data(sock, data)
rc = int(recv_data(sock), 10)
stdout = recv_data(sock)
stderr = recv_data(sock)
return (rc, stdout, stderr)
def main():
""" Called to initiate the connect to the remote device
"""
rc = 0
result = {}
messages = list()
socket_path = None
# Need stdin as a byte stream
if PY3:
stdin = sys.stdin.buffer
else:
stdin = sys.stdin
# Note: update the below log capture code after Display.display() is refactored.
saved_stdout = sys.stdout
sys.stdout = StringIO()
try:
# read the play context data via stdin, which means depickling it
vars_data = read_stream(stdin)
init_data = read_stream(stdin)
# FIXME: as noted above, we will probably need to deserialize the
# connection loader here as well at some point, otherwise this
# won't find role- or playbook-based connection plugins
cur_line = stdin.readline()
init_data = b''
while cur_line.strip() != b'#END_INIT#':
if cur_line == b'':
raise Exception("EOF found before init data was complete")
init_data += cur_line
cur_line = stdin.readline()
if PY3:
pc_data = cPickle.loads(init_data, encoding='bytes')
variables = cPickle.loads(vars_data, encoding='bytes')
else:
pc_data = cPickle.loads(init_data)
variables = cPickle.loads(vars_data)
play_context = PlayContext()
play_context.deserialize(pc_data)
display.verbosity = play_context.verbosity
pc = PlayContext()
pc.deserialize(pc_data)
except Exception as e:
rc = 1
result.update({
'error': to_text(e),
'exception': traceback.format_exc()
})
# FIXME: better error message/handling/logging
sys.stderr.write(traceback.format_exc())
sys.exit("FAIL: %s" % e)
if rc == 0:
ssh = connection_loader.get('ssh', class_only=True)
ansible_playbook_pid = sys.argv[1]
cp = ssh._create_control_path(play_context.remote_addr, play_context.port, play_context.remote_user, play_context.connection, ansible_playbook_pid)
ssh = connection_loader.get('ssh', class_only=True)
cp = ssh._create_control_path(pc.remote_addr, pc.port, pc.remote_user, pc.connection)
# create the persistent connection dir if need be and create the paths
# which we will be using later
tmp_path = unfrackpath(C.PERSISTENT_CONTROL_PATH_DIR)
makedirs_safe(tmp_path)
# create the persistent connection dir if need be and create the paths
# which we will be using later
tmp_path = unfrackpath(C.PERSISTENT_CONTROL_PATH_DIR)
makedirs_safe(tmp_path)
lock_path = unfrackpath("%s/.ansible_pc_lock" % tmp_path)
socket_path = unfrackpath(cp % dict(directory=tmp_path))
lock_path = unfrackpath("%s/.ansible_pc_lock_%s" % (tmp_path, play_context.remote_addr))
socket_path = unfrackpath(cp % dict(directory=tmp_path))
# if the socket file doesn't exist, spin up the daemon process
lock_fd = os.open(lock_path, os.O_RDWR | os.O_CREAT, 0o600)
fcntl.lockf(lock_fd, fcntl.LOCK_EX)
with file_lock(lock_path):
if not os.path.exists(socket_path):
messages.append('local domain socket does not exist, starting it')
original_path = os.getcwd()
r, w = os.pipe()
pid = fork_process()
if pid == 0:
try:
os.close(r)
wfd = os.fdopen(w, 'w')
process = ConnectionProcess(wfd, play_context, socket_path, original_path, ansible_playbook_pid)
process.start(variables)
except Exception:
messages.append(traceback.format_exc())
rc = 1
if rc == 0:
process.run()
else:
process.shutdown()
sys.exit(rc)
else:
os.close(w)
rfd = os.fdopen(r, 'r')
data = json.loads(rfd.read())
messages.extend(data.pop('messages'))
result.update(data)
else:
messages.append('found existing local domain socket, using it!')
conn = Connection(socket_path)
conn.set_options(var_options=variables)
pc_data = to_text(init_data)
try:
messages.extend(conn.update_play_context(pc_data))
except Exception as exc:
# Only network_cli has update_play context, so missing this is
# not fatal e.g. netconf
if isinstance(exc, ConnectionError) and getattr(exc, 'code', None) == -32601:
pass
else:
result.update({
'error': to_text(exc),
'exception': traceback.format_exc()
})
messages.append(sys.stdout.getvalue())
result.update({
'messages': messages,
'socket_path': socket_path
})
sys.stdout = saved_stdout
if 'exception' in result:
rc = 1
sys.stderr.write(json.dumps(result))
if not os.path.exists(socket_path):
pid = do_fork()
if pid == 0:
rc = 0
try:
server = Server(socket_path, pc)
except AnsibleConnectionFailure as exc:
display.display('connecting to host %s returned an error' % pc.remote_addr, log_only=True)
display.display(str(exc), log_only=True)
rc = 1
except Exception as exc:
display.display('failed to create control socket for host %s' % pc.remote_addr, log_only=True)
display.display(traceback.format_exc(), log_only=True)
rc = 1
fcntl.lockf(lock_fd, fcntl.LOCK_UN)
os.close(lock_fd)
if rc == 0:
server.run()
sys.exit(rc)
else:
rc = 0
sys.stdout.write(json.dumps(result))
display.display('re-using existing socket for %s@%s:%s' % (pc.remote_user, pc.remote_addr, pc.port), log_only=True)
fcntl.lockf(lock_fd, fcntl.LOCK_UN)
os.close(lock_fd)
timeout = pc.timeout
while bool(timeout):
if os.path.exists(socket_path):
display.vvvv('connected to local socket in %s' % (pc.timeout - timeout), pc.remote_addr)
break
time.sleep(1)
timeout -= 1
else:
raise AnsibleConnectionFailure('timeout waiting for local socket', pc.remote_addr)
# now connect to the daemon process
# FIXME: if the socket file existed but the daemonized process was killed,
# the connection will timeout here. Need to make this more resilient.
while True:
data = stdin.readline()
if data == b'':
break
if data.strip() == b'':
continue
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
connect_retry_timeout = C.PERSISTENT_CONNECT_RETRY_TIMEOUT
while bool(connect_retry_timeout):
try:
sock.connect(socket_path)
break
except socket.error:
time.sleep(1)
connect_retry_timeout -= 1
else:
display.display('connect retry timeout expired, unable to connect to control socket', pc.remote_addr, pc.remote_user, log_only=True)
display.display('persistent_connect_retry_timeout is %s secs' % (C.PERSISTENT_CONNECT_RETRY_TIMEOUT), pc.remote_addr, pc.remote_user, log_only=True)
sys.stderr.write('failed to connect to control socket')
sys.exit(255)
# send the play_context back into the connection so the connection
# can handle any privilege escalation activities
pc_data = b'CONTEXT: %s' % init_data
communicate(sock, pc_data)
rc, stdout, stderr = communicate(sock, data.strip())
sys.stdout.write(to_native(stdout))
sys.stderr.write(to_native(stderr))
sock.close()
break
sys.exit(rc)
if __name__ == '__main__':
display = Display()
main()

View File

@ -1,15 +0,0 @@
#!/usr/bin/env python
# PYTHON_ARGCOMPLETE_OK
"""Primary entry point for ansible-test."""
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
import sys
if __name__ == '__main__':
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)), 'test', 'runner')))
import lib.cli
lib.cli.main()

View File

@ -1,704 +0,0 @@
releases:
2.7.0:
codename: In the Light
fragments:
- v2.7.0_summary.yaml
release_date: '2018-10-03'
2.7.0.a1:
codename: In the Light
fragments:
- 32738-native-jinja-types.yaml
- 42042-inventory_with_no_region.yaml
- 42170-acme-backend-selection.yaml
- 42647-win_updates.yaml
- 42669-add_ssl_zabbix_inventory.yaml
- 43024-nclu-empty-net-commands.yaml
- 43931-strip-trailing-comments.yml
- 44500-win_domain_computer.yaml
- 44508-win_lineinfile.yaml
- 44552-mail-py370-compat.yml
- add_file_lock_feature.yaml
- add_random_mac_filtter.yaml
- admin-users-default-change.yaml
- alternative_facts.yml
- ansiballz_one_interpreter.yml
- ansiballz_streamline_imports.yaml
- any_unparsed_is_failed.yaml
- authorized_key_symlinks.yaml
- avoid_cwd_vars.yml
- aws_caller_facts_add_account_alias.yaml
- aws_core_is_boto3_error_code.yml
- aws_rds_inventory_plugin_added.yaml
- aws_s3_async_fix.yaml
- aws_s3_decryption_fix.yaml
- aws_s3_fix_custom_endpoints.yaml
- basic_booleans_backward_compat.yaml
- batch_mode_elasticsearch_plugin.yaml
- callback_plugin_merge.yml
- clarify_error_message.yml
- cleanup__file__.yaml
- command_shell_check_mode.yaml
- connection_reset.yaml
- console_color.yml
- deepcopy-alternative.yaml
- deprecated-__file__.yaml
- docker-default-ssl.yml
- drop-python-2.6-controller.yaml
- ec2-facts.yaml
- ec2_group_diff_mode_support.yml
- elasticsearch_plugin-showSTDERRonFailure.yaml
- elb_application_lb_fix_state_default.yml
- ensure_text_source.yaml
- env_inject.yml
- file_attributes.yaml
- file_touch_check_mode.yaml
- file_touch_diff.yaml
- fips_md5_import.yaml
- fix-255-exit-code.yaml
- fix-config-from-environment.yaml
- fix-open-url.yml
- fix-os_router.yaml
- fix-selectors-error-condition.yaml
- fix-swap-mount-module.yaml
- fix-world-readable-skip-message.yaml
- fix_no_log_loop.yml
- flatten-better-type-check.yml
- from_yaml_all_filter_plugin.yaml
- galaxy_list_all_roles.yaml
- gce-sort-fix.yaml
- get_url.yaml
- grafana_5_dashboard_compatible.yaml
- hashing-changes.yaml
- ignore_unreachable.yml
- inventory_dir_ext_compare_fix.yaml
- irc_py3_compat.yaml
- lineinfile-empty-regexp.yml
- lxd-idempotent-config.yaml
- mass-remove-deprecated.yaml
- missing_interpreter.yml
- module_defaults_groups.yml
- more-world-readable-warning-skips.yaml
- no_log_fix_for_connection_exceptions.yaml
- password_sanity_check.yml
- passwordstore-lookup-backup.yaml
- pause-stdout-redirection.yaml
- pause-try-except-curses.yaml
- preserve_delegate_nolog.yml
- puppet_debugging_options.yaml
- remote_tmp_de-escalated_user.yaml
- remove-merge-multiple-tags.yaml
- remove-simplejson.yaml
- remove-unused-ansible-remote-temp.yaml
- s3.yaml
- service.yml
- sns_topic_boto3_port.yaml
- syslog_facility-for-journald.yml
- template_output_encoding.yml
- to-nice-json-separators.yaml
- user-freebsd-createhome-name-fix.yaml
- user-module-backup-shadow.yaml
- user_freebsd_always_changed_bugfix.yaml
- v2.7.0-initial-commit.yaml
- v2.7.0a1_summary.yaml
- vars_prompt-allow-prompting-for-play-vars.yaml
- vault-errors.yaml
- vultr_modules_renamed.yml
- win_become_async_older_hosts.yml
- win_chocoalatey_install_tls12.yml
- win_chocolatey-bugfixes.yaml
- win_chocolatey-return-rc-always.yml
- win_domain-dns-typo-fix.yml
- win_domain_controller-netlogon.yaml
- win_iis_webapppool-output-fix.yml
- win_privilege_util.yaml
- win_reboot-fixes.yml
- win_security_policy-empty-value.yaml
- win_updates-async-fix.yml
- win_user-validate-fixes.yaml
- winrm_kinit-remove-pass-log.yml
- wrcwd_ansible.cfg.yml
- yum4_dnf_yum_action_plugin.yml
- zypper-on-ubuntu.yaml
modules:
- aci_interface_policy_ospf
- acme_account_facts
- acme_certificate_revoke
- acme_challenge_cert_helper
- aws_eks_cluster
- azure_rm_appgateway
- azure_rm_appserviceplan
- azure_rm_appserviceplan_facts
- azure_rm_mysqldatabase_facts
- azure_rm_mysqlserver_facts
- azure_rm_postgresqldatabase_facts
- azure_rm_postgresqlserver_facts
- azure_rm_route
- azure_rm_routetable
- azure_rm_routetable_facts
- azure_rm_virtualmachine_facts
- azure_rm_webapp
- bigip_appsvcs_extension
- bigip_cli_alias
- bigip_cli_script
- bigip_device_auth
- bigip_device_facts
- bigip_firewall_dos_profile
- bigip_firewall_policy
- bigip_firewall_rule
- bigip_firewall_rule_list
- bigip_monitor_dns
- bigip_profile_http
- bigip_profile_http_compression
- bigip_profile_oneconnect
- bigip_profile_persistence_src_addr
- bigip_remote_role
- bigip_software_image
- bigip_software_install
- bigip_tunnel
- bigiq_utility_license_assignment
- certificate_complete_chain
- cli_command
- cli_config
- cloudformation_stack_set
- cobbler_sync
- cobbler_system
- cs_disk_offering
- docker_swarm
- docker_swarm_service
- emc_vnx_sg_member
- exos_config
- exos_facts
- gcp_compute_address_facts
- gcp_compute_backend_bucket_facts
- gcp_compute_backend_service_facts
- gcp_compute_disk_facts
- gcp_compute_firewall_facts
- gcp_compute_forwarding_rule_facts
- gcp_compute_global_address_facts
- gcp_compute_global_forwarding_rule_facts
- gcp_compute_health_check_facts
- gcp_compute_http_health_check_facts
- gcp_compute_https_health_check_facts
- gcp_compute_image_facts
- gcp_compute_instance_facts
- gcp_compute_instance_group_facts
- gcp_compute_instance_group_manager_facts
- gcp_compute_instance_template_facts
- gcp_compute_network_facts
- gcp_compute_route_facts
- gcp_compute_router_facts
- gcp_compute_ssl_certificate_facts
- gcp_compute_ssl_policy
- gcp_compute_ssl_policy_facts
- gcp_compute_subnetwork_facts
- gcp_compute_target_http_proxy_facts
- gcp_compute_target_https_proxy_facts
- gcp_compute_target_pool_facts
- gcp_compute_target_ssl_proxy_facts
- gcp_compute_target_tcp_proxy_facts
- gcp_compute_target_vpn_gateway
- gcp_compute_target_vpn_gateway_facts
- gcp_compute_url_map_facts
- gcp_compute_vpn_tunnel
- gcp_compute_vpn_tunnel_facts
- ibm_sa_vol
- ipa_config
- ipa_vault
- java_keystore
- k8s_facts
- meraki_config_template
- meraki_device
- meraki_mr_l3_firewall
- meraki_mx_l3_firewall
- meraki_ssid
- meraki_switchport
- meraki_vlan
- na_elementsw_backup
- na_elementsw_cluster_pair
- na_elementsw_snapshot_schedule
- na_elementsw_vlan
- na_elementsw_volume
- na_elementsw_volume_pair
- na_ontap_cg_snapshot
- na_ontap_dns
- na_ontap_fcp
- na_ontap_snapmirror
- na_ontap_software_update
- na_ontap_svm_options
- na_ontap_vserver_peer
- netcup_dns
- nios_a_record
- nios_cname_record
- nios_mx_record
- nios_naptr_record
- nios_ptr_record
- nios_srv_record
- nios_txt_record
- nos_command
- nos_config
- nos_facts
- nxos_rpm
- onyx_igmp
- openssl_pkcs12
- os_coe_cluster_template
- os_listener
- os_loadbalancer
- os_member
- os_pool
- panos_set
- python_requirements_facts
- reboot
- redfish_facts
- routeros_command
- scaleway_image_facts
- scaleway_ip_facts
- scaleway_organization_facts
- scaleway_security_group_facts
- scaleway_server_facts
- scaleway_snapshot_facts
- scaleway_volume
- scaleway_volume_facts
- slxos_lldp
- tower_inventory_source
- ucs_ntp_server
- ucs_storage_profile
- ucs_timezone
- ucs_uuid_pool
- vmware_about_facts
- vmware_category
- vmware_category_facts
- vmware_deploy_ovf
- vmware_guest_boot_facts
- vmware_guest_boot_manager
- vmware_guest_custom_attribute_defs
- vmware_guest_custom_attributes
- vmware_guest_move
- vmware_host_ssl_facts
- vmware_local_role_facts
- voss_command
- voss_facts
- vultr_block_storage
- vultr_block_storage_facts
- vultr_dns_domain_facts
- vultr_firewall_group_facts
- vultr_network
- vultr_network_facts
- vultr_os_facts
- vultr_plan_facts
- vultr_region_facts
- vultr_server_facts
- vultr_ssh_key_facts
- vultr_startup_script_facts
- vultr_user_facts
- win_chocolatey_config
- win_chocolatey_feature
- win_chocolatey_source
- zabbix_host_facts
plugins:
callback:
- counter_enabled
- logdna
- splunk
connection:
- psrp
inventory:
- tower
lookup:
- cpm_status
- grafana_dashboard
- nios_next_network
release_date: '2018-08-27'
2.7.0b1:
codename: In the Light
fragments:
- blockdoc.yml
- delegate-to-get-vars-no-task.yaml
- gcp_service_account_home_path.yaml
- include-apply-insert-order.yaml
- include-double-handler.yaml
- loop-cache-fix.yaml
- no-dynamic-import-tasks.yaml
- onepassword_unlock_vault.yaml
- plugins-accept-only-valid-args.yaml
- urls-if-modified-since.yaml
- v2.7.0b1_summary.yaml
- win_disk_image-mount-paths.yaml
- win_psexec_command_arg.yaml
- win_psexec_session-selection.yaml
- win_uri-json.yml
- win_wait_for-timeout.yaml
modules:
- azure_rm_autoscale
- azure_rm_autoscale_facts
- azure_rm_containerregistry_facts
- azure_rm_sqlfirewallrule
- azure_rm_trafficmanagerendpoint
- azure_rm_trafficmanagerendpoint_facts
- azure_rm_trafficmanagerprofile
- azure_rm_trafficmanagerprofile_facts
- azure_rm_webapp_facts
- cpm_user
- elb_target_facts
- fmgr_provisioning
- ftd_configuration
- ftd_file_download
- ftd_file_upload
- gcp_compute_router
- gcp_spanner_database
- gcp_spanner_instance
- gcp_sql_database
- gcp_sql_instance
- gcp_sql_user
- ibm_sa_host
- ibm_sa_pool
- na_elementsw_access_group
- na_elementsw_account
- na_elementsw_admin_users
- na_elementsw_check_connections
- na_elementsw_cluster
- na_elementsw_drive
- na_elementsw_ldap
- na_elementsw_network_interfaces
- na_elementsw_node
- na_elementsw_snapshot
- na_elementsw_snapshot_restore
- na_elementsw_volume_clone
- na_ontap_autosupport
- na_ontap_cluster_peer
- na_ontap_command
- na_ontap_disks
- na_ontap_firewall_policy
- na_ontap_gather_facts
- na_ontap_motd
- na_ontap_node
- netapp_e_alerts
- netapp_e_asup
- netapp_e_auditlog
- netapp_e_global
- netapp_e_iscsi_interface
- netapp_e_iscsi_target
- netapp_e_ldap
- netapp_e_mgmt_interface
- netapp_e_syslog
- onepassword_facts
- opx_cps
- purefb_facts
- rds_instance
- redfish_command
- redfish_config
- tower_credential_type
- tower_settings
- tower_workflow_template
- vmware_host_ntp_facts
- win_wait_for_process
- win_xml
plugins:
lookup:
- cpm_metering
release_date: '2018-08-31'
2.7.0rc1:
codename: In the Light
fragments:
- 16748-docker_container-memory.yaml
- 33579-docker_container-log_driver.yaml
- 42380-docker_container-check-mode.yaml
- 42641-44812-docker-env-variables.yaml
- 42857-docker_container-working_dir.yaml
- 44808-docker_container-idempotency.yaml
- aws_bugfix_backports.yml
- cb_fix_config.yml
- dnf-group-removal.yaml
- ec2_vpc_route_table_replace_route_fix.yaml
- elb_target_group_fix_KeyError.yaml
- systemd_user_dep_fixes.yml
- terminal_plugin_nxos_iosxr.yaml
- v2.7.0rc1_summary.yaml
modules:
- online_user_facts
release_date: '2018-09-06'
2.7.0rc2:
codename: In the Light
fragments:
- 45501-get_url-better_checksums.yaml
- aws_cloudfront_distribution_fix_nonexistent_method_name.yaml
- azure-storage-cloud-environment.yaml
- azure_autoscale.yaml
- get-url-fix-idempotency.yaml
- loop_undefined_delegate_to.yaml
- nxos_ambiguous_command_check.yaml
- script-module-no-file-path.yaml
- v2.7.0rc2_summary.yaml
- vmware_wait_for_task_fix.yaml
- win_group_membership-com-marshal.yaml
- win_say-fix.yaml
plugins:
strategy:
- host_pinned
release_date: '2018-09-13'
2.7.0rc3:
codename: In the Light
fragments:
- ec2_group_fix_target_containing_list_within_list.yaml
- fix_nxos_facts_indefinite_hang.yaml
- v2.7.0rc3_summary.yaml
release_date: '2018-09-20'
2.7.0rc4:
codename: In the Light
fragments:
- v2.7.0rc4_summary.yaml
release_date: '2018-09-27'
2.7.1:
codename: In the Light
fragments:
- 33156-vmware_guest-resource_pool.yaml
- 34863-rabbitmq_user_unpack_fix.yaml
- 35120-redis_inventory_plugin_flush_cache.yaml
- 38679-vmware_guest-refactor_disk_logic.yml
- 42322-nmcli_fix_vlan_mod_function.yaml
- 42456-consul_kv-lookup.yaml
- 43997-docker_network-inspect.yaml
- 44755-win_nssm_fixes.yaml
- 45226-vmware_wait_for_ip_address.yaml
- 45417-ldap_entry-list_conversion.yml
- 45508-parse-docker-service-parameter.yaml
- 45543-rabbitmq_bindings-fix-quote.yaml
- 45628-fetch_url-error-headers.yaml
- 45700-docker_container-dont-parse-absent.yml
- 45712-45753-vultr-timeout.yml
- 45830-fixed-assigning-ssl-certificate.yaml
- 45921-os_router-ignores-enable_snat-no.yml
- 46049-route53-caa-ordering.txt
- 46115-46035-cs_instance-fixes.yml
- 46245-systemd-fix-service-enable-logic.yaml
- 46322-docker_container-image-not-given.yaml
- 46521-zabbix_host-fix-link-template-error.yml
- 46594-docker_container-publish-all-ports.yml
- 46595-docker_container-expected_ports.yml
- 46743-fix-native-jinja-newlines.yaml
- 46800-ec2_vol_facts-handle-missing-tags.yml
- 46961_fix_aws_ec2_cache.yaml
- 47046-docker-versions.yaml
- 47096-junos-terminal-regex-fix.yml
- 47109-fail-space-separated-string-pkgs.yaml
- 47133-pamd_use_module_tmpdir.yml
- 47281-pamd-dont-delete-named_temporary_file_on_close.yaml
- 47296-docker_container-memory_swappiness.yaml
- 47307-handler-include-task.yml
- 47395-docker_container-ipvX_address.yaml
- 47396-docker_container-detach-auto-remove.yaml
- 54434-iam-role-arn-parsing.yml
- ajson-nested-decode.yaml
- ansible-connection-cleanup-when-failed.yaml
- ansible-doc-fixes.yml
- aws_parameter_store_pagination.yaml
- azure-version.yaml
- azure_rm_autoscale-fixed_date.yml
- azure_rm_deployment_fix_45941.yaml
- blockinfile-bytes-fix.yaml
- callback_fixes.yml
- cliconf-get-bugfixes.yaml
- dd-put-empty-files.yaml
- delegate_to_loop_hostvars.yaml
- dnf-immutable-mutable.yaml
- dnf-localgpgcheck.yaml
- dnfyum-disable-excludes.yaml
- docker_container-idempotency.yaml
- docker_volume-force-change-detection.yaml
- fix_calling_deprecate_with_correct_arguments.yaml
- fix_ec2_group_target_vpc_precedence.yaml
- fix_flatten.yml
- fix_vyos_version.yaml
- free-strategy-include-var-tags.yaml
- ftd-http-api-plugin-refresh-token.yaml
- get_url-remove-fragile-code.yaml
- inv_fixes.yml
- ios-prompt-fix.yaml
- ip_netns-fix-exists.yaml
- issue46937-pr46519-pr47449-fix-pip-multiple-extras.yaml
- k8s_auth_kubeconfig.yml
- k8s_facts_fix.yaml
- lineinfile-insertbefore-index-out-of-range.yaml
- mail-fix-regression.yaml
- mysql-migrate_to_pymysql.yaml
- netconf_config_comfirm_commit_fix.yaml
- netconf_config_default_operation.yaml
- netconf_module_utils_py3_fix.yaml
- no-mutable-fieldattribute-defaults.yaml
- no-overwrite-roles.yaml
- nxos_file_copy_PY3_fix.yaml
- nxos_ospf_vrf_idempotence.yaml
- openssl-python3.yaml
- ovirt_host_network_check_for_empty_user_opts.yaml
- ovirt_vm__Fix_initialization_of_cloud_init.yaml
- ovirt_vm_check_next_run_configuration_update_if_exist.yaml
- ovirt_vm_fix_issue_in_SSO_option.yaml
- ovirt_vm_fix_issue_in_setting_the_custom_compatibility_version_to_NULL.yaml
- piped-transfer-empty-files.yaml
- plugin-docs-list-fix.yaml
- plugin-filters-cfg.yaml
- postgresql_user-not-sup-error.yaml
- psexec-handle-socket-errors.yaml
- psexec-imp-error.yaml
- psrp-utf8-stdio.yaml
- psrp-utf8.yaml
- reboot-unicode-string.yaml
- reboot-var-fix-bare-linux.yaml
- reboot_missing_parameter.yaml
- reboot_openbsd_support.yaml
- restore_sigpipe_dfl.yml
- solaris-prtdiag-path.yaml
- telent-prompt-fix.yaml
- unsafe-set-wrap.yaml
- user-do-not-pass-ssh_key_passphrase-on-cmdline.yaml
- user-docs-underlying-tools.yaml
- v2.7.1
- win_copy-dest-quote.yaml
- win_reboot-post-reboot-delay.yaml
- winrm_pexpect.yaml
- yum-proxy-userpass.yaml
- yum_bugfux.yml
- yum_bugfux_conf_file_none_type.yml
release_date: '2018-10-25'
2.7.2:
codename: In the Light
fragments:
- 44324-ini_file-options-with-no-section-managed.yaml
- 44988-acme-post-as-get.yaml
- 45151-fix-os-exception.yaml
- 45704-fix-redfish_facts-http-redirect.yaml
- 46148-provide-redfish_facts-gathering-flexibility.yaml
- 46658-plugin_filter-improve_error_handling.yaml
- 46665-plugin_filter_doc_fix.yaml
- 46700-vmware_doc-standalone_esxi.yaml
- 47030-assert-add-success_msg-to-valid-args.yaml
- 47117-vmware_doc-http_api_usage.yaml
- 47300-ios-check_rc.yaml
- 47313-vmware_utils-handle_requests_import_error.yaml
- 47459_grafana_dashboard_consistency_fix.yaml
- 47462-fix-redfish_config-idempotency.yaml
- 47563-vmware_host-refactor_SSL_thumbprint.yaml
- 47608-docker_swarm-advertise_addr.yml
- 47621-bugfix-for-na-ontap-snapmirror.yaml
- 47668-aci_switch_leaf_selector-support_empty_policy_group.yaml
- 47689-yum-fix-version-syntax.yaml
- 47693-fix-argument-spec-for-netapp-modules.yaml
- 47695-pamd-fix-idempotence-and-parsing-issues.yml
- 47711-docker_container-minimal-version-checks.yml
- 47712-docker_container-detach-auto-remove.yml
- 47722-vmware_guest_powerstate-restore_timeout.yaml
- 47889-vmware_doc-fix_privilege_names.yaml
- 47900-docker_container-paused.yml
- 47920-vmware_guest-handle_no_root_snapshot.yaml
- 47938-docker_swarm_service-requirements.yaml
- 47997-docker_container-ipc-pid-mode.yml
- 48009-ldap_attr-list.yml
- 48036-vultr-fix-empty-list-handling.yaml
- 48061-docker_container-auto_removal.yml
- 48148_net_put_cleanup.yaml
- 48317-do-not-auto-reboot-with-redfish_config-bios-changes
- 48341-ebs-optimized-ec2-instance.yaml
- 48342-vultr_server_facts-fix-firewall-group.yml
- 48474-k8s-module-docs-update.yaml
- 48536-docker_volume-labels.yml
- 48551-docker_container-idempotency.yml
- 48590-docker_container-unpause-stop.yml
- aci_access_port_to_interface_policy_leaf_profile-missing_policy_group.yaml
- aci_interface_policy_leaf_policy_group-missing_aep.yaml
- django_manage_status.yaml
- fix-password-lookup-on-fips.yaml
- galaxy-metea-yaml-extension.yaml
- loop-cache-include-apply.yml
- lvg_fix_47301.yaml
- nxos_evpn_vni_check_mode.yaml
- nxos_facts_trailing_comma.yaml
- nxos_install_os_force_disruptive.yaml
- os_router_enable_snat_fix.yaml
- ovirt_host_network_fix_type_conversion.yaml
- ovirt_host_pm_bug_fixes_for_power_management.yaml
- pip-fix-idempotence-in-check-mode.yaml
- reboot-change-default-boot-command.yaml
- remove_redundant_md5.yml
- tls_mail.yml
- uri-supports-async.yaml
- user-fix-zero-negative-expiration.yaml
- user-password_lock-change-fix.yaml
- user-restore-disabled-account.yaml
- v2.7.2_summary.yaml
- win_uri-junk-data.yaml
- yum-handle-obsoletes-check-update.yaml
- yumdnf-autoremove.yaml
release_date: '2018-11-15'
2.7.3:
codename: In the Light
fragments:
- 15732-wait_for-documentation_fix.yaml
- 46044-puppet-puppet6-fix.yaml
- 47198-fix-setuptools-distutils.yaml
- 47747-ftd-http-api-fixes.yaml
- 48580-apt_key-no-tty.yaml
- 48673-fix-omit-on-play-keywords.yaml
- 48675-cs_template-fix-keyerror-state-extracted.yml
- 48809-sysvinit_defaults_if_no_runlevels.yaml
- 48836-proxymox_kvm-dictionary.yaml
- 49078-docker_container-min-version-fix.yml
- cfg_mgr_fix.yml
- deal_with_bad_config_types.yml
- dnf-modularity.yaml
- docker_network-driver_options.yaml
- ec2_group-rule-purge-fix.yaml
- ps_sb_logging.yaml
- v2.7.3_summary.yaml
- win_security_policy-rights.yaml
release_date: '2018-11-29'
2.7.4:
codename: In the Light
fragments:
- powershell-bootstrap.yaml
- v2.7.4_summary.yaml
release_date: '2018-11-30'
2.7.5:
codename: In the Light
fragments:
- 33239-sensu-expire-cast-int.yaml
- 45122-fix-unarchive-excluded_files.yaml
- 45155-vmware-handle_exception.yaml
- 45155-vmware_host_service_facts-update_docs.yaml
- 46604-ontap-cifs-server-no-log-password.yaml
- 46740-gcp-utils-credentials-scoping.yaml
- 47019-mail-fix-py27-regression.yaml
- 47313-vmware-fix_module_error.yaml
- 48728-win_nssm-credential-quoting.yml
- 48730-zabbix_hostmacro-fixes.yml
- 48792-templar-fix-AttributeError.yml
- 48950-vault-encrypted-data-native-jinja.yaml
- 49096-ansible-galaxy-fix_info_typo.yaml
- 49113-iam-role-arn-parsing-updated.yml
- 49123-backport-devuan-support.yml
- 49212-require-git-ansible-galaxy.yaml
- 49235-docker_swarm_service-user-default.yaml
- 49266-acme-error-messages.yml
- 49299-openshift-inventory-plugin-empty-pods-and-serialization.yaml
- 49394_azure_image.yml
- 49407-acme-disabled-accounts.yml
- 49474-network_utils_dict_merge_fix.yaml
- 49553-aci_rest-fix-ignoring-custom-port.yaml
- avoid_ssh_retry_discolsures.yml
- azure_rm_subnet_route_table.yaml
- clear_system_variablse.yml
- detect_interpreter_stdout.yml
- dnf-fix-plugin-loading.yaml
- docker-swarm-min-ver.yaml
- iosxr_netconf_plugin_fix.yaml
- jinja2_native-fallback-warning.yaml
- nxos_facts_multiple_bugfixes.yaml
- nxos_install_os_nxapi_fix.yaml
- nxos_interface_linkagg_idempotence.yaml
- openstack-fixes-for-2.7.5.yaml
- ovirt_storage_connection_password-comparison.yaml
- parimko_ssh-log-message.yaml
- reboot-fix-exception-type.yaml
- redis-3-compat.yaml
- squash-deprecation-message.yml
- v2.7.5_summary.yaml
- vm_fix.yml
release_date: '2018-12-13'

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +0,0 @@
Placeholder changelog
=====================
This file is a placeholder; a version-specific ``CHANGELOG-vX.Y.rst`` will be generated during releases from fragments
under changelogs/fragments. On release branches once a release has been created, consult the branch's version-specific
file for changes that have occurred in that branch.

View File

@ -1,13 +0,0 @@
---
release_tag_re: '(v(?:[\d.ab\-]|rc)+)'
pre_release_tag_re: '(?P<pre_release>(?:[ab]|rc)+\d*)$'
notesdir: fragments
prelude_section_name: release_summary
new_plugins_after_name: removed_features
sections:
- ['major_changes', 'Major Changes']
- ['minor_changes', 'Minor Changes']
- ['deprecated_features', 'Deprecated Features']
- ['removed_features', 'Removed Features (previously deprecated)']
- ['bugfixes', 'Bugfixes']
- ['known_issues', 'Known Issues']

View File

@ -1,2 +0,0 @@
minor_changes:
- Document Path and Port are mutually exclusive parameters in wait_for module.

View File

@ -1,5 +0,0 @@
bugfixes:
- "docker_container: makes unit parsing for memory sizes more consistent, and
fixes idempotency problem when ``kernel_memory`` is set (see
https://github.com/ansible/ansible/pull/16748 and
https://github.com/ansible/ansible/issues/42692)"

View File

@ -1,2 +0,0 @@
major_changes:
- Allow config to enable native jinja types (https://github.com/ansible/ansible/pull/32738)

View File

@ -1,2 +0,0 @@
bugfixes:
- Rewrite get_resource_pool method for correct resource_pool selection.

View File

@ -1,2 +0,0 @@
bugfixes:
- sensu_silence - Cast int for expire field to avoid call failure to sensu API.

View File

@ -1,2 +0,0 @@
bugfixes:
- "Allow arbitrary ``log_driver`` for docker_container (https://github.com/ansible/ansible/pull/33579)."

View File

@ -1,2 +0,0 @@
bugfixes:
- Ignore empty result of rabbitmqctl list_user_permissions.

View File

@ -1,2 +0,0 @@
bugfixes:
- Only delete host key from redis in-memory cache if present.

View File

@ -1,2 +0,0 @@
bugfixes:
- Refactor virtual machine disk logic.

View File

@ -1,2 +0,0 @@
bugfixes:
- plugins/inventory/openstack.py - Do not create group with empty name if region is not set

View File

@ -1,8 +0,0 @@
---
minor_changes:
- "The acme_account and acme_certificate modules now support two backends:
the Python cryptograpy module or the OpenSSL binary. By default, the
modules detect if a new enough cryptography module is available and
use it, with the OpenSSL binary being a fallback. If the detection
fails for some reason, the OpenSSL binary backend can be explicitly
selected by setting select_crypto_backend to openssl."

View File

@ -1,2 +0,0 @@
bugfixes:
- "nmcli - fix syntax of vlan modification command (https://github.com/ansible/ansible/issues/42322)"

View File

@ -1,2 +0,0 @@
bugfixes:
- "fixes docker_container check and debug mode (https://github.com/ansible/ansible/pull/42380)"

View File

@ -1,3 +0,0 @@
minor_changes:
- added capability to set the scheme for the consul_kv lookup.
- added optional certificate and certificate verification for consul_kv lookups

View File

@ -1,2 +0,0 @@
bugfixes:
- "The docker_* modules respect the DOCKER_* environment variables again (https://github.com/ansible/ansible/pull/42641)."

View File

@ -1,2 +0,0 @@
bugfixes:
- win_updates - fixed module return value is lost in error in some cases (https://github.com/ansible/ansible/pull/42647)

View File

@ -1,4 +0,0 @@
---
minor_changes:
- Added capability to skip ssl verification
on zabbix host with dynamic inventory

View File

@ -1,2 +0,0 @@
bugfixes:
- "docker_container: fixing ``working_dir`` idempotency problem (https://github.com/ansible/ansible/pull/42857)"

View File

@ -1,2 +0,0 @@
bugfixes:
- nclu - no longer runs net on empty lines in templates (https://github.com/ansible/ansible/pull/43024)

View File

@ -1,2 +0,0 @@
bugfixes:
- user - Strip trailing comments in /etc/default/passwd (https://github.com/ansible/ansible/pull/43931)

View File

@ -1,2 +0,0 @@
bugfixes:
- "docker_network - fixes idempotency issues (https://github.com/ansible/ansible/issues/33045) and name substring issue (https://github.com/ansible/ansible/issues/32926)."

View File

@ -1,4 +0,0 @@
---
bugfixes:
- "ini_file: Options within no sections aren't included, deleted or modified. These are just unmanged. This pull request solves this.
(see https://github.com/ansible/ansible/pull/44324)"

View File

@ -1,2 +0,0 @@
bugfixes:
- win_domain_computer - fixed deletion of computer active directory object that have dependent objects (https://github.com/ansible/ansible/pull/44500)

View File

@ -1,2 +0,0 @@
bugfixes:
- win_lineinfile - changed `-Path` to `-LiteralPath` so that square brackes in the path are interpreted literally - https://github.com/ansible/ansible/issues/44508

View File

@ -1,2 +0,0 @@
bugfixes:
- fix mail module for python 3.7.0 (https://github.com/ansible/ansible/pull/44552)

View File

@ -1,10 +0,0 @@
bugfixes:
- win_nssm - Fix several issues and idempotency problems (https://github.com/ansible/ansible/pull/44755)
- win_nssm - Fix service not started when ``state=started`` (https://github.com/ansible/ansible/issues/35442)
- win_nssm - Correctly escape argument line when a parameter contains spaces, quotes or backslashes
- win_nssm - Add missing space between parameters with ``app_parameters``
- win_nssm - Fix extra space added in argument line with ``app_parameters`` or ``app_parameters_free_form`` when a parameter start by a dash and is followed by a period (https://github.com/ansible/ansible/issues/44079)
- win_nssm - Fix error when several services were given to the ``dependencies`` option
minor_changes:
- win_nssm - Drop support of literal YAML dictionnary for ``app_parameters`` option. Use the ``key=value;`` string form instead

View File

@ -1,2 +0,0 @@
bugfixes:
- "improves docker_container idempotency (https://github.com/ansible/ansible/pull/44808)"

View File

@ -1,2 +0,0 @@
bugfixes:
- "ACME modules support `POST-as-GET <https://community.letsencrypt.org/t/acme-v2-scheduled-deprecation-of-unauthenticated-resource-gets/74380>`__ and will be able to access Let's Encrypt ACME v2 endpoint after November 1st, 2019."

View File

@ -1,2 +0,0 @@
bugfixes:
- "Fixed: Make sure that the files excluded when extracting the archive are not checked. https://github.com/ansible/ansible/pull/45122"

View File

@ -1,2 +0,0 @@
bugfixes:
- replace renamed exceptions in multiple openstack modules

View File

@ -1,2 +0,0 @@
bugfixes:
- vmware_host_service_facts - handle exception when service package does not have package name.

View File

@ -1,2 +0,0 @@
minor_changes:
- Update docs and return section of vmware_host_service_facts module.

View File

@ -1,2 +0,0 @@
bugfixes:
- vmware - honor "wait_for_ip_address" when powering on a VM

View File

@ -1,2 +0,0 @@
bugfixes:
- Fix iterator to list conversion in ldap_entry module.

View File

@ -1,2 +0,0 @@
bugfixes:
- get_url - support remote checksum files with paths specified with leading dots (`./path/to/file`)

View File

@ -1,2 +0,0 @@
bugfixes:
- docker_service - correctly parse string values for the `scale` parameter https://github.com/ansible/ansible/pull/45508

View File

@ -1,2 +0,0 @@
bugfixes:
- Fix the quoting of vhost and other names in rabbitmq_binding

View File

@ -1,2 +0,0 @@
bugfixes:
- "fetch_url did not always return lower-case header names in case of HTTP errors (https://github.com/ansible/ansible/pull/45628)."

View File

@ -1,2 +0,0 @@
bugfixes:
- "Don't parse parameters and options when ``state`` is ``absent`` (https://github.com/ansible/ansible/pull/45700)."

View File

@ -1,2 +0,0 @@
bugfixes:
- "Fix issue with HTTP redirects with redfish_facts module (https://github.com/ansible/ansible/pull/45704)"

View File

@ -1,3 +0,0 @@
bugfixes:
- Vultr - fix for unreliable API behaviors resulting in timeouts (https://github.com/ansible/ansible/pull/45712/).
- vultr_server - fix diff for user data (https://github.com/ansible/ansible/pull/45753/).

View File

@ -1,4 +0,0 @@
bugfixes:
- "Fixed: Appropriate code to expand value was missing so assigning SSL
certificate is not working as described in the documentation.
https://github.com/ansible/ansible/pull/45830"

View File

@ -1,2 +0,0 @@
bugfixes:
- "os_router - ``enable_snat: no`` was ignored."

View File

@ -1,2 +0,0 @@
minor_changes:
- Puppet module remove ``--ignorecache`` to allow Puppet 6 support

View File

@ -1,2 +0,0 @@
bugfixes:
- "route53 - fix CAA record ordering for idempotency."

View File

@ -1,3 +0,0 @@
bugfixes:
- cs_instance - Fix host migration without volume (https://github.com/ansible/ansible/pull/46115).
- cs_instance - Fix docs and typo in examples (https://github.com/ansible/ansible/pull/46035).

View File

@ -1,2 +0,0 @@
bugfixes:
- "Provides flexibility when retrieving redfish facts by not assuming that certains keys exist. Checks first if key exists before attempting to read from it."

View File

@ -1,3 +0,0 @@
bugfixes:
- In systemd module, allow scope to default to 'system'
- In systemd module, fix check if a systemd+initd service is enabled - disabled in systemd means disabled

View File

@ -1,2 +0,0 @@
bugfixes:
- "docker_container - the behavior is improved in case ``image`` is not specified, but needed for (re-)creating the container."

View File

@ -1,2 +0,0 @@
bugfixes:
- "zabbix_host - module was failing when zabbix host was updated with new interface and template depending on that interface at the same time"

View File

@ -1,2 +0,0 @@
bugfixes:
- "docker_container - ``publish_ports: all`` was not used correctly when checking idempotency."

View File

@ -1,2 +0,0 @@
bugfixes:
- "docker_container - fix idempotency check for published_ports in some special cases."

View File

@ -1,3 +0,0 @@
---
bugfixes:
- Fixes issue where a password parameter was not set to no_log

View File

@ -1,2 +0,0 @@
minor_changes:
- Parsing plugin filter may raise TypeError, gracefully handle this exception and let user know about the syntax error in plugin filter file.

View File

@ -1,2 +0,0 @@
minor_changes:
- Update plugin filter documentation.

View File

@ -1,2 +0,0 @@
minor_changes:
- Fix documentation for cloning template.

View File

@ -1,2 +0,0 @@
bugfixes:
- "gcp_utils - fix google auth scoping issue with application default credentials or google cloud engine credentials. Only scope credentials that can be scoped."

View File

@ -1,2 +0,0 @@
bugfixes:
- templar - Do not strip new lines in native jinja - https://github.com/ansible/ansible/issues/46743

View File

@ -1,3 +0,0 @@
---
bugfixes:
- Only access EC2 volume tags when set

View File

@ -1,2 +0,0 @@
bugfixes:
- aws_ec2 - fixed issue where cache did not contain the computed groups

View File

@ -1,2 +0,0 @@
bugfixes:
- mail - fix python 2.7 regression

View File

@ -1,2 +0,0 @@
bugfixes:
- assert - add 'success_msg' to valid args (https://github.com/ansible/ansible/pull/47030)

View File

@ -1,2 +0,0 @@
bugfixes:
- "The docker_* modules more uniformly check versions of docker-py/docker and (if necessary) the docker API."

View File

@ -1,2 +0,0 @@
bugfixes:
- junos - fix terminal prompt regex (https://github.com/ansible/ansible/pull/47096)

View File

@ -1,2 +0,0 @@
minor_changes:
- yum/dnf - fail when space separated string of names (https://github.com/ansible/ansible/pull/47109)

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