Compare commits
5 Commits
v2.7.8
...
threading_
| Author | SHA1 | Date | |
|---|---|---|---|
| 9b6b924e9c | |||
| f860ea10c4 | |||
| dbd3a0828a | |||
| 5e63647517 | |||
| f95160723d |
@ -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"
|
||||
@ -23,4 +23,3 @@ omit =
|
||||
*/python*/distutils/*
|
||||
*/pyshared/*
|
||||
*/pytest
|
||||
*/AnsiballZ_*.py
|
||||
|
||||
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -1,2 +1,4 @@
|
||||
CHANGELOG.md merge=union
|
||||
.github/ export-ignore
|
||||
hacking/ export-ignore
|
||||
ticket-stubs/ export-ignore
|
||||
|
||||
1239
.github/BOTMETA.yml
vendored
1239
.github/BOTMETA.yml
vendored
File diff suppressed because it is too large
Load Diff
3
.github/CODE_OF_CONDUCT.md
vendored
3
.github/CODE_OF_CONDUCT.md
vendored
@ -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).
|
||||
25
.github/CONTRIBUTING.md
vendored
25
.github/CONTRIBUTING.md
vendored
@ -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!
|
||||
39
.github/ISSUE_TEMPLATE.md
vendored
39
.github/ISSUE_TEMPLATE.md
vendored
@ -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
|
||||
|
||||
61
.github/ISSUE_TEMPLATE/bug_report.md
vendored
61
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -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 -->
|
||||
```
|
||||
|
||||
```
|
||||
61
.github/ISSUE_TEMPLATE/documentation_report.md
vendored
61
.github/ISSUE_TEMPLATE/documentation_report.md
vendored
@ -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 -->
|
||||
```
|
||||
|
||||
```
|
||||
61
.github/ISSUE_TEMPLATE/feature_request.md
vendored
61
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -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 -->
|
||||
```
|
||||
|
||||
```
|
||||
@ -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
|
||||
14
.github/PULL_REQUEST_TEMPLATE.md
vendored
14
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -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 -->
|
||||
```
|
||||
|
||||
42
.gitignore
vendored
42
.gitignore
vendored
@ -17,8 +17,6 @@ rpm-build
|
||||
.idea
|
||||
#IntelliJ IDEA stuff..
|
||||
*.iml
|
||||
#VSCode stuff..
|
||||
.vscode/
|
||||
# Mac OS X stuff...
|
||||
.DS_Store
|
||||
# manpage build stuff...
|
||||
@ -29,23 +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/dev_guide/testing/sanity/index.rst.new
|
||||
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
|
||||
@ -56,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
|
||||
@ -74,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/
|
||||
@ -90,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
|
||||
@ -102,5 +102,3 @@ htmlcov/
|
||||
# ansible-test coverage results
|
||||
test/units/.coverage.*
|
||||
/test/integration/cloud-config-azure.yml
|
||||
/SYMLINK_CACHE.json
|
||||
changelogs/.plugin-cache.yaml
|
||||
|
||||
2
.mailmap
2
.mailmap
@ -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
3935
CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
29
CONTRIBUTING.md
Normal 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!
|
||||
16
MANIFEST.in
16
MANIFEST.in
@ -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 *
|
||||
|
||||
@ -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
124
Makefile
@ -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
56
README.md
Normal file
@ -0,0 +1,56 @@
|
||||
[](https://pypi.python.org/pypi/ansible)
|
||||
[](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.
|
||||
113
README.rst
113
README.rst
@ -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
84
RELEASES.txt
Normal 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
28
ROADMAP.rst
Normal 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>`_
|
||||
2716
ansible-core-sitemap.xml
Normal file
2716
ansible-core-sitemap.xml
Normal file
File diff suppressed because it is too large
Load Diff
20
bin/ansible
20
bin/ansible
@ -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)
|
||||
|
||||
@ -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,317 +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
|
||||
"""
|
||||
lock_path = unfrackpath("%s/.ansible_pc_lock_%s" % os.path.split(self.socket_path))
|
||||
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 os.path.exists(lock_path):
|
||||
os.remove(lock_path)
|
||||
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))
|
||||
|
||||
socket_path = unfrackpath(cp % dict(directory=tmp_path))
|
||||
lock_path = unfrackpath("%s/.ansible_pc_lock_%s" % os.path.split(socket_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()
|
||||
|
||||
@ -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()
|
||||
@ -1,821 +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'
|
||||
2.7.6:
|
||||
codename: In the Light
|
||||
fragments:
|
||||
- 46739-gcp-compute-instance-metadata.yaml
|
||||
- 46774-ec2_instance_check_mode_fix.yaml
|
||||
- 49084-influxdb_user-default-password-fix.yaml
|
||||
- 49194-grafana_string_handling_fix.yml
|
||||
- 49409-lineinfile_must_not_insert_lines_multiples_times_with_insertbefore_insertafter.yml
|
||||
- 49758-azure_vmss_update_image_reference_fix.yaml
|
||||
- 49794-docker_container-network-mode.yml
|
||||
- 49843-docker_container-wrap-env.yaml
|
||||
- 49922-network-cli-timeout.yaml
|
||||
- 49987-certificate_complete_chain-error.yml
|
||||
- 50034-move-import-errors.yaml
|
||||
- 50076-os-sec-group-rule-proper-module-exit.yaml
|
||||
- 50134-influxdb_user-invalid_auth_fix.yml
|
||||
- 50143-win_firewall_rule-invalid-bypass.yml
|
||||
- 50169-netconf-connection-log.yaml
|
||||
- 50185-win_updates-report-changes-correctly.yml
|
||||
- 50249-vmware_vm_inventory-fix_host_ip.yaml
|
||||
- 50298-redfish_utils_fix_reference_to_local_variable_systems_service.yaml
|
||||
- 50322-openssl-path-error.yml
|
||||
- 50337-fix-vultr_server-ssh_keys-handling.yml
|
||||
- 50361-openssl_csr-idempotency.yml
|
||||
- 50448-paramiko_ssh_add_auth_timeout.yaml
|
||||
- 50540-fix-lastpass-lookup-error.yaml
|
||||
- 50654-docker-swarm-service-docker-api-fix.yaml
|
||||
- 50655-docker_swarm_service-update_order-idempotency.yml
|
||||
- 50697-openssl_pkcs12-ca_certificates.yaml
|
||||
- 50861-docker_swarm_service-documentation-fixes.yml
|
||||
- acl_doc_fix.yml
|
||||
- callback-keep-more-debug-keys.yml
|
||||
- copy-diff-text.yaml
|
||||
- dnf-conf-file.yaml
|
||||
- dnf-update-cache-broken-transaction.yaml
|
||||
- docker_volume-force-change-detection-revert.yaml
|
||||
- firewalld-missing-port-protocol.yml
|
||||
- fix_vmware_inv.yml
|
||||
- flatpak-compatibility-fixes.yaml
|
||||
- icinga2_host-47671-fix-use_proxy.yaml
|
||||
- junos_commit_error_fix.yaml
|
||||
- openstack_inventory_fix.yml
|
||||
- os-family_distro_variable_clearlinux.yaml
|
||||
- persistent-socket-lock-name.yaml
|
||||
- playbook-order-reverse_inventory.yaml
|
||||
- pure_facts_fix.yaml
|
||||
- reboot-add-aix-support.yml
|
||||
- reboot-path-alpine-solaris.yaml
|
||||
- reboot-vmware-esxi.yaml
|
||||
- v2.7.6_summary.yaml
|
||||
- win_copy-empty-dir.yaml
|
||||
- win_lineinfile-output.yaml
|
||||
- windows_setup_memtotal.yml
|
||||
- yumdnf-better-uri-handling.yaml
|
||||
release_date: '2019-01-17'
|
||||
2.7.7:
|
||||
codename: In the Light
|
||||
fragments:
|
||||
- 24633-copy-coherency-between-check-normal-mode.yaml
|
||||
- 47213-onepassword_facts_fix_password_lookup.yaml
|
||||
- 49444_fix_check_if_archive_is_created_in_path_to_be_removed.yml
|
||||
- 50006-azure_rm_inventory_batchrequest_fix.yaml
|
||||
- 50248-fix-coonfig-backup-glob.yaml
|
||||
- 51232-docker_swarm_service-endpoint_mode.yaml
|
||||
- 51406-aci_aaa_user-description.yaml
|
||||
- 51495-k8s-load-envvars.yaml
|
||||
- 51602-ec2_instance_single_iface_description.yaml
|
||||
- cli_config_diff_fix.yaml
|
||||
- delegate_facts_fix.yaml
|
||||
- file-touch-non-owner.yaml
|
||||
- fix_ansible_connect_timeout.yaml
|
||||
- fix_ir_dupes.yml
|
||||
- fix_pull_extra.yml
|
||||
- nios_a_record_delete_failure_with_uppercase_name.yaml
|
||||
- py37_misc_module_backports.yaml
|
||||
- reboot-conn-timeout-reset.yaml
|
||||
- ssh_connection_invalid_password.yaml
|
||||
- systemd-warn-on-chroot.yaml
|
||||
- v2.7.7_summary.yaml
|
||||
- vmware_guest-documentation_fix.yaml
|
||||
- win_chocolatey.yaml
|
||||
- win_power_plan-windows10.yaml
|
||||
- xdg_systemd_fix.yml
|
||||
release_date: '2019-02-07'
|
||||
2.7.8:
|
||||
codename: In the Light
|
||||
fragments:
|
||||
- 45269-fix-vm-crashing.yaml
|
||||
- 45378-fix-sql-tags.yml
|
||||
- 46478-haproxy-fix-drain-mode.yaml
|
||||
- 49485-ios-retry-section.yaml
|
||||
- 49704-fix-vm-facts-crash.yaml
|
||||
- 50120-fix-vm-facts-managed-disk.yaml
|
||||
- 50402-ufw-check-direction.yml
|
||||
- 51028-get-standard-redfish-properties-for-firmware-entries.yaml
|
||||
- 51473-openssl_csr-idempotence.yaml
|
||||
- 51535-ec2-fix-spot-request-end-date.yaml
|
||||
- 51653-fixing-azure-postgresql-parameters.yaml
|
||||
- 51661-fixing-azure-mysql-parameters.yaml
|
||||
- 51697-disable_excludes-errors-with-disable-includes-message.yaml
|
||||
- 51764-update-getbiosbootorder-to-standard-redfish-resources.yaml
|
||||
- 51781-fixing-managed-disk-facts.yaml
|
||||
- 51795-acme_challenge_cert_helper-module-fail.yaml
|
||||
- 51827-openstack_logs_to_stderr.yml
|
||||
- 52130-win_psmodule-update_nuget.yaml
|
||||
- 52158-jinja2-native-types-contructed-keyed-groups.yaml
|
||||
- 52388-postgresqldatabase-fix-force-update.yml
|
||||
- 52389-mysqldatabase-fix-force-update.yaml
|
||||
- allow_regions_aws_invp.yml
|
||||
- disallow-relative-homedir.yaml
|
||||
- psrp-display-exec-output.yaml
|
||||
- ufw-reset-check-mode.yaml
|
||||
- v2.7.8_summary.yaml
|
||||
- win-become-elevation.yaml
|
||||
- winrm-ansible-conn-error.yaml
|
||||
- yum-unauthenticated-proxy.yaml
|
||||
release_date: '2019-02-21'
|
||||
File diff suppressed because it is too large
Load Diff
@ -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.
|
||||
@ -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']
|
||||
@ -1,2 +0,0 @@
|
||||
minor_changes:
|
||||
- Document Path and Port are mutually exclusive parameters in wait_for module.
|
||||
@ -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)"
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- copy - align invocation in return value between check and normal mode
|
||||
@ -1,2 +0,0 @@
|
||||
major_changes:
|
||||
- Allow config to enable native jinja types (https://github.com/ansible/ansible/pull/32738)
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- Rewrite get_resource_pool method for correct resource_pool selection.
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- sensu_silence - Cast int for expire field to avoid call failure to sensu API.
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "Allow arbitrary ``log_driver`` for docker_container (https://github.com/ansible/ansible/pull/33579)."
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- Ignore empty result of rabbitmqctl list_user_permissions.
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- Only delete host key from redis in-memory cache if present.
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- Refactor virtual machine disk logic.
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- plugins/inventory/openstack.py - Do not create group with empty name if region is not set
|
||||
@ -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."
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "nmcli - fix syntax of vlan modification command (https://github.com/ansible/ansible/issues/42322)"
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "fixes docker_container check and debug mode (https://github.com/ansible/ansible/pull/42380)"
|
||||
@ -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
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "The docker_* modules respect the DOCKER_* environment variables again (https://github.com/ansible/ansible/pull/42641)."
|
||||
@ -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)
|
||||
@ -1,4 +0,0 @@
|
||||
---
|
||||
minor_changes:
|
||||
- Added capability to skip ssl verification
|
||||
on zabbix host with dynamic inventory
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "docker_container: fixing ``working_dir`` idempotency problem (https://github.com/ansible/ansible/pull/42857)"
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- nclu - no longer runs net on empty lines in templates (https://github.com/ansible/ansible/pull/43024)
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- user - Strip trailing comments in /etc/default/passwd (https://github.com/ansible/ansible/pull/43931)
|
||||
@ -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)."
|
||||
@ -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)"
|
||||
@ -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)
|
||||
@ -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
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- fix mail module for python 3.7.0 (https://github.com/ansible/ansible/pull/44552)
|
||||
@ -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
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "improves docker_container idempotency (https://github.com/ansible/ansible/pull/44808)"
|
||||
@ -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."
|
||||
@ -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"
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- replace renamed exceptions in multiple openstack modules
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- vmware_host_service_facts - handle exception when service package does not have package name.
|
||||
@ -1,2 +0,0 @@
|
||||
minor_changes:
|
||||
- Update docs and return section of vmware_host_service_facts module.
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- vmware - honor "wait_for_ip_address" when powering on a VM
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- azure_rm_virtualmachine - fixed several crashes in module
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- azure_rm_sqlserver - fix for tags support
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- Fix iterator to list conversion in ldap_entry module.
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- get_url - support remote checksum files with paths specified with leading dots (`./path/to/file`)
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- docker_service - correctly parse string values for the `scale` parameter https://github.com/ansible/ansible/pull/45508
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- Fix the quoting of vhost and other names in rabbitmq_binding
|
||||
@ -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)."
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "Don't parse parameters and options when ``state`` is ``absent`` (https://github.com/ansible/ansible/pull/45700)."
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "Fix issue with HTTP redirects with redfish_facts module (https://github.com/ansible/ansible/pull/45704)"
|
||||
@ -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/).
|
||||
@ -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"
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "os_router - ``enable_snat: no`` was ignored."
|
||||
@ -1,2 +0,0 @@
|
||||
minor_changes:
|
||||
- Puppet module remove ``--ignorecache`` to allow Puppet 6 support
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "route53 - fix CAA record ordering for idempotency."
|
||||
@ -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).
|
||||
@ -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."
|
||||
@ -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
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "docker_container - the behavior is improved in case ``image`` is not specified, but needed for (re-)creating the container."
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- Backport of https://github.com/ansible/ansible/pull/46478 , fixes name collision in haproxy module
|
||||
@ -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"
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "docker_container - ``publish_ports: all`` was not used correctly when checking idempotency."
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "docker_container - fix idempotency check for published_ports in some special cases."
|
||||
@ -1,3 +0,0 @@
|
||||
---
|
||||
bugfixes:
|
||||
- Fixes issue where a password parameter was not set to no_log
|
||||
@ -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.
|
||||
@ -1,2 +0,0 @@
|
||||
minor_changes:
|
||||
- Update plugin filter documentation.
|
||||
@ -1,2 +0,0 @@
|
||||
minor_changes:
|
||||
- Fix documentation for cloning template.
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "gcp_compute_instance - fix crash when the instance metadata is not set"
|
||||
@ -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."
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- templar - Do not strip new lines in native jinja - https://github.com/ansible/ansible/issues/46743
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- ec2_instance now respects check mode https://github.com/ansible/ansible/pull/46774
|
||||
@ -1,3 +0,0 @@
|
||||
---
|
||||
bugfixes:
|
||||
- Only access EC2 volume tags when set
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user