Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9d5d88b59f | |||
| 835bed906a | |||
| a5c9d0b185 | |||
| 96bd107179 | |||
| 1541d309e1 | |||
| 0d3596df9a | |||
| 7ddc3db816 | |||
| 962a316584 | |||
| 936f45d160 | |||
| cac9e02aea | |||
| f0039f61e0 | |||
| 272bdebd25 | |||
| 507b78f379 | |||
| 8a2d2c239e | |||
| 554c55b85d |
@ -1,223 +0,0 @@
|
||||
trigger:
|
||||
batch: true
|
||||
branches:
|
||||
include:
|
||||
- devel
|
||||
- stable-*
|
||||
|
||||
pr:
|
||||
autoCancel: true
|
||||
branches:
|
||||
include:
|
||||
- devel
|
||||
- stable-*
|
||||
|
||||
schedules:
|
||||
- cron: 0 7 * * *
|
||||
displayName: Nightly
|
||||
always: true
|
||||
branches:
|
||||
include:
|
||||
- devel
|
||||
- stable-*
|
||||
|
||||
variables:
|
||||
- name: checkoutPath
|
||||
value: ansible
|
||||
- name: coverageBranches
|
||||
value: devel
|
||||
- name: entryPoint
|
||||
value: .azure-pipelines/commands/entry-point.sh
|
||||
- name: fetchDepth
|
||||
value: 500
|
||||
- name: defaultContainer
|
||||
value: quay.io/ansible/azure-pipelines-test-container:4.0.1
|
||||
|
||||
pool: Standard
|
||||
|
||||
stages:
|
||||
- stage: Sanity
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/matrix.yml
|
||||
parameters:
|
||||
nameFormat: Test {0}
|
||||
testFormat: sanity/{0}
|
||||
targets:
|
||||
- test: 1
|
||||
- test: 2
|
||||
- stage: Units
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/matrix.yml
|
||||
parameters:
|
||||
nameFormat: Python {0}
|
||||
testFormat: units/{0}
|
||||
targets:
|
||||
- test: 2.7
|
||||
- test: 3.6
|
||||
- test: 3.7
|
||||
- test: 3.8
|
||||
- test: 3.9
|
||||
- test: '3.10'
|
||||
- test: 3.11
|
||||
- test: 3.12
|
||||
- stage: Windows
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/matrix.yml
|
||||
parameters:
|
||||
nameFormat: Server {0}
|
||||
testFormat: windows/{0}/1
|
||||
targets:
|
||||
- test: 2016
|
||||
- test: 2019
|
||||
- test: 2022
|
||||
- stage: Remote
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/matrix.yml # context/target
|
||||
parameters:
|
||||
targets:
|
||||
- name: macOS 13.2
|
||||
test: macos/13.2
|
||||
- name: RHEL 7.9
|
||||
test: rhel/7.9
|
||||
- name: RHEL 8.8 py36
|
||||
test: rhel/8.8@3.6
|
||||
- name: RHEL 8.8 py311
|
||||
test: rhel/8.8@3.11
|
||||
- name: RHEL 9.2 py39
|
||||
test: rhel/9.2@3.9
|
||||
- name: RHEL 9.2 py311
|
||||
test: rhel/9.2@3.11
|
||||
- name: FreeBSD 13.2
|
||||
test: freebsd/13.2
|
||||
groups:
|
||||
- 1
|
||||
- 2
|
||||
- template: templates/matrix.yml # context/controller
|
||||
parameters:
|
||||
targets:
|
||||
- name: macOS 13.2
|
||||
test: macos/13.2
|
||||
- name: RHEL 8.8
|
||||
test: rhel/8.8
|
||||
- name: RHEL 9.2
|
||||
test: rhel/9.2
|
||||
- name: FreeBSD 13.2
|
||||
test: freebsd/13.2
|
||||
groups:
|
||||
- 3
|
||||
- 4
|
||||
- 5
|
||||
- template: templates/matrix.yml # context/controller (ansible-test container management)
|
||||
parameters:
|
||||
targets:
|
||||
- name: Alpine 3.18
|
||||
test: alpine/3.18
|
||||
- name: Fedora 38
|
||||
test: fedora/38
|
||||
- name: RHEL 8.8
|
||||
test: rhel/8.8
|
||||
- name: RHEL 9.2
|
||||
test: rhel/9.2
|
||||
- name: Ubuntu 22.04
|
||||
test: ubuntu/22.04
|
||||
groups:
|
||||
- 6
|
||||
- stage: Docker
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/matrix.yml
|
||||
parameters:
|
||||
testFormat: linux/{0}
|
||||
targets:
|
||||
- name: Alpine 3
|
||||
test: alpine3
|
||||
- name: CentOS 7
|
||||
test: centos7
|
||||
- name: Fedora 38
|
||||
test: fedora38
|
||||
- name: openSUSE 15
|
||||
test: opensuse15
|
||||
- name: Ubuntu 20.04
|
||||
test: ubuntu2004
|
||||
- name: Ubuntu 22.04
|
||||
test: ubuntu2204
|
||||
groups:
|
||||
- 1
|
||||
- 2
|
||||
- template: templates/matrix.yml
|
||||
parameters:
|
||||
testFormat: linux/{0}
|
||||
targets:
|
||||
- name: Alpine 3
|
||||
test: alpine3
|
||||
- name: Fedora 38
|
||||
test: fedora38
|
||||
- name: Ubuntu 22.04
|
||||
test: ubuntu2204
|
||||
groups:
|
||||
- 3
|
||||
- 4
|
||||
- 5
|
||||
- stage: Galaxy
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/matrix.yml
|
||||
parameters:
|
||||
nameFormat: Python {0}
|
||||
testFormat: galaxy/{0}/1
|
||||
targets:
|
||||
- test: '3.10'
|
||||
- test: 3.11
|
||||
- test: 3.12
|
||||
- stage: Generic
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/matrix.yml
|
||||
parameters:
|
||||
nameFormat: Python {0}
|
||||
testFormat: generic/{0}/1
|
||||
targets:
|
||||
- test: '3.10'
|
||||
- test: 3.11
|
||||
- test: 3.12
|
||||
- stage: Incidental_Windows
|
||||
displayName: Incidental Windows
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/matrix.yml
|
||||
parameters:
|
||||
nameFormat: Server {0}
|
||||
testFormat: i/windows/{0}
|
||||
targets:
|
||||
- test: 2016
|
||||
- test: 2019
|
||||
- test: 2022
|
||||
- stage: Incidental
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/matrix.yml
|
||||
parameters:
|
||||
testFormat: i/{0}/1
|
||||
targets:
|
||||
- name: IOS Python
|
||||
test: ios/csr1000v/
|
||||
- name: VyOS Python
|
||||
test: vyos/1.1.8/
|
||||
- stage: Summary
|
||||
condition: succeededOrFailed()
|
||||
dependsOn:
|
||||
- Sanity
|
||||
- Units
|
||||
- Windows
|
||||
- Remote
|
||||
- Docker
|
||||
- Galaxy
|
||||
- Generic
|
||||
- Incidental_Windows
|
||||
- Incidental
|
||||
jobs:
|
||||
- template: templates/coverage.yml
|
||||
@ -1 +0,0 @@
|
||||
remote.sh
|
||||
@ -1,34 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
cloud="${args[0]}"
|
||||
python="${args[1]}"
|
||||
group="${args[2]}"
|
||||
|
||||
target="shippable/${cloud}/group${group}/"
|
||||
|
||||
stage="${S:-prod}"
|
||||
|
||||
changed_all_target="shippable/${cloud}/smoketest/"
|
||||
|
||||
if ! ansible-test integration "${changed_all_target}" --list-targets > /dev/null 2>&1; then
|
||||
# no smoketest tests are available for this cloud
|
||||
changed_all_target="none"
|
||||
fi
|
||||
|
||||
if [ "${group}" == "1" ]; then
|
||||
# only run smoketest tests for group1
|
||||
changed_all_mode="include"
|
||||
else
|
||||
# smoketest tests already covered by group1
|
||||
changed_all_mode="exclude"
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test integration --color -v --retry-on-error "${target}" ${COVERAGE:+"$COVERAGE"} ${CHANGED:+"$CHANGED"} ${UNSTABLE:+"$UNSTABLE"} \
|
||||
--remote-terminate always --remote-stage "${stage}" \
|
||||
--docker --python "${python}" --changed-all-target "${changed_all_target}" --changed-all-mode "${changed_all_mode}"
|
||||
@ -1,62 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
script="${args[0]}"
|
||||
|
||||
test="$1"
|
||||
|
||||
docker images
|
||||
docker ps
|
||||
|
||||
for container in $(docker ps --format '{{.Image}} {{.ID}}' | grep -v -e '^quay.io/ansible/azure-pipelines-test-container:' | sed 's/^.* //'); do
|
||||
docker rm -f "${container}" || true # ignore errors
|
||||
done
|
||||
|
||||
docker ps
|
||||
|
||||
export PATH="${PWD}/bin:${PATH}"
|
||||
export PYTHONIOENCODING='utf-8'
|
||||
|
||||
if [ -n "${COVERAGE:-}" ]; then
|
||||
# on-demand coverage reporting triggered by setting the COVERAGE environment variable to a non-empty value
|
||||
export COVERAGE="--coverage"
|
||||
elif [[ "${COMMIT_MESSAGE}" =~ ci_coverage ]]; then
|
||||
# on-demand coverage reporting triggered by having 'ci_coverage' in the latest commit message
|
||||
export COVERAGE="--coverage"
|
||||
else
|
||||
# on-demand coverage reporting disabled (default behavior, always-on coverage reporting remains enabled)
|
||||
export COVERAGE="--coverage-check"
|
||||
fi
|
||||
|
||||
if [ -n "${COMPLETE:-}" ]; then
|
||||
# disable change detection triggered by setting the COMPLETE environment variable to a non-empty value
|
||||
export CHANGED=""
|
||||
elif [[ "${COMMIT_MESSAGE}" =~ ci_complete ]]; then
|
||||
# disable change detection triggered by having 'ci_complete' in the latest commit message
|
||||
export CHANGED=""
|
||||
else
|
||||
# enable change detection (default behavior)
|
||||
export CHANGED="--changed"
|
||||
fi
|
||||
|
||||
if [ "${IS_PULL_REQUEST:-}" == "true" ]; then
|
||||
# run unstable tests which are targeted by focused changes on PRs
|
||||
export UNSTABLE="--allow-unstable-changed"
|
||||
else
|
||||
# do not run unstable tests outside PRs
|
||||
export UNSTABLE=""
|
||||
fi
|
||||
|
||||
if [[ "${COVERAGE:-}" == "--coverage" ]]; then
|
||||
timeout=60
|
||||
else
|
||||
timeout=50
|
||||
fi
|
||||
|
||||
ansible-test env --dump --show --timeout "${timeout}" --color -v
|
||||
|
||||
".azure-pipelines/commands/${script}.sh" "${test}"
|
||||
@ -1 +0,0 @@
|
||||
remote.sh
|
||||
@ -1 +0,0 @@
|
||||
remote.sh
|
||||
@ -1 +0,0 @@
|
||||
cloud.sh
|
||||
@ -1,18 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
python="${args[1]}"
|
||||
|
||||
if [ "${#args[@]}" -gt 2 ]; then
|
||||
target="shippable/generic/group${args[2]}/"
|
||||
else
|
||||
target="shippable/generic/"
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test integration --color -v --retry-on-error "${target}" ${COVERAGE:+"$COVERAGE"} ${CHANGED:+"$CHANGED"} ${UNSTABLE:+"$UNSTABLE"} \
|
||||
--docker default --python "${python}"
|
||||
@ -1,14 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Temporary script to support side-by-side testing for incidental code coverage.
|
||||
# Once collection migration has been completed the incidental tests can be combined with the regular tests.
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
script="${args[1]}"
|
||||
|
||||
IFS='/' test="${args[*]:1}"
|
||||
|
||||
".azure-pipelines/commands/incidental/${script}.sh" "${test}"
|
||||
@ -1 +0,0 @@
|
||||
network.sh
|
||||
@ -1,40 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
platform="${args[0]}"
|
||||
version="${args[1]}"
|
||||
python_version="${args[2]}"
|
||||
|
||||
target="shippable/${platform}/incidental/"
|
||||
|
||||
stage="${S:-prod}"
|
||||
provider="${P:-default}"
|
||||
|
||||
# python versions to test in order
|
||||
# all versions run full tests
|
||||
IFS=' ' read -r -a python_versions <<< \
|
||||
"$(PYTHONPATH="${PWD}/test/lib" python -c 'from ansible_test._internal import constants; print(" ".join(constants.CONTROLLER_PYTHON_VERSIONS))')"
|
||||
|
||||
if [ "${python_version}" ]; then
|
||||
# limit tests to a single python version
|
||||
python_versions=("${python_version}")
|
||||
fi
|
||||
|
||||
for python_version in "${python_versions[@]}"; do
|
||||
# terminate remote instances on the final python version tested
|
||||
if [ "${python_version}" = "${python_versions[-1]}" ]; then
|
||||
terminate="always"
|
||||
else
|
||||
terminate="never"
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test network-integration --color -v --retry-on-error "${target}" ${COVERAGE:+"$COVERAGE"} ${CHANGED:+"$CHANGED"} ${UNSTABLE:+"$UNSTABLE"} \
|
||||
--platform "${platform}/${version}" \
|
||||
--docker default --python "${python_version}" \
|
||||
--remote-terminate "${terminate}" --remote-stage "${stage}" --remote-provider "${provider}"
|
||||
done
|
||||
@ -1 +0,0 @@
|
||||
network.sh
|
||||
@ -1,52 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
version="${args[1]}"
|
||||
|
||||
target="shippable/windows/incidental/"
|
||||
|
||||
stage="${S:-prod}"
|
||||
provider="${P:-default}"
|
||||
|
||||
# python version to run full tests on while other versions run minimal tests
|
||||
python_default="$(PYTHONPATH="${PWD}/test/lib" python -c 'from ansible_test._internal import constants; print(constants.CONTROLLER_MIN_PYTHON_VERSION)')"
|
||||
|
||||
# version to test when only testing a single version
|
||||
single_version=2022
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test windows-integration --list-targets -v ${CHANGED:+"$CHANGED"} ${UNSTABLE:+"$UNSTABLE"} > /tmp/explain.txt 2>&1 || { cat /tmp/explain.txt && false; }
|
||||
{ grep ' windows-integration: .* (targeted)$' /tmp/explain.txt || true; } > /tmp/windows.txt
|
||||
|
||||
if [ -s /tmp/windows.txt ] || [ "${CHANGED:+$CHANGED}" == "" ]; then
|
||||
echo "Detected changes requiring integration tests specific to Windows:"
|
||||
cat /tmp/windows.txt
|
||||
|
||||
echo "Running Windows integration tests for multiple versions concurrently."
|
||||
|
||||
platforms=(
|
||||
--windows "${version}"
|
||||
)
|
||||
else
|
||||
echo "No changes requiring integration tests specific to Windows were detected."
|
||||
echo "Running Windows integration tests for a single version only: ${single_version}"
|
||||
|
||||
if [ "${version}" != "${single_version}" ]; then
|
||||
echo "Skipping this job since it is for: ${version}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
platforms=(
|
||||
--windows "${version}"
|
||||
)
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test windows-integration --color -v --retry-on-error "${target}" ${COVERAGE:+"$COVERAGE"} ${CHANGED:+"$CHANGED"} ${UNSTABLE:+"$UNSTABLE"} \
|
||||
"${platforms[@]}" \
|
||||
--docker default --python "${python_default}" \
|
||||
--remote-terminate always --remote-stage "${stage}" --remote-provider "${provider}"
|
||||
@ -1,18 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
image="${args[1]}"
|
||||
|
||||
if [ "${#args[@]}" -gt 2 ]; then
|
||||
target="shippable/posix/group${args[2]}/"
|
||||
else
|
||||
target="shippable/posix/"
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test integration --color -v --retry-on-error "${target}" ${COVERAGE:+"$COVERAGE"} ${CHANGED:+"$CHANGED"} ${UNSTABLE:+"$UNSTABLE"} \
|
||||
--docker "${image}"
|
||||
@ -1 +0,0 @@
|
||||
remote.sh
|
||||
@ -1,32 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
platform="${args[0]}"
|
||||
version="${args[1]}"
|
||||
pyver=default
|
||||
|
||||
# check for explicit python version like 8.3@3.8
|
||||
declare -a splitversion
|
||||
IFS='@' read -ra splitversion <<< "$version"
|
||||
|
||||
if [ "${#splitversion[@]}" -gt 1 ]; then
|
||||
version="${splitversion[0]}"
|
||||
pyver="${splitversion[1]}"
|
||||
fi
|
||||
|
||||
if [ "${#args[@]}" -gt 2 ]; then
|
||||
target="shippable/posix/group${args[2]}/"
|
||||
else
|
||||
target="shippable/posix/"
|
||||
fi
|
||||
|
||||
stage="${S:-prod}"
|
||||
provider="${P:-default}"
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test integration --color -v --retry-on-error "${target}" ${COVERAGE:+"$COVERAGE"} ${CHANGED:+"$CHANGED"} ${UNSTABLE:+"$UNSTABLE"} \
|
||||
--python "${pyver}" --remote "${platform}/${version}" --remote-terminate always --remote-stage "${stage}" --remote-provider "${provider}" \
|
||||
@ -1 +0,0 @@
|
||||
remote.sh
|
||||
@ -1,41 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
group="${args[1]}"
|
||||
|
||||
group2_include=(
|
||||
ansible-doc
|
||||
changelog
|
||||
package-data
|
||||
pep8
|
||||
pylint
|
||||
validate-modules
|
||||
)
|
||||
|
||||
group1_exclude=(
|
||||
"${group2_include[@]}"
|
||||
)
|
||||
|
||||
options=()
|
||||
|
||||
case "${group}" in
|
||||
1)
|
||||
for name in "${group1_exclude[@]}"; do
|
||||
options+=(--skip-test "${name}")
|
||||
done
|
||||
;;
|
||||
2)
|
||||
for name in "${group2_include[@]}"; do
|
||||
options+=(--test "${name}")
|
||||
done
|
||||
;;
|
||||
esac
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test sanity --color -v --junit ${COVERAGE:+"$COVERAGE"} ${CHANGED:+"$CHANGED"} \
|
||||
--docker \
|
||||
"${options[@]}" --allow-disabled
|
||||
@ -1 +0,0 @@
|
||||
remote.sh
|
||||
@ -1,11 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
version="${args[1]}"
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test units --color -v --docker default --python "${version}" ${COVERAGE:+"$COVERAGE"} ${CHANGED:+"$CHANGED"} \
|
||||
@ -1,94 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -o pipefail -eux
|
||||
|
||||
declare -a args
|
||||
IFS='/:' read -ra args <<< "$1"
|
||||
|
||||
version="${args[1]}"
|
||||
group="${args[2]}"
|
||||
|
||||
target="shippable/windows/group${group}/"
|
||||
|
||||
stage="${S:-prod}"
|
||||
provider="${P:-default}"
|
||||
|
||||
# python versions to test in order
|
||||
IFS=' ' read -r -a python_versions <<< \
|
||||
"$(PYTHONPATH="${PWD}/test/lib" python -c 'from ansible_test._internal import constants; print(" ".join(constants.CONTROLLER_PYTHON_VERSIONS))')"
|
||||
|
||||
# python version to run full tests on while other versions run minimal tests
|
||||
python_default="$(PYTHONPATH="${PWD}/test/lib" python -c 'from ansible_test._internal import constants; print(constants.CONTROLLER_MIN_PYTHON_VERSION)')"
|
||||
|
||||
# version to test when only testing a single version
|
||||
single_version=2022
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test windows-integration --list-targets -v ${CHANGED:+"$CHANGED"} ${UNSTABLE:+"$UNSTABLE"} > /tmp/explain.txt 2>&1 || { cat /tmp/explain.txt && false; }
|
||||
{ grep ' windows-integration: .* (targeted)$' /tmp/explain.txt || true; } > /tmp/windows.txt
|
||||
|
||||
if [ -s /tmp/windows.txt ] || [ "${CHANGED:+$CHANGED}" == "" ]; then
|
||||
echo "Detected changes requiring integration tests specific to Windows:"
|
||||
cat /tmp/windows.txt
|
||||
|
||||
echo "Running Windows integration tests for multiple versions concurrently."
|
||||
|
||||
platforms=(
|
||||
--windows "${version}"
|
||||
)
|
||||
else
|
||||
echo "No changes requiring integration tests specific to Windows were detected."
|
||||
echo "Running Windows integration tests for a single version only: ${single_version}"
|
||||
|
||||
if [ "${version}" != "${single_version}" ]; then
|
||||
echo "Skipping this job since it is for: ${version}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
platforms=(
|
||||
--windows "${version}"
|
||||
)
|
||||
fi
|
||||
|
||||
for version in "${python_versions[@]}"; do
|
||||
changed_all_target="all"
|
||||
changed_all_mode="default"
|
||||
|
||||
if [ "${version}" == "${python_default}" ]; then
|
||||
# smoketest tests
|
||||
if [ "${CHANGED}" ]; then
|
||||
# with change detection enabled run tests for anything changed
|
||||
# use the smoketest tests for any change that triggers all tests
|
||||
ci="${target}"
|
||||
changed_all_target="shippable/windows/smoketest/"
|
||||
if [ "${target}" == "shippable/windows/group1/" ]; then
|
||||
# only run smoketest tests for group1
|
||||
changed_all_mode="include"
|
||||
else
|
||||
# smoketest tests already covered by group1
|
||||
changed_all_mode="exclude"
|
||||
fi
|
||||
else
|
||||
# without change detection enabled run entire test group
|
||||
ci="${target}"
|
||||
fi
|
||||
else
|
||||
# only run minimal tests for group1
|
||||
if [ "${target}" != "shippable/windows/group1/" ]; then continue; fi
|
||||
# minimal tests for other python versions
|
||||
ci="shippable/windows/minimal/"
|
||||
fi
|
||||
|
||||
# terminate remote instances on the final python version tested
|
||||
if [ "${version}" = "${python_versions[-1]}" ]; then
|
||||
terminate="always"
|
||||
else
|
||||
terminate="never"
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ansible-test windows-integration --color -v --retry-on-error "${ci}" ${COVERAGE:+"$COVERAGE"} ${CHANGED:+"$CHANGED"} ${UNSTABLE:+"$UNSTABLE"} \
|
||||
"${platforms[@]}" --changed-all-target "${changed_all_target}" --changed-all-mode "${changed_all_mode}" \
|
||||
--docker default --python "${version}" \
|
||||
--remote-terminate "${terminate}" --remote-stage "${stage}" --remote-provider "${provider}"
|
||||
done
|
||||
@ -1,20 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Aggregate code coverage results for later processing.
|
||||
|
||||
set -o pipefail -eu
|
||||
|
||||
agent_temp_directory="$1"
|
||||
|
||||
PATH="${PWD}/bin:${PATH}"
|
||||
|
||||
mkdir "${agent_temp_directory}/coverage/"
|
||||
|
||||
options=(--venv --color -v)
|
||||
|
||||
ansible-test coverage combine --group-by command --export "${agent_temp_directory}/coverage/" "${options[@]}"
|
||||
|
||||
if ansible-test coverage analyze targets generate --help >/dev/null 2>&1; then
|
||||
# Only analyze coverage if the installed version of ansible-test supports it.
|
||||
# Doing so allows this script to work unmodified for multiple Ansible versions.
|
||||
ansible-test coverage analyze targets generate "${agent_temp_directory}/coverage/coverage-analyze-targets.json" "${options[@]}"
|
||||
fi
|
||||
@ -1,60 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
Combine coverage data from multiple jobs, keeping the data only from the most recent attempt from each job.
|
||||
Coverage artifacts must be named using the format: "Coverage $(System.JobAttempt) {StableUniqueNameForEachJob}"
|
||||
The recommended coverage artifact name format is: Coverage $(System.JobAttempt) $(System.StageDisplayName) $(System.JobDisplayName)
|
||||
Keep in mind that Azure Pipelines does not enforce unique job display names (only names).
|
||||
It is up to pipeline authors to avoid name collisions when deviating from the recommended format.
|
||||
"""
|
||||
|
||||
from __future__ import (absolute_import, division, print_function)
|
||||
__metaclass__ = type
|
||||
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
"""Main program entry point."""
|
||||
source_directory = sys.argv[1]
|
||||
|
||||
if '/ansible_collections/' in os.getcwd():
|
||||
output_path = "tests/output"
|
||||
else:
|
||||
output_path = "test/results"
|
||||
|
||||
destination_directory = os.path.join(output_path, 'coverage')
|
||||
|
||||
if not os.path.exists(destination_directory):
|
||||
os.makedirs(destination_directory)
|
||||
|
||||
jobs = {}
|
||||
count = 0
|
||||
|
||||
for name in os.listdir(source_directory):
|
||||
match = re.search('^Coverage (?P<attempt>[0-9]+) (?P<label>.+)$', name)
|
||||
label = match.group('label')
|
||||
attempt = int(match.group('attempt'))
|
||||
jobs[label] = max(attempt, jobs.get(label, 0))
|
||||
|
||||
for label, attempt in jobs.items():
|
||||
name = 'Coverage {attempt} {label}'.format(label=label, attempt=attempt)
|
||||
source = os.path.join(source_directory, name)
|
||||
source_files = os.listdir(source)
|
||||
|
||||
for source_file in source_files:
|
||||
source_path = os.path.join(source, source_file)
|
||||
destination_path = os.path.join(destination_directory, source_file + '.' + label)
|
||||
print('"%s" -> "%s"' % (source_path, destination_path))
|
||||
shutil.copyfile(source_path, destination_path)
|
||||
count += 1
|
||||
|
||||
print('Coverage file count: %d' % count)
|
||||
print('##vso[task.setVariable variable=coverageFileCount]%d' % count)
|
||||
print('##vso[task.setVariable variable=outputPath]%s' % output_path)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -1,24 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Check the test results and set variables for use in later steps.
|
||||
|
||||
set -o pipefail -eu
|
||||
|
||||
if [[ "$PWD" =~ /ansible_collections/ ]]; then
|
||||
output_path="tests/output"
|
||||
else
|
||||
output_path="test/results"
|
||||
fi
|
||||
|
||||
echo "##vso[task.setVariable variable=outputPath]${output_path}"
|
||||
|
||||
if compgen -G "${output_path}"'/junit/*.xml' > /dev/null; then
|
||||
echo "##vso[task.setVariable variable=haveTestResults]true"
|
||||
fi
|
||||
|
||||
if compgen -G "${output_path}"'/bot/ansible-test-*' > /dev/null; then
|
||||
echo "##vso[task.setVariable variable=haveBotResults]true"
|
||||
fi
|
||||
|
||||
if compgen -G "${output_path}"'/coverage/*' > /dev/null; then
|
||||
echo "##vso[task.setVariable variable=haveCoverageData]true"
|
||||
fi
|
||||
@ -1,101 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
Upload code coverage reports to codecov.io.
|
||||
Multiple coverage files from multiple languages are accepted and aggregated after upload.
|
||||
Python coverage, as well as PowerShell and Python stubs can all be uploaded.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import dataclasses
|
||||
import pathlib
|
||||
import shutil
|
||||
import subprocess
|
||||
import tempfile
|
||||
import typing as t
|
||||
import urllib.request
|
||||
|
||||
|
||||
@dataclasses.dataclass(frozen=True)
|
||||
class CoverageFile:
|
||||
name: str
|
||||
path: pathlib.Path
|
||||
flags: t.List[str]
|
||||
|
||||
|
||||
@dataclasses.dataclass(frozen=True)
|
||||
class Args:
|
||||
dry_run: bool
|
||||
path: pathlib.Path
|
||||
|
||||
|
||||
def parse_args() -> Args:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('-n', '--dry-run', action='store_true')
|
||||
parser.add_argument('path', type=pathlib.Path)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Store arguments in a typed dataclass
|
||||
fields = dataclasses.fields(Args)
|
||||
kwargs = {field.name: getattr(args, field.name) for field in fields}
|
||||
|
||||
return Args(**kwargs)
|
||||
|
||||
|
||||
def process_files(directory: pathlib.Path) -> t.Tuple[CoverageFile, ...]:
|
||||
processed = []
|
||||
for file in directory.joinpath('reports').glob('coverage*.xml'):
|
||||
name = file.stem.replace('coverage=', '')
|
||||
|
||||
# Get flags from name
|
||||
flags = name.replace('-powershell', '').split('=') # Drop '-powershell' suffix
|
||||
flags = [flag if not flag.startswith('stub') else flag.split('-')[0] for flag in flags] # Remove "-01" from stub files
|
||||
|
||||
processed.append(CoverageFile(name, file, flags))
|
||||
|
||||
return tuple(processed)
|
||||
|
||||
|
||||
def upload_files(codecov_bin: pathlib.Path, files: t.Tuple[CoverageFile, ...], dry_run: bool = False) -> None:
|
||||
for file in files:
|
||||
cmd = [
|
||||
str(codecov_bin),
|
||||
'--name', file.name,
|
||||
'--file', str(file.path),
|
||||
]
|
||||
for flag in file.flags:
|
||||
cmd.extend(['--flags', flag])
|
||||
|
||||
if dry_run:
|
||||
print(f'DRY-RUN: Would run command: {cmd}')
|
||||
continue
|
||||
|
||||
subprocess.run(cmd, check=True)
|
||||
|
||||
|
||||
def download_file(url: str, dest: pathlib.Path, flags: int, dry_run: bool = False) -> None:
|
||||
if dry_run:
|
||||
print(f'DRY-RUN: Would download {url} to {dest} and set mode to {flags:o}')
|
||||
return
|
||||
|
||||
with urllib.request.urlopen(url) as resp:
|
||||
with dest.open('w+b') as f:
|
||||
# Read data in chunks rather than all at once
|
||||
shutil.copyfileobj(resp, f, 64 * 1024)
|
||||
|
||||
dest.chmod(flags)
|
||||
|
||||
|
||||
def main():
|
||||
args = parse_args()
|
||||
url = 'https://ci-files.testing.ansible.com/codecov/linux/codecov'
|
||||
with tempfile.TemporaryDirectory(prefix='codecov-') as tmpdir:
|
||||
codecov_bin = pathlib.Path(tmpdir) / 'codecov'
|
||||
download_file(url, codecov_bin, 0o755, args.dry_run)
|
||||
|
||||
files = process_files(args.path)
|
||||
upload_files(codecov_bin, files, args.dry_run)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Generate code coverage reports for uploading to Azure Pipelines and codecov.io.
|
||||
|
||||
set -o pipefail -eu
|
||||
|
||||
PATH="${PWD}/bin:${PATH}"
|
||||
|
||||
if ! ansible-test --help >/dev/null 2>&1; then
|
||||
# Install the devel version of ansible-test for generating code coverage reports.
|
||||
# This is only used by Ansible Collections, which are typically tested against multiple Ansible versions (in separate jobs).
|
||||
# Since a version of ansible-test is required that can work the output from multiple older releases, the devel version is used.
|
||||
pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check
|
||||
fi
|
||||
|
||||
# Generate stubs using docker (if supported) otherwise fall back to using a virtual environment instead.
|
||||
# The use of docker is required when Powershell code is present, but Ansible 2.12 was the first version to support --docker with coverage.
|
||||
ansible-test coverage xml --group-by command --stub --docker --color -v || ansible-test coverage xml --group-by command --stub --venv --color -v
|
||||
@ -1,34 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Configure the test environment and run the tests.
|
||||
|
||||
set -o pipefail -eu
|
||||
|
||||
entry_point="$1"
|
||||
test="$2"
|
||||
read -r -a coverage_branches <<< "$3" # space separated list of branches to run code coverage on for scheduled builds
|
||||
|
||||
export COMMIT_MESSAGE
|
||||
export COMPLETE
|
||||
export COVERAGE
|
||||
export IS_PULL_REQUEST
|
||||
|
||||
if [ "${SYSTEM_PULLREQUEST_TARGETBRANCH:-}" ]; then
|
||||
IS_PULL_REQUEST=true
|
||||
COMMIT_MESSAGE=$(git log --format=%B -n 1 HEAD^2)
|
||||
else
|
||||
IS_PULL_REQUEST=
|
||||
COMMIT_MESSAGE=$(git log --format=%B -n 1 HEAD)
|
||||
fi
|
||||
|
||||
COMPLETE=
|
||||
COVERAGE=
|
||||
|
||||
if [ "${BUILD_REASON}" = "Schedule" ]; then
|
||||
COMPLETE=yes
|
||||
|
||||
if printf '%s\n' "${coverage_branches[@]}" | grep -q "^${BUILD_SOURCEBRANCHNAME}$"; then
|
||||
COVERAGE=yes
|
||||
fi
|
||||
fi
|
||||
|
||||
"${entry_point}" "${test}" 2>&1 | "$(dirname "$0")/time-command.py"
|
||||
@ -1,25 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
"""Prepends a relative timestamp to each input line from stdin and writes it to stdout."""
|
||||
|
||||
from __future__ import (absolute_import, division, print_function)
|
||||
__metaclass__ = type
|
||||
|
||||
import sys
|
||||
import time
|
||||
|
||||
|
||||
def main():
|
||||
"""Main program entry point."""
|
||||
start = time.time()
|
||||
|
||||
sys.stdin.reconfigure(errors='surrogateescape')
|
||||
sys.stdout.reconfigure(errors='surrogateescape')
|
||||
|
||||
for line in sys.stdin:
|
||||
seconds = time.time() - start
|
||||
sys.stdout.write('%02d:%02d %s' % (seconds // 60, seconds % 60, line))
|
||||
sys.stdout.flush()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -1,29 +0,0 @@
|
||||
# This template adds a job for processing code coverage data.
|
||||
# It will upload results to Azure Pipelines and codecov.io.
|
||||
# Use it from a job stage that completes after all other jobs have completed.
|
||||
# This can be done by placing it in a separate summary stage that runs after the test stage(s) have completed.
|
||||
|
||||
jobs:
|
||||
- job: Coverage
|
||||
displayName: Code Coverage
|
||||
container: $[ variables.defaultContainer ]
|
||||
workspace:
|
||||
clean: all
|
||||
steps:
|
||||
- checkout: self
|
||||
fetchDepth: $(fetchDepth)
|
||||
path: $(checkoutPath)
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download Coverage Data
|
||||
inputs:
|
||||
path: coverage/
|
||||
patterns: "Coverage */*=coverage.combined"
|
||||
- bash: .azure-pipelines/scripts/combine-coverage.py coverage/
|
||||
displayName: Combine Coverage Data
|
||||
- bash: .azure-pipelines/scripts/report-coverage.sh
|
||||
displayName: Generate Coverage Report
|
||||
condition: gt(variables.coverageFileCount, 0)
|
||||
- bash: .azure-pipelines/scripts/publish-codecov.py "$(outputPath)"
|
||||
displayName: Publish to codecov.io
|
||||
condition: gt(variables.coverageFileCount, 0)
|
||||
continueOnError: true
|
||||
@ -1,55 +0,0 @@
|
||||
# This template uses the provided targets and optional groups to generate a matrix which is then passed to the test template.
|
||||
# If this matrix template does not provide the required functionality, consider using the test template directly instead.
|
||||
|
||||
parameters:
|
||||
# A required list of dictionaries, one per test target.
|
||||
# Each item in the list must contain a "test" or "name" key.
|
||||
# Both may be provided. If one is omitted, the other will be used.
|
||||
- name: targets
|
||||
type: object
|
||||
|
||||
# An optional list of values which will be used to multiply the targets list into a matrix.
|
||||
# Values can be strings or numbers.
|
||||
- name: groups
|
||||
type: object
|
||||
default: []
|
||||
|
||||
# An optional format string used to generate the job name.
|
||||
# - {0} is the name of an item in the targets list.
|
||||
- name: nameFormat
|
||||
type: string
|
||||
default: "{0}"
|
||||
|
||||
# An optional format string used to generate the test name.
|
||||
# - {0} is the name of an item in the targets list.
|
||||
- name: testFormat
|
||||
type: string
|
||||
default: "{0}"
|
||||
|
||||
# An optional format string used to add the group to the job name.
|
||||
# {0} is the formatted name of an item in the targets list.
|
||||
# {{1}} is the group -- be sure to include the double "{{" and "}}".
|
||||
- name: nameGroupFormat
|
||||
type: string
|
||||
default: "{0} - {{1}}"
|
||||
|
||||
# An optional format string used to add the group to the test name.
|
||||
# {0} is the formatted test of an item in the targets list.
|
||||
# {{1}} is the group -- be sure to include the double "{{" and "}}".
|
||||
- name: testGroupFormat
|
||||
type: string
|
||||
default: "{0}/{{1}}"
|
||||
|
||||
jobs:
|
||||
- template: test.yml
|
||||
parameters:
|
||||
jobs:
|
||||
- ${{ if eq(length(parameters.groups), 0) }}:
|
||||
- ${{ each target in parameters.targets }}:
|
||||
- name: ${{ format(parameters.nameFormat, coalesce(target.name, target.test)) }}
|
||||
test: ${{ format(parameters.testFormat, coalesce(target.test, target.name)) }}
|
||||
- ${{ if not(eq(length(parameters.groups), 0)) }}:
|
||||
- ${{ each group in parameters.groups }}:
|
||||
- ${{ each target in parameters.targets }}:
|
||||
- name: ${{ format(format(parameters.nameGroupFormat, parameters.nameFormat), coalesce(target.name, target.test), group) }}
|
||||
test: ${{ format(format(parameters.testGroupFormat, parameters.testFormat), coalesce(target.test, target.name), group) }}
|
||||
@ -1,45 +0,0 @@
|
||||
# This template uses the provided list of jobs to create test one or more test jobs.
|
||||
# It can be used directly if needed, or through the matrix template.
|
||||
|
||||
parameters:
|
||||
# A required list of dictionaries, one per test job.
|
||||
# Each item in the list must contain a "job" and "name" key.
|
||||
- name: jobs
|
||||
type: object
|
||||
|
||||
jobs:
|
||||
- ${{ each job in parameters.jobs }}:
|
||||
- job: test_${{ replace(replace(replace(replace(job.test, '/', '_'), '.', '_'), '-', '_'), '@', '_') }}
|
||||
displayName: ${{ job.name }}
|
||||
container: $[ variables.defaultContainer ]
|
||||
workspace:
|
||||
clean: all
|
||||
steps:
|
||||
- checkout: self
|
||||
fetchDepth: $(fetchDepth)
|
||||
path: $(checkoutPath)
|
||||
- bash: .azure-pipelines/scripts/run-tests.sh "$(entryPoint)" "${{ job.test }}" "$(coverageBranches)"
|
||||
displayName: Run Tests
|
||||
- bash: .azure-pipelines/scripts/process-results.sh
|
||||
condition: succeededOrFailed()
|
||||
displayName: Process Results
|
||||
- bash: .azure-pipelines/scripts/aggregate-coverage.sh "$(Agent.TempDirectory)"
|
||||
condition: eq(variables.haveCoverageData, 'true')
|
||||
displayName: Aggregate Coverage Data
|
||||
- task: PublishTestResults@2
|
||||
condition: eq(variables.haveTestResults, 'true')
|
||||
inputs:
|
||||
testResultsFiles: "$(outputPath)/junit/*.xml"
|
||||
displayName: Publish Test Results
|
||||
- task: PublishPipelineArtifact@1
|
||||
condition: eq(variables.haveBotResults, 'true')
|
||||
displayName: Publish Bot Results
|
||||
inputs:
|
||||
targetPath: "$(outputPath)/bot/"
|
||||
artifactName: "Bot $(System.JobAttempt) $(System.StageDisplayName) $(System.JobDisplayName)"
|
||||
- task: PublishPipelineArtifact@1
|
||||
condition: eq(variables.haveCoverageData, 'true')
|
||||
displayName: Publish Coverage Data
|
||||
inputs:
|
||||
targetPath: "$(Agent.TempDirectory)/coverage/"
|
||||
artifactName: "Coverage $(System.JobAttempt) $(System.StageDisplayName) $(System.JobDisplayName)"
|
||||
@ -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"
|
||||
@ -1,4 +0,0 @@
|
||||
# .git-blame-ignore-revs
|
||||
# Bulk PowerShell sanity fixes
|
||||
6def4a3180fe03981ba64c6d8db28fed3bb39c0c
|
||||
716631189cb5a3f66b3add98f39e64e98bc17bf7
|
||||
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -1 +0,0 @@
|
||||
.github/ export-ignore
|
||||
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!
|
||||
1
.github/ISSUE_TEMPLATE.md
vendored
1
.github/ISSUE_TEMPLATE.md
vendored
@ -1 +0,0 @@
|
||||
Please raise issues via the [new interface](https://github.com/ansible/ansible/issues/new/choose)
|
||||
265
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
265
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -1,265 +0,0 @@
|
||||
---
|
||||
name: 🐛 Bug report
|
||||
description: Create a report to help us improve
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
**Thank you for wanting to report a bug in ansible-core!**
|
||||
|
||||
|
||||
⚠
|
||||
Verify first that your issue is not [already reported on
|
||||
GitHub][issue search] and keep in mind that we may have to keep
|
||||
the current behavior because [every change breaks someone's
|
||||
workflow][XKCD 1172].
|
||||
We try to be mindful about this.
|
||||
|
||||
Also test if the latest release and devel branch are affected too.
|
||||
|
||||
|
||||
**Tip:** If you are seeking community support, please consider
|
||||
[starting a mailing list thread or chatting in IRC][ML||IRC].
|
||||
|
||||
|
||||
|
||||
[ML||IRC]:
|
||||
https://docs.ansible.com/ansible-core/devel/community/communication.html?utm_medium=github&utm_source=issue_form--bug_report.yml#mailing-list-information
|
||||
|
||||
[issue search]: ../search?q=is%3Aissue&type=issues
|
||||
|
||||
[XKCD 1172]: https://xkcd.com/1172/
|
||||
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Summary
|
||||
description: Explain the problem briefly below.
|
||||
placeholder: >-
|
||||
When I try to do X with ansible-core from the devel branch on GitHub, Y
|
||||
breaks in a way Z under the env E. Here are all the details I know
|
||||
about this problem...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
attributes:
|
||||
label: Issue Type
|
||||
description: >
|
||||
Please select the single available option in the drop-down.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
<em>Why?</em>
|
||||
</summary>
|
||||
|
||||
We would do it by ourselves but unfortunatelly, the curent
|
||||
edition of GitHub Issue Forms Alpha does not support this yet 🤷
|
||||
|
||||
|
||||
_We will make it easier in the future, once GitHub
|
||||
supports dropdown defaults. Promise!_
|
||||
|
||||
</details>
|
||||
# FIXME: Once GitHub allows defining the default choice, update this
|
||||
options:
|
||||
- Bug Report
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Component Name
|
||||
description: >
|
||||
Write the short name of the rst file, module, plugin, task or
|
||||
feature below, *use your best guess if unsure*.
|
||||
|
||||
|
||||
**Tip:** Cannot find it in this repository? Please be advised that
|
||||
the source for some parts of the documentation are hosted outside
|
||||
of this repository. If the page you are reporting describes
|
||||
modules/plugins/etc that are not officially supported by the
|
||||
Ansible Core Engineering team, there is a good chance that it is
|
||||
coming from one of the [Ansible Collections maintained by the
|
||||
community][collections org]. If this is the case, please make sure
|
||||
to file an issue under the appropriate project there instead.
|
||||
|
||||
|
||||
[collections org]: /ansible-collections
|
||||
placeholder: dnf, apt, yum, pip, user etc.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Ansible Version
|
||||
description: >-
|
||||
Paste verbatim output from `ansible --version` below, under
|
||||
the prompt line. Please don't wrap it with triple backticks — your
|
||||
whole input will be turned into a code snippet automatically.
|
||||
render: console
|
||||
value: |
|
||||
$ ansible --version
|
||||
placeholder: |
|
||||
$ ansible --version
|
||||
ansible [core 2.11.0b4.post0] (detached HEAD ref: refs/) last updated 2021/04/02 00:33:35 (GMT +200)
|
||||
config file = None
|
||||
configured module search path = ['~/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
|
||||
ansible python module location = ~/src/github/ansible/ansible/lib/ansible
|
||||
ansible collection location = ~/.ansible/collections:/usr/share/ansible/collections
|
||||
executable location = bin/ansible
|
||||
python version = 3.9.0 (default, Oct 26 2020, 13:08:59) [GCC 10.2.0]
|
||||
jinja version = 2.11.3
|
||||
libyaml = True
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Configuration
|
||||
description: >-
|
||||
Paste verbatim output from `ansible-config dump --only-changed -t all` below, under the prompt line.
|
||||
(if using a version older than ansible-core 2.12 you should omit the '-t all')
|
||||
Please don't wrap it with triple backticks — your
|
||||
whole input will be turned into a code snippet automatically.
|
||||
render: console
|
||||
value: |
|
||||
# if using a version older than ansible-core 2.12 you should omit the '-t all'
|
||||
$ ansible-config dump --only-changed -t all
|
||||
placeholder: |
|
||||
# if using a version older than ansible-core 2.12 you should omit the '-t all'
|
||||
$ ansible-config dump --only-changed -t all
|
||||
DEFAULT_GATHERING(~/src/github/ansible/ansible/ansible.cfg) = smart
|
||||
DEFAULT_HOST_LIST(~/src/github/ansible/ansible/ansible.cfg) = ['~/src/github/ansible/ansible/hosts']
|
||||
DEFAULT_VAULT_PASSWORD_FILE(~/src/github/ansible/ansible/ansible.cfg) = ~/src/github/ansible/ansible/vault/print-password.sh
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: OS / Environment
|
||||
description: >-
|
||||
Provide all relevant information below, e.g. target OS versions,
|
||||
network device firmware, etc.
|
||||
placeholder: RHEL 8, CentOS Stream etc.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Steps to Reproduce
|
||||
description: |
|
||||
Describe exactly how to reproduce the problem, using a minimal test-case. It would *really* help us understand your problem if you could also pased any playbooks, configs and commands you used.
|
||||
|
||||
**HINT:** You can paste https://gist.github.com links for larger files.
|
||||
value: |
|
||||
<!--- Paste example playbooks or commands between quotes below -->
|
||||
```yaml (paste below)
|
||||
|
||||
```
|
||||
placeholder: |
|
||||
1. Implement the following playbook:
|
||||
|
||||
```yaml
|
||||
---
|
||||
# ping.yml
|
||||
- hosts: all
|
||||
gather_facts: false
|
||||
tasks:
|
||||
- ping:
|
||||
...
|
||||
```
|
||||
2. Then run `ANSIBLE_DEBUG=1 ansible-playbook ping.yml -vvvvv`
|
||||
3. An error occurs.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Expected Results
|
||||
description: >-
|
||||
Describe what you expected to happen when running the steps above.
|
||||
placeholder: >-
|
||||
I expected X to happen because I assumed Y and was shocked
|
||||
that it did not.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Actual Results
|
||||
description: |
|
||||
Describe what actually happened. If possible run with extra verbosity (`-vvvv`).
|
||||
|
||||
Paste verbatim command output and don't wrap it with triple backticks — your
|
||||
whole input will be turned into a code snippet automatically.
|
||||
render: console
|
||||
placeholder: >-
|
||||
Certificate did not match expected hostname: files.pythonhosted.org. Certificate: {'notAfter': 'Apr 28 19:20:25 2021 GMT', 'subjectAltName': ((u'DNS', 'r.ssl.fastly.net'), (u'DNS', '*.catchpoint.com'), (u'DNS', '*.cnn.io'), (u'DNS', '*.dollarshaveclub.com'), (u'DNS', '*.eater.com'), (u'DNS', '*.fastly.picmonkey.com'), (u'DNS', '*.files.saymedia-content.com'), (u'DNS', '*.ft.com'), (u'DNS', '*.meetupstatic.com'), (u'DNS', '*.nfl.com'), (u'DNS', '*.pagar.me'), (u'DNS', '*.picmonkey.com'), (u'DNS', '*.realself.com'), (u'DNS', '*.sbnation.com'), (u'DNS', '*.shakr.com'), (u'DNS', '*.streamable.com'), (u'DNS', '*.surfly.com'), (u'DNS', '*.theverge.com'), (u'DNS', '*.thrillist.com'), (u'DNS', '*.vox-cdn.com'), (u'DNS', '*.vox.com'), (u'DNS', '*.voxmedia.com'), (u'DNS', 'eater.com'), (u'DNS', 'ft.com'), (u'DNS', 'i.gse.io'), (u'DNS', 'picmonkey.com'), (u'DNS', 'realself.com'), (u'DNS', 'static.wixstatic.com'), (u'DNS', 'streamable.com'), (u'DNS', 'surfly.com'), (u'DNS', 'theverge.com'), (u'DNS', 'vox-cdn.com'), (u'DNS', 'vox.com'), (u'DNS', 'www.joyent.com')), 'subject': ((('countryName', u'US'),), (('stateOrProvinceName', u'California'),), (('localityName', u'San Francisco'),), (('organizationName', u'Fastly, Inc'),), (('commonName', u'r.ssl.fastly.net'),))}
|
||||
Exception:
|
||||
Traceback (most recent call last):
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/basecommand.py", line 215, in main
|
||||
status = self.run(options, args)
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/commands/install.py", line 335, in run
|
||||
wb.build(autobuilding=True)
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/wheel.py", line 749, in build
|
||||
self.requirement_set.prepare_files(self.finder)
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/req/req_set.py", line 380, in prepare_files
|
||||
ignore_dependencies=self.ignore_dependencies))
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/req/req_set.py", line 620, in _prepare_file
|
||||
session=self.session, hashes=hashes)
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/download.py", line 821, in unpack_url
|
||||
hashes=hashes
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/download.py", line 659, in unpack_http_url
|
||||
hashes)
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/download.py", line 853, in _download_http_url
|
||||
stream=True,
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/_vendor/requests/sessions.py", line 521, in get
|
||||
return self.request('GET', url, **kwargs)
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/download.py", line 386, in request
|
||||
return super(PipSession, self).request(method, url, *args, **kwargs)
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/_vendor/requests/sessions.py", line 508, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/_vendor/requests/sessions.py", line 618, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/_vendor/cachecontrol/adapter.py", line 47, in send
|
||||
resp = super(CacheControlAdapter, self).send(request, **kw)
|
||||
File "/usr/local/lib/python2.6/dist-packages/pip/_vendor/requests/adapters.py", line 506, in send
|
||||
raise SSLError(e, request=request)
|
||||
SSLError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Max retries exceeded with url: /packages/ef/ab/aa12712415809bf698e719b307419f953e25344e8f42d557533d7a02b276/netapp_lib-2020.7.16-py2-none-any.whl (Caused by SSLError(CertificateError("hostname 'files.pythonhosted.org' doesn't match either of 'r.ssl.fastly.net', '*.catchpoint.com', '*.cnn.io', '*.dollarshaveclub.com', '*.eater.com', '*.fastly.picmonkey.com', '*.files.saymedia-content.com', '*.ft.com', '*.meetupstatic.com', '*.nfl.com', '*.pagar.me', '*.picmonkey.com', '*.realself.com', '*.sbnation.com', '*.shakr.com', '*.streamable.com', '*.surfly.com', '*.theverge.com', '*.thrillist.com', '*.vox-cdn.com', '*.vox.com', '*.voxmedia.com', 'eater.com', 'ft.com', 'i.gse.io', 'picmonkey.com', 'realself.com', 'static.wixstatic.com', 'streamable.com', 'surfly.com', 'theverge.com', 'vox-cdn.com', 'vox.com', 'www.joyent.com'",),))
|
||||
ERROR: Command "/usr/bin/python2.6 /root/ansible/test/lib/ansible_test/_data/quiet_pip.py install --disable-pip-version-check -r /root/ansible/test/lib/ansible_test/_data/requirements/units.txt -r tests/unit/requirements.txt -c /root/ansible/test/lib/ansible_test/_data/requirements/constraints.txt" returned exit status 2.
|
||||
ERROR: Command "docker exec d47eb360db4ce779c1f690db964655b76e68895c4360ff252c46fe7fe6f5c75a /usr/bin/env ANSIBLE_TEST_CONTENT_ROOT=/root/ansible_collections/netapp/ontap LC_ALL=en_US.UTF-8 /usr/bin/python3.6 /root/ansible/bin/ansible-test units --metadata tests/output/.tmp/metadata-9i2qfrcl.json --truncate 200 --redact --color yes --requirements --python default --requirements-mode only" returned exit status 1.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
*One last thing...*
|
||||
|
||||
|
||||
*Please, complete **all** sections as described, this form
|
||||
is [processed automatically by a robot][ansibot help].*
|
||||
|
||||
|
||||
Thank you for your collaboration!
|
||||
|
||||
|
||||
[ansibot help]:
|
||||
/ansible/ansibotmini#ansibotmini
|
||||
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Code of Conduct
|
||||
description: |
|
||||
Read the [Ansible Code of Conduct][CoC] first.
|
||||
|
||||
[CoC]: https://docs.ansible.com/ansible/latest/community/code_of_conduct.html?utm_medium=github&utm_source=issue_form--bug_report.yml
|
||||
options:
|
||||
- label: I agree to follow the Ansible Code of Conduct
|
||||
required: true
|
||||
...
|
||||
26
.github/ISSUE_TEMPLATE/config.yml
vendored
26
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -1,26 +0,0 @@
|
||||
# Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser
|
||||
blank_issues_enabled: false # default: true
|
||||
contact_links:
|
||||
- name: 🔐 Security bug report 🔥
|
||||
url: https://docs.ansible.com/ansible/latest/community/reporting_bugs_and_features.html?utm_medium=github&utm_source=issue_template_chooser
|
||||
about: |
|
||||
Please learn how to report security vulnerabilities here.
|
||||
|
||||
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
|
||||
- name: 📝 Ansible Code of Conduct
|
||||
url: https://docs.ansible.com/ansible/latest/community/code_of_conduct.html?utm_medium=github&utm_source=issue_template_chooser
|
||||
about: ❤ Be nice to other members of the community. ☮ Behave.
|
||||
- name: 💬 Talks to the community
|
||||
url: https://docs.ansible.com/ansible/latest/community/communication.html?utm_medium=github&utm_source=issue_template_chooser#mailing-list-information
|
||||
about: Please ask and answer usage questions here
|
||||
- name: ⚡ Working groups
|
||||
url: https://github.com/ansible/community/wiki
|
||||
about: Interested in improving a specific area? Become a part of a working group!
|
||||
- name: 💼 For Enterprise
|
||||
url: https://www.ansible.com/products/engine?utm_medium=github&utm_source=issue_template_chooser
|
||||
about: Red Hat offers support for the Ansible Automation Platform
|
||||
212
.github/ISSUE_TEMPLATE/documentation_report.yml
vendored
212
.github/ISSUE_TEMPLATE/documentation_report.yml
vendored
@ -1,212 +0,0 @@
|
||||
---
|
||||
name: 📝 Documentation Report
|
||||
description: Ask us about docs
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
**Thank you for wanting to report a problem with ansible-core
|
||||
documentation!**
|
||||
|
||||
|
||||
Please fill out your suggestions below. If the problem seems
|
||||
straightforward, feel free to go ahead and
|
||||
[submit a pull request] instead!
|
||||
|
||||
|
||||
⚠
|
||||
Verify first that your issue is not [already reported on
|
||||
GitHub][issue search].
|
||||
|
||||
Also test if the latest release and devel branch are affected too.
|
||||
|
||||
|
||||
**Tip:** If you are seeking community support, please consider
|
||||
[starting a mailing list thread or chatting in IRC][ML||IRC].
|
||||
|
||||
|
||||
[ML||IRC]:
|
||||
https://docs.ansible.com/ansible-core/devel/community/communication.html?utm_medium=github&utm_source=issue_form--documentation_report.yml#mailing-list-information
|
||||
|
||||
[issue search]: ../search?q=is%3Aissue&type=issues
|
||||
|
||||
[submit a pull request]:
|
||||
https://docs.ansible.com/ansible-core/devel/community/documentation_contributions.html
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
**Check the repository for your issue.**
|
||||
|
||||
Source files for Ansible community documentation are
|
||||
hosted in different repositories. Please make sure to file an
|
||||
issue in the correct project.
|
||||
|
||||
Documentation for modules/plugins/etc that are officially
|
||||
supported by the Ansible Core Engineering team is available
|
||||
in this (`ansible/ansible`) repository.
|
||||
|
||||
The Installation Guide, Playbook Guide, Developer Guide,
|
||||
and other documentation is available in the
|
||||
[ansible/ansible-documentation] repository.
|
||||
Documentation for other modules/plugins/etc is likely to be
|
||||
available in one of the [Ansible Collections][collections index].
|
||||
If available in the collection documentation, select the
|
||||
**Issue Tracker** button to go directly to the GitHub issues.
|
||||
|
||||
|
||||
[ansible/ansible-documentation]: /ansible/ansible-documentation
|
||||
|
||||
[collections index]:
|
||||
https://docs.ansible.com/ansible/latest/collections/index.html
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Summary
|
||||
description: >
|
||||
Explain the problem briefly below, add suggestions to wording
|
||||
or structure.
|
||||
|
||||
|
||||
**HINT:** Did you know the documentation has a `View on GitHub`
|
||||
link on some pages? Feel free to use it to start a pull request
|
||||
right from the GitHub UI!
|
||||
placeholder: >-
|
||||
I was reading the ansible-core documentation of version X and I'm having
|
||||
problems understanding Y. It would be very helpful if that got
|
||||
rephrased as Z.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
attributes:
|
||||
label: Issue Type
|
||||
description: >
|
||||
Please select the single available option in the drop-down.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
<em>Why?</em>
|
||||
</summary>
|
||||
|
||||
|
||||
_We will make it easier in the future, once GitHub
|
||||
supports dropdown defaults. Promise!_
|
||||
|
||||
</details>
|
||||
# FIXME: Once GitHub allows defining the default choice, update this
|
||||
options:
|
||||
- Documentation Report
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Component Name
|
||||
description: >
|
||||
Write the short name of the rst file, module, plugin, task or
|
||||
feature below, *use your best guess if unsure*.
|
||||
|
||||
placeholder: lib/ansible/modules/copy.py
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Ansible Version
|
||||
description: >-
|
||||
Paste verbatim output from `ansible --version` below, under
|
||||
the prompt line. Please don't wrap it with triple backticks — your
|
||||
whole input will be turned into a code snippet automatically.
|
||||
render: console
|
||||
value: |
|
||||
$ ansible --version
|
||||
placeholder: |
|
||||
$ ansible --version
|
||||
ansible [core 2.11.0b4.post0] (detached HEAD ref: refs/) last updated 2021/04/02 00:33:35 (GMT +200)
|
||||
config file = None
|
||||
configured module search path = ['~/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
|
||||
ansible python module location = ~/src/github/ansible/ansible/lib/ansible
|
||||
ansible collection location = ~/.ansible/collections:/usr/share/ansible/collections
|
||||
executable location = bin/ansible
|
||||
python version = 3.9.0 (default, Oct 26 2020, 13:08:59) [GCC 10.2.0]
|
||||
jinja version = 2.11.3
|
||||
libyaml = True
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Configuration
|
||||
description: >-
|
||||
Paste verbatim output from `ansible-config dump --only-changed -t all` below, under the prompt line.
|
||||
(if using a version older than ansible-core 2.12 you should omit the '-t all')
|
||||
Please don't wrap it with triple backticks — your
|
||||
whole input will be turned into a code snippet automatically.
|
||||
render: console
|
||||
value: |
|
||||
# if using a version older than ansible-core 2.12 you should omit the '-t all'
|
||||
$ ansible-config dump --only-changed -t all
|
||||
placeholder: |
|
||||
# if using a version older than ansible-core 2.12 you should omit the '-t all'
|
||||
$ ansible-config dump --only-changed -t all
|
||||
DEFAULT_GATHERING(~/src/github/ansible/ansible/ansible.cfg) = smart
|
||||
DEFAULT_HOST_LIST(~/src/github/ansible/ansible/ansible.cfg) = ['~/src/github/ansible/ansible/hosts']
|
||||
DEFAULT_VAULT_PASSWORD_FILE(~/src/github/ansible/ansible/ansible.cfg) = ~/src/github/ansible/ansible/vault/print-password.sh
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: OS / Environment
|
||||
description: >-
|
||||
Provide all relevant information below, e.g. OS version,
|
||||
browser, etc.
|
||||
placeholder: Fedora 33, Firefox etc.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional Information
|
||||
description: |
|
||||
Describe how this improves the documentation, e.g. before/after situation or screenshots.
|
||||
|
||||
**HINT:** You can paste https://gist.github.com links for larger files.
|
||||
placeholder: >-
|
||||
When the improvement is applied, it makes it more straightforward
|
||||
to understand X.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
*One last thing...*
|
||||
|
||||
|
||||
*Please, complete **all** sections as described, this form
|
||||
is [processed automatically by a robot][ansibot help].*
|
||||
|
||||
|
||||
Thank you for your collaboration!
|
||||
|
||||
|
||||
[ansibot help]:
|
||||
/ansible/ansibotmini#ansibotmini
|
||||
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Code of Conduct
|
||||
description: |
|
||||
Read the [Ansible Code of Conduct][CoC] first.
|
||||
|
||||
[CoC]: https://docs.ansible.com/ansible/latest/community/code_of_conduct.html?utm_medium=github&utm_source=issue_form--documentation_report.yml
|
||||
options:
|
||||
- label: I agree to follow the Ansible Code of Conduct
|
||||
required: true
|
||||
...
|
||||
192
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
192
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@ -1,192 +0,0 @@
|
||||
---
|
||||
name: ✨ Feature request
|
||||
description: Suggest an idea for this project
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
**Thank you for wanting to suggest a feature for ansible-core!**
|
||||
|
||||
|
||||
|
||||
💡
|
||||
Before you go ahead with your request, please first consider if it
|
||||
would be useful for majority of the ansible-core users. As a
|
||||
general rule of thumb, any feature that is only of interest to a
|
||||
small sub group should be [implemented in a third-party Ansible
|
||||
Collection][contribute to collections] or maybe even just your
|
||||
project alone. Be mindful of the fact that the essential
|
||||
ansible-core features have a broad impact.
|
||||
|
||||
If unsure, consider filing a [new proposal] instead outlining your
|
||||
use-cases, the research and implementation considerations. Then,
|
||||
start a discussion on one of the public [IRC meetings] we have just
|
||||
for this.
|
||||
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
❗ Every change breaks someone's workflow.
|
||||
</summary>
|
||||
|
||||
|
||||
[
|
||||
](https://xkcd.com/1172/)
|
||||
</details>
|
||||
|
||||
|
||||
⚠
|
||||
Verify first that your idea is not [already requested on
|
||||
GitHub][issue search].
|
||||
|
||||
Also test if the devel branch does not already implement this.
|
||||
|
||||
|
||||
**Tip:** If you are seeking community support, please consider
|
||||
[starting a mailing list thread or chatting in IRC][ML||IRC].
|
||||
|
||||
|
||||
|
||||
[contribute to collections]:
|
||||
https://docs.ansible.com/ansible-core/devel/community/contributing_maintained_collections.html?utm_medium=github&utm_source=issue_form--feature_request.yml
|
||||
|
||||
[IRC meetings]:
|
||||
https://docs.ansible.com/ansible-core/devel/community/communication.html?utm_medium=github&utm_source=issue_form--feature_request.yml#irc-meetings
|
||||
|
||||
[issue search]: ../search?q=is%3Aissue&type=issues
|
||||
|
||||
[ML||IRC]:
|
||||
https://docs.ansible.com/ansible-core/devel/community/communication.html?utm_medium=github&utm_source=issue_form--feature_request.yml#mailing-list-information
|
||||
|
||||
[new proposal]: ../../proposals/issues/new
|
||||
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Summary
|
||||
description: >
|
||||
Describe the new feature/improvement you would like briefly below.
|
||||
|
||||
|
||||
What's the problem this feature will solve?
|
||||
|
||||
What are you trying to do, that you are unable to achieve
|
||||
with ansible-core as it currently stands?
|
||||
|
||||
|
||||
* Provide examples of real-world use cases that this would enable
|
||||
and how it solves the problem you described.
|
||||
|
||||
* How do you solve this now?
|
||||
|
||||
* Have you tried to work around the problem using other tools?
|
||||
|
||||
* Could there be a different approach to solving this issue?
|
||||
|
||||
|
||||
*Know **exactly** what you want?* Consider filing a [new proposal]
|
||||
instead outlining your research and implementation considerations.
|
||||
|
||||
|
||||
[new proposal]: ../../proposals/issues/new
|
||||
placeholder: >-
|
||||
I am trying to do X with ansible-core from the devel branch on GitHub and
|
||||
I think that implementing a feature Y would be very helpful for me and
|
||||
every other user of ansible-core because of Z.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
attributes:
|
||||
label: Issue Type
|
||||
description: >
|
||||
Please select the single available option in the drop-down.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
<em>Why?</em>
|
||||
</summary>
|
||||
|
||||
We would do it by ourselves but unfortunatelly, the curent
|
||||
edition of GitHub Issue Forms Alpha does not support this yet 🤷
|
||||
|
||||
|
||||
_We will make it easier in the future, once GitHub
|
||||
supports dropdown defaults. Promise!_
|
||||
|
||||
</details>
|
||||
# FIXME: Once GitHub allows defining the default choice, update this
|
||||
options:
|
||||
- Feature Idea
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Component Name
|
||||
description: >
|
||||
Write the short name of the module, plugin, task or feature below,
|
||||
*use your best guess if unsure*.
|
||||
|
||||
|
||||
Be aware that a lot of content that used to reside in this repository
|
||||
previously, is now hosted under [individual collection
|
||||
projects][collections org].
|
||||
If this is the case, please make sure to file an issue under the
|
||||
appropriate project there instead.
|
||||
|
||||
|
||||
[collections org]: /ansible-collections
|
||||
placeholder: dnf, apt, yum, pip, user etc.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional Information
|
||||
description: |
|
||||
Describe how the feature would be used, why it is needed and what it would solve.
|
||||
|
||||
**HINT:** You can paste https://gist.github.com links for larger files.
|
||||
value: |
|
||||
<!--- Paste example playbooks or commands between quotes below -->
|
||||
```yaml (paste below)
|
||||
|
||||
```
|
||||
placeholder: >-
|
||||
I asked on https://stackoverflow.com/.... and the community
|
||||
advised me to do X, Y and Z.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
*One last thing...*
|
||||
|
||||
|
||||
*Please, complete **all** sections as described, this form
|
||||
is [processed automatically by a robot][ansibot help].*
|
||||
|
||||
|
||||
Thank you for your collaboration!
|
||||
|
||||
|
||||
[ansibot help]:
|
||||
/ansible/ansibotmini#ansibotmini
|
||||
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Code of Conduct
|
||||
description: |
|
||||
Read the [Ansible Code of Conduct][CoC] first.
|
||||
|
||||
[CoC]: https://docs.ansible.com/ansible/latest/community/code_of_conduct.html?utm_medium=github&utm_source=issue_form--feature_request.yml
|
||||
options:
|
||||
- label: I agree to follow the Ansible Code of Conduct
|
||||
required: true
|
||||
...
|
||||
25
.github/PULL_REQUEST_TEMPLATE.md
vendored
25
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,25 +0,0 @@
|
||||
##### SUMMARY
|
||||
|
||||
<!--- Describe the change below, including rationale and design decisions -->
|
||||
|
||||
<!--- HINT: Include "Fixes #nnn" if you are fixing an existing issue -->
|
||||
|
||||
##### ISSUE TYPE
|
||||
|
||||
<!--- Pick one below and delete the rest -->
|
||||
|
||||
- Bugfix Pull Request
|
||||
- Docs Pull Request
|
||||
- Feature Pull Request
|
||||
- Test Pull Request
|
||||
|
||||
##### ADDITIONAL INFORMATION
|
||||
|
||||
<!--- Include additional information to help people understand the change here -->
|
||||
<!--- A step-by-step reproduction of the problem is helpful if there is no related issue -->
|
||||
|
||||
<!--- Paste verbatim command output below, e.g. before and after your change -->
|
||||
|
||||
```paste below
|
||||
|
||||
```
|
||||
17
.github/RELEASE_NAMES.txt
vendored
17
.github/RELEASE_NAMES.txt
vendored
@ -1,17 +0,0 @@
|
||||
2.16.0 All My Love
|
||||
2.15.0 Ten Years Gone
|
||||
2.14.0 C'mon Everybody
|
||||
2.13.0 Nobody's Fault but Mine
|
||||
2.12.0 Dazed and Confused
|
||||
2.11.0 Hey Hey, What Can I Do
|
||||
2.10.0 When the Levee Breaks
|
||||
2.9.0 Immigrant Song
|
||||
2.8.0 How Many More Times
|
||||
2.7.0 In the Light
|
||||
2.6.0 Heartbreaker
|
||||
2.5.0 Kashmir
|
||||
2.4.0 Dancing Days
|
||||
2.3.0 Ramble On
|
||||
2.2.0 The Battle of Evermore
|
||||
2.1.0 The Song Remains the Same
|
||||
2.0.0 Over the Hills and Far Away
|
||||
15
.github/SECURITY.md
vendored
15
.github/SECURITY.md
vendored
@ -1,15 +0,0 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Ansible applies security fixes according to the 3-versions-back support
|
||||
policy. Please find more information in [our docs](
|
||||
https://docs.ansible.com/ansible/devel/reference_appendices/release_and_maintenance.html#release-status
|
||||
).
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
We encourage responsible disclosure practices for security
|
||||
vulnerabilities. Please read our [policies for reporting bugs](
|
||||
https://docs.ansible.com/ansible/devel/community/reporting_bugs_and_features.html#reporting-a-bug
|
||||
) if you want to report a security issue that might affect Ansible.
|
||||
106
.gitignore
vendored
106
.gitignore
vendored
@ -2,10 +2,9 @@
|
||||
*.py[co]
|
||||
build
|
||||
AUTHORS.TXT
|
||||
# Emacs backup and autosave files...
|
||||
# Emacs backup files...
|
||||
*~
|
||||
.\#*
|
||||
\#*
|
||||
# RPM stuff...
|
||||
MANIFEST
|
||||
dist
|
||||
@ -17,108 +16,23 @@ rpm-build
|
||||
.idea
|
||||
#IntelliJ IDEA stuff..
|
||||
*.iml
|
||||
#VSCode stuff..
|
||||
.vscode/
|
||||
# Mac OS X stuff...
|
||||
.DS_Store
|
||||
# manpage build stuff...
|
||||
docs/man/man1/ansible*.1
|
||||
docs/man/man1/ansible*.1.asciidoc.in
|
||||
docs/man/man3/*
|
||||
# Sublime stuff
|
||||
*.sublime-project
|
||||
*.sublime-workspace
|
||||
# docsite stuff...
|
||||
docs/docsite/_build
|
||||
docs/docsite/*.html
|
||||
docs/docsite/htmlout
|
||||
docs/docsite/rst/conf.py
|
||||
docs/docsite/rst/index.rst
|
||||
docs/docsite/rst/cli/ansible-*.rst
|
||||
docs/docsite/rst/cli/ansible.rst
|
||||
docs/docsite/rst/dev_guide/collections_galaxy_meta.rst
|
||||
docs/docsite/rst/dev_guide/testing/sanity/index.rst.new
|
||||
docs/docsite/rst/dev_guide/index.rst
|
||||
docs/docsite/rst/modules/*.rst
|
||||
docs/docsite/rst/collections/*.rst
|
||||
!docs/docsite/rst/collections/all_plugins.rst
|
||||
docs/docsite/rst/collections/*/*.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/_static/*.gif
|
||||
docs/docsite/_static/*.png
|
||||
docs/docsite/_static/websupport.js
|
||||
docsite/latest/rst/modules
|
||||
docsite/latest/*.html
|
||||
docsite/latest/_static/*.gif
|
||||
docsite/latest/_static/*.png
|
||||
docsite/latest/_static/websupport.js
|
||||
docsite/latest/searchindex.js
|
||||
docsite/latest/htmlout
|
||||
# deb building stuff...
|
||||
debian/
|
||||
# Vim swap files
|
||||
*.swp
|
||||
*.swo
|
||||
[._]*.un~
|
||||
credentials.yml
|
||||
# test output
|
||||
*.retry
|
||||
*.out
|
||||
.pytest_cache/
|
||||
.tox
|
||||
.cache
|
||||
.pytest_cache
|
||||
results.xml
|
||||
coverage.xml
|
||||
/test/units/cover-html
|
||||
/test/integration/inventory
|
||||
/test/integration/targets/*/backup/
|
||||
/test/cache/*
|
||||
# Development
|
||||
/test/develop
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
venv
|
||||
env
|
||||
Vagrantfile
|
||||
.vagrant
|
||||
# Backwards compatibility with `stable-2.9` and earlier branches.
|
||||
# Also used in the `devel` branch during early Ansible 2.10 development.
|
||||
/lib/ansible.egg-info/
|
||||
# First used in the `devel` branch during Ansible 2.10 development.
|
||||
/lib/ansible_base.egg-info/
|
||||
# First used in the `devel` branch during Ansible 2.11 development.
|
||||
/lib/ansible_core.egg-info/
|
||||
# vendored lib dir
|
||||
lib/ansible/_vendor/*
|
||||
!lib/ansible/_vendor/__init__.py
|
||||
# test stuff
|
||||
/test/integration/cloud-config-*.*
|
||||
!/test/integration/cloud-config-*.*.template
|
||||
.python-version
|
||||
# Release directory
|
||||
packaging/release/ansible_release
|
||||
/.cache/
|
||||
/test/results/
|
||||
/test/integration/cloud-config-aws.yml
|
||||
/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
|
||||
.ackrc
|
||||
# default 'coverage html' results
|
||||
htmlcov/
|
||||
# default 'coverage' tool data
|
||||
.coverage
|
||||
# ansible-test coverage results
|
||||
test/units/.coverage.*
|
||||
/test/integration/cloud-config-azure.yml
|
||||
/SYMLINK_CACHE.json
|
||||
changelogs/.plugin-cache.yaml
|
||||
.ansible-test-timeout.json
|
||||
|
||||
36
.mailmap
36
.mailmap
@ -1,36 +0,0 @@
|
||||
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@ansible.com>
|
||||
<bcoca@ansible.com> <brian.coca+git@gmail.com>
|
||||
<bcoca@ansible.com> <briancoca+ansible@gmail.com>
|
||||
<bcoca@ansible.com> <briancoca+dev@gmail.com>
|
||||
<bcoca@ansible.com> <bcoca@tablethotels.com>
|
||||
<a.badger@gmail.com> <toshio@fedoraproject.org>
|
||||
James Tanner <tanner.jc@gmail.com>
|
||||
<jimi@sngx.net> <jcammarata@ansibleworks.com>
|
||||
Michael Scherer <misc@zarb.org> mscherer <misc@zarb.org>
|
||||
<misc@zarb.org> <misc@ephaone.org>
|
||||
<misc@zarb.org> <mscherer@users.noreply.github.com>
|
||||
James Martin <jmartin@ansible.com> <jmartin@basho.com>
|
||||
James Laska <jlaska@ansible.com> <jlaska@redhat.com>
|
||||
James Laska <jlaska@ansible.com> <jlaska@ansibleworks.com>
|
||||
James Laska <jlaska@ansible.com> <jlaska@James-Laskas-MacBook-Pro.local>
|
||||
James Laska <jlaska@ansible.com> <jlaska@users.noreply.github.com>
|
||||
Jason McKerr <mckerrj@gmail.com> <jmckerr@jmckerr-OSX.local>
|
||||
Chris Houseknecht <chouseknecht@ansible.com>
|
||||
Chris Houseknecht <chouseknecht@ansible.com> chouseknecht <chouse@ansible.com>
|
||||
Chris Houseknecht <chouseknecht@ansible.com> Chris Houseknecht <chouse@ansibleworks.com>
|
||||
Stephen Fromm <sfromm@gmail.com> Stephen Fromm <stephenf@nero.net>
|
||||
Sandra Wills <docschick@ansible.com> Sandra Wills <swills@ansible.com>
|
||||
Will Thames <will@thames.id.au> willthames <will@thames.id.au>
|
||||
Will Thames <will@thames.id.au> Will Thames <willdthames@gmail.com>
|
||||
Will Thames <will@thames.id.au> willthames <willdthames@gmail.com>
|
||||
Will Thames <will@thames.id.au> willthames <will@musc.org.uk>
|
||||
Will Thames <will@thames.id.au> u348095 <will.thames@suncorp.com.au>
|
||||
Will Thames <will@thames.id.au> willthames <will.thames@suncorp.com.au>
|
||||
Will Thames <will@thames.id.au> Will Thames <will.thames@xvt.com.au>
|
||||
nitzmahone <mdavis@ansible.com> Matt Davis <nitzmahone@users.noreply.github.com>
|
||||
Dag Wieers <dag@wieers.com> Dag Wieërs <dag@wieers.com>
|
||||
Dag Wieers <dag@wieers.com> Dag Wieers <dag.wieers@gmail.com>
|
||||
Rene Moser <mail@renemoser.net> René Moser <mail@renemoser.net>
|
||||
Rene Moser <mail@renemoser.net> Rene Moser <rene.moser@swisstxt.ch>
|
||||
961
CHANGELOG.md
Normal file
961
CHANGELOG.md
Normal file
@ -0,0 +1,961 @@
|
||||
Ansible Changes By Release
|
||||
==========================
|
||||
|
||||
1.4 "Could This Be Magic" - Release pending!
|
||||
|
||||
Highlighted new features:
|
||||
|
||||
* TBA
|
||||
|
||||
New modules:
|
||||
|
||||
* TBA
|
||||
|
||||
Misc changes:
|
||||
|
||||
* TBA
|
||||
|
||||
1.3.2 "Top of the World" (reprise) - September 19th, 2013
|
||||
|
||||
* The ControlPath variable for ssh connections is now configurable in the ansible.cfg (and via the environment variable ANSIBLE_SSH_CONTROL_PATH).
|
||||
* Added a -vvvv level, which will show SSH client debugging information in the event of a failure.
|
||||
* Fixed bug in apt_repository module where the repository cache was not being updated.
|
||||
* Fixed bug where "too many open files" errors would be encountered due to pseudo TTY's not being closed properly.
|
||||
|
||||
1.3.1 "Top of the World" (reprise) - September 16th, 2013
|
||||
|
||||
* Fixing a bug in accelerate mode whereby the gather_facts step would always be run via sudo regardless of the play settings.
|
||||
|
||||
1.3 "Top of the World" - September 13th, 2013
|
||||
|
||||
Highlighted new features:
|
||||
|
||||
* accelerated mode: An enhanced fireball mode that requires zero bootstrapping and fewer requirements plus adds capabilities like sudo commands.
|
||||
* role defaults: Allows roles to define a set of variables at the lowest priority. These variables can be overridden by any other variable.
|
||||
* new /etc/ansible/facts.d allows JSON or INI-style facts to be provided from the remote node, and supports executable fact programs in this dir. Files must end in *.fact.
|
||||
* added the ability to make undefined template variables raise errors (see ansible.cfg)
|
||||
* (DOCS PENDING) sudo: True/False and sudo_user: True/False can be set at include and role level
|
||||
* added changed_when: (expression) which allows overriding whether a result is changed or not and can work with registered expressions
|
||||
* --extra-vars can now take a file as input, e.g., "-e @filename" and can also be formatted as YAML
|
||||
* external inventory scripts may now return host variables in one pass, which allows them to be much more efficient for large numbers of hosts
|
||||
* if --forks exceeds the numbers of hosts, it will be automatically reduced. Set forks to 0 and you get "as many forks as I have hosts" out of the box.
|
||||
* enabled error_on_undefined_vars by default, which will make errors in playbooks more obvious
|
||||
* role dependencies -- one role can now pull in another, with parameters of its own.
|
||||
* added the ability to have tasks execute even during a check run (always_run).
|
||||
* added the ability to set the maximum failure percentage for a group of hosts.
|
||||
|
||||
New modules:
|
||||
|
||||
* notifications: datadog_event -- send data to datadog
|
||||
* cloud: digital_ocean -- module for DigitalOcean provisioning that also includes inventory support
|
||||
* cloud: rds -- Amazon Relational Database Service
|
||||
* cloud: linode -- modules for Linode provisioning that also includes inventory support
|
||||
* cloud: route53 -- manage Amazon DNS entries
|
||||
* cloud: ec2_ami -- manages (and creates!) ec2 AMIs
|
||||
* database: mysql_replication -- manages mysql replication settings for masters/slaves
|
||||
* database: mysql_variables -- manages mysql runtime variables
|
||||
* database: redis -- manages redis databases (slave mode and flushing data)
|
||||
* net_infrastructure: arista_interface
|
||||
* net_infrastructure: arista_lag
|
||||
* net_infrastructure: arista_l2interface
|
||||
* net_infrastructure: arista_vlan
|
||||
* system: stat -- reports on stat(istics) of remote files, for use with 'register'
|
||||
* web_infrastructure: htpasswd -- manipulate htpasswd files
|
||||
* packaging: rpm_key -- adds or removes RPM signing keys
|
||||
* packaging: apt_repository -- rewritten to remove dependencies
|
||||
* monitoring: boundary_meter -- adds or removes boundary.com meters
|
||||
* net_infrastructure: dnsmadeeasy - manipulate DNS Made Easy records
|
||||
* files: xattr -- manages extended attributes on files
|
||||
|
||||
Misc changes:
|
||||
|
||||
* return 3 when there are hosts that were unreachable during a run
|
||||
* the yum module now supports wildcard values for the enablerepo argument
|
||||
* added an inventory script to pull host information from Zabbix
|
||||
* async mode no longer allows with_* lookup plugins due to incompatibilities
|
||||
* Added OpenRC support (Gentoo) to the service module
|
||||
* ansible_ssh_user value is available to templates
|
||||
* added placement_group parameter to ec2 module
|
||||
* new sha256sum parameter added to get_url module for checksum validation
|
||||
* search for mount binaries in system path and sbin vs assuming path
|
||||
* allowed inventory file to be read from a pipe
|
||||
* added Solaris distribution facts
|
||||
* fixed bug along error path in quantum_network module
|
||||
* user password update mode is controllable in user module now (at creation vs. every time)
|
||||
* added check mode support to the OpenBSD package module
|
||||
* Fix for MySQL 5.6 compatibility
|
||||
* HP UX virtualization facts
|
||||
* fixed some executable bits in git
|
||||
* made rhn_register module compatible with EL5
|
||||
* fix for setup module epoch time on Solaris
|
||||
* sudo_user is now expanded later, allowing it to be set at inventory scope
|
||||
* mongodb_user module changed to also support MongoDB 2.2
|
||||
* new state=hard option added to the file module for hardlinks vs softlinks
|
||||
* fixes to apt module purging option behavior
|
||||
* fixes for device facts with multiple PCI domains
|
||||
* added "with_inventory_hostnames" lookup plugin, which can take a pattern and loop over hostnames matching the pattern and is great for use with delegate_to and so on
|
||||
* ec2 module supports adding to multiple security groups
|
||||
* cloudformation module includes fixes for the error path, and the 'wait_for' parameter was removed
|
||||
* added --only-if-changed to ansible-pull, which runs only if the repo has changes (not default)
|
||||
* added 'mandatory', a Jinja2 filter that checks if a variable is defined: {{ foo|mandatory }}
|
||||
* added support for multiple size formats to the lvol module
|
||||
* timing reporting on wait_for module now includes the delay time
|
||||
* IRC module can now send a server password
|
||||
* "~" now expanded on each component of configured plugin paths
|
||||
* fix for easy_install module when dealing with virtualenv
|
||||
* rackspace module now explicitly indicates rackspace vs vanilla openstack
|
||||
* add_host module does not report changed=True any longer
|
||||
* explanatory error message when using fireball with sudo has been improved
|
||||
* git module now automatically pulls down git submodules
|
||||
* negated patterns do not require "all:!foo", you can just say "!foo" now to select all not foos
|
||||
* fix for Debian services always reporting changed when toggling enablement bit
|
||||
* roles files now tolerate files named 'main.yaml' and 'main' in addition to main.yml
|
||||
* some help cleanup to command line flags on scripts
|
||||
* force option reinstated for file module so it can create symlinks to non-existent files, etc.
|
||||
* added termination support to ec2 module
|
||||
* --ask-sudo-pass or --sudo-user does not enable all options to use sudo in ansible-playbook
|
||||
* include/role conditionals are added ahead of task conditionals so they can short circuit properly
|
||||
* added pipes.quote in various places so paths with spaces are better tolerated
|
||||
* error handling while executing Jinja2 filters has been improved
|
||||
* upgrades to atomic replacement logic when copying files across partitions/etc
|
||||
* mysql user module can try to login before requiring explicit password
|
||||
* various additional options added to supervisorctl module
|
||||
* only add non unique parameter on group creation when required
|
||||
* allow rabbitmq_plugin to specify a non-standard RabbitMQ path
|
||||
* authentication fixes to keystone_user module
|
||||
* added IAM role support to EC2 module
|
||||
* fixes for OpenBSD package module to avoid shell expansion
|
||||
* git module upgrades to allow --depth and --version to be used together
|
||||
* new lookup plugin, "with_flattened"
|
||||
* extra vars (-e) variables can be used in playbook include paths
|
||||
* improved reporting for invalid sudo passwords
|
||||
* improved reporting for inability to find a suitable tmp location
|
||||
* require libselinux-python to perform file operations if SELinux is operational
|
||||
* ZFS module fixes for byte display constants and handling paths with spaces
|
||||
* setup module more tolerant of gathering facts against things it does not have permission to read
|
||||
* can specify name=* state=latest to update all yum modules
|
||||
* major speedups to the yum module for default cases
|
||||
* ec2_facts module will now run in check mode
|
||||
* sleep option on service module for sleeping between stop/restart
|
||||
* fix for IPv6 facts on BSD
|
||||
* added Jinja2 filters: skipped, whether a result was skipped
|
||||
* added Jinja2 filters: quote, quotes a string if it needs to be quoted
|
||||
* allow force=yes to affect apt upgrades
|
||||
* fix for saving conditionals in variable names
|
||||
* support for multiple host ranges in INI inventory, e.g., db[01:10:3]node-[01:10]
|
||||
* fixes/improvements to cron module
|
||||
* add user_install=no option to gem module to install gems system wide
|
||||
* added raw=yes to allow copying without python on remote machines
|
||||
* added with_indexed_items lookup plugin
|
||||
* Linode inventory plugin now significantly faster
|
||||
* added recurse=yes parameter to pacman module for package removal
|
||||
* apt_key module can now target specific keyrings (keyring=filename)
|
||||
* ec2 module change reporting improved
|
||||
* hg module now expands user paths (~)
|
||||
* SSH connection type known host checking now can process hashed known_host files
|
||||
* lvg module now checks for executables in more correct locations
|
||||
* copy module now works correctly with sudo_user
|
||||
* region parameter added to ec2_elb module
|
||||
* better default XMPP module message types
|
||||
* fixed conditional tests against raw booleans
|
||||
* mysql module grant removal is now smarter
|
||||
* apt-remove is now forced to be non-interactive
|
||||
* support ; comments in INI file module
|
||||
* fixes to callbacks WRT async output (fire and forget tasks now trigger callbacks!)
|
||||
* folder support for s3 module
|
||||
* added new example inventory plugin for Red Hat OpenShift
|
||||
* and other misc. bugfixes
|
||||
|
||||
1.2.3 "Hear About It Later" (reprise) -- Aug 21, 2013
|
||||
|
||||
* Local security fixes for predictable file locations for ControlPersist and retry file paths on shared machines
|
||||
on operating systems without kernel symlink/hardlink protections.
|
||||
|
||||
1.2.2 "Hear About It Later" (reprise) -- July 4, 2013
|
||||
|
||||
* Added a configuration file option [paramiko_connection] record_host_keys which allows the code that paramiko uses
|
||||
to update known_hosts to be disabled. This is done because paramiko can be very slow at doing this if you have a
|
||||
large number of hosts and some folks may not want this behavior. This can be toggled independently of host key checking
|
||||
and does not affect the ssh transport plugin. Use of the ssh transport plugin is preferred if you have ControlPersist
|
||||
capability, and Ansible by default in 1.2.1 and later will autodetect.
|
||||
|
||||
1.2.1 "Hear About It Later" -- July 4, 2013
|
||||
|
||||
* Connection default is now "smart", which discovers if the system openssh can support ControlPersist, and uses
|
||||
it if so, if not falls back to paramiko.
|
||||
* Host key checking is on by default. Disable it if you like by adding host_key_checking=False in the [default]
|
||||
section of /etc/ansible/ansible.cfg or ~/ansible.cfg or by exporting ANSIBLE_HOST_KEY_CHECKING=False
|
||||
* Paramiko now records host keys it was in contact with host key checking is on. It is somewhat sluggish when doing this,
|
||||
so switch to the 'ssh' transport if this concerns you.
|
||||
|
||||
1.2 "Right Now" -- June 10, 2013
|
||||
|
||||
Core Features:
|
||||
|
||||
* capability to set 'all_errors_fatal: True' in a playbook to force any error to stop execution versus
|
||||
a whole group or serial block needing to fail
|
||||
usable, without breaking the ability to override in ansible
|
||||
* ability to use variables from {{ }} syntax in mainline playbooks, new 'when' conditional, as detailed
|
||||
in documentation. Can disable old style replacements in ansible.cfg if so desired, but are still active
|
||||
by default.
|
||||
* can set ansible_ssh_private_key_file as an inventory variable (similar to ansible_ssh_host, etc)
|
||||
* 'when' statement can be affixed to task includes to auto-affix the conditional to each task therein
|
||||
* cosmetic: "*****" banners in ansible-playbook output are now constant width
|
||||
* --limit can now be given a filename (--limit @filename) to constrain a run to a host list on disk
|
||||
* failed playbook runs will create a retry file in /var/tmp/ansible usable with --limit
|
||||
* roles allow easy arrangement of reusable tasks/handlers/files/templates
|
||||
* pre_tasks and post_tasks allow for separating tasks into blocks where handlers will fire around them automatically
|
||||
* "meta: flush_handler" task capability added for when you really need to force handlers to run
|
||||
* new --start-at-task option to ansible playbook allows starting at a specific task name in a long playbook
|
||||
* added a log file for ansible/ansible-playbook, set 'log_path' in the configuration file or ANSIBLE_LOG_PATH in environment
|
||||
* debug mode always outputs debug in playbooks, without needing to specify -v
|
||||
* external inventory script added for Spacewalk / Red Hat Satellite servers
|
||||
* It is now possible to feed JSON structures to --extra-vars. Pass in a JSON dictionary/hash to feed in complex data.
|
||||
* group_vars/ and host_vars/ directories can now be kept alongside the playbook as well as inventory (or both!)
|
||||
* more filters: ability to say {{ foo|success }} and {{ foo|failed }} and when: foo|success and when: foo|failed
|
||||
* more filters: {{ path|basename }} and {{ path|dirname }}
|
||||
* lookup plugins now use the basedir of the file they have included from, avoiding needs of ../../../ in places and
|
||||
increasing the ease at which things can be reorganized.
|
||||
|
||||
Modules added:
|
||||
|
||||
* cloud: rax: module for creating instances in the rackspace cloud (uses pyrax)
|
||||
* packages: npm: node.js package management
|
||||
* packages: pkgng: next-gen package manager for FreeBSD
|
||||
* packages: redhat_subscription: manage Red Hat subscription usage
|
||||
* packages: rhn_register: basic RHN registration
|
||||
* packages: zypper (SuSE)
|
||||
* database: postgresql_priv: manages postgresql priveledges
|
||||
* networking: bigip_pool: load balancing with F5s
|
||||
* networking: ec2_elb: add and remove machines from ec2 elastic load balancers
|
||||
* notification: hipchat: send notification events to hipchat
|
||||
* notification: flowdock: send messages to flowdock during playbook runs
|
||||
* notification: campfire: send messages to campfire during playbook runs
|
||||
* notification: mqtt: send messages to the Mosquitto message bus
|
||||
* notification: irc: send messages to IRC channels
|
||||
* notification: filesystem - a wrapper around mkfs
|
||||
* notification: jabber: send jabber chat messages
|
||||
* notification: osx_say: make OS X say things out loud
|
||||
* openstack: keystone_user
|
||||
* openstack: glance_image
|
||||
* openstack: nova_compute
|
||||
* openstack: nova_keypair
|
||||
* openstack: quantum_floating_ip
|
||||
* openstack: quantum_floating_ip_associate
|
||||
* openstack: quantum_network
|
||||
* openstack: quantum_router
|
||||
* openstack: quantum_router_gateway
|
||||
* openstack: quantum_router_interface
|
||||
* openstack: quantum_subnet
|
||||
* monitoring: newrelic_deployment: notifies newrelic of new deployments
|
||||
* monitoring: airbrake_deployment - notify airbrake of new deployments
|
||||
* monitoring: pingdom
|
||||
* monitoring: pagerduty
|
||||
* monitoring: monit
|
||||
* utility: set_fact: sets a variable, which can be the result of a template evaluation
|
||||
|
||||
Modules removed
|
||||
|
||||
* vagrant -- can't be compatible with both versions at once, just run things though the vagrant provisioner in vagrant core
|
||||
|
||||
Bugfixes and Misc Changes:
|
||||
|
||||
* service module happier if only enabled=yes|no specified and no state
|
||||
* mysql_db: use --password= instead of -p in dump/import so it doesn't go interactive if no pass set
|
||||
* when using -c ssh and the ansible user is the current user, don't pass a -o to allow SSH config to be
|
||||
* overwrite parameter added to the s3 module
|
||||
* private_ip parameter added to the ec2 module
|
||||
* $FILE and $PIPE now tolerate unicode
|
||||
* various plugin loading operations have been made more efficient
|
||||
* hostname now uses platform.node versus socket.gethostname to be more consistant with Unix 'hostname'
|
||||
* fix for SELinux operations on Unicode path names
|
||||
* inventory directory locations now ignore files with .ini extensions, making hybrid inventory easier
|
||||
* copy module in check-mode now reports back correct changed status when used with force=no
|
||||
* added avail. zone to ec2 module
|
||||
* fixes to the hash variable merging logic if so enabled in the main settings file (default is to replace, not merge hashes)
|
||||
* group_vars and host_vars files can now end in a .yaml or .yml extension, (previously required no extension, still favored)
|
||||
* ec2vol module improvements
|
||||
* if the user module is told to generate the ssh key, the key generated is now returned in the results
|
||||
* misc fixes to the Riak module
|
||||
* make template module slightly more efficient
|
||||
* base64encode / decode filters are now available to templates
|
||||
* libvirt module can now work with multiple different libvirt connecton URIs
|
||||
* fix for postgresql password escaping
|
||||
* unicode fix for shlex.split in some cases
|
||||
* apt module upgrade logic improved
|
||||
* URI module now can follow redirects
|
||||
* yum module can now install off http URLs
|
||||
* sudo password now defaults to ssh password if you ask for both and just hit enter on the second prompt
|
||||
* validate feature on copy and template module, for example, running visudo prior to copying the file over
|
||||
* network facts upgraded to return advanced configs (bonding, etc)
|
||||
* region support added to ec2 module
|
||||
* riak module gets a wait for ring option
|
||||
* improved check mode support in the file module
|
||||
* exception handling added to handle scenario when attempt to log to systemd journal fails
|
||||
* fix for upstart handling when toggling the enablement and running bits at the same time
|
||||
* when registering a task with a conditional attached, and the task is skipped by the conditional,
|
||||
the variable is still registered for the host, with the attribute skipped: True.
|
||||
* delegate_to tasks can look up ansible_ssh_private_key_file variable from inventory correctly now
|
||||
* s3 module takes a 'dest' parameter to change the destination for uploads
|
||||
* apt module gets a cache_valid_time option to avoid redundant cache updates
|
||||
* ec2 module better understands security groups
|
||||
* fix for postgresql codec usage
|
||||
* setup module now tolerant of OpenVZ interfaces
|
||||
* check mode reporting improved for files and directories
|
||||
* doc system now reports on module requirements
|
||||
* group_by module can now also make use of globally scoped variables
|
||||
* localhost and 127.0.0.1 are now fuzzy matched in inventory (are now more or less interchangeable)
|
||||
* AIX improvements/fixes for users, groups, facts
|
||||
* lineinfile now does atomic file replacements
|
||||
* fix to not pass PasswordAuthentication=no in the config file unneccessarily for SSH connection type
|
||||
* for for authorized_key on Debian Squeeze
|
||||
* fixes for apt_repository module reporting changed incorrectly on certain repository types
|
||||
* allow the virtualenv argument to the pip module to be a pathname
|
||||
* service pattern argument now correctly read for BSD services
|
||||
* fetch location can now be controlled more directly via the 'flat' parameter.
|
||||
* added basename and dirname as Jinja2 filters available to all templates
|
||||
* pip works better when sudoing from unpriveledged users
|
||||
* fix for user creation with groups specification reporting 'changed' incorrectly in some cases
|
||||
* fix for some unicode encoding errors in outputing some data in verbose mode
|
||||
* improved FreeBSD, NetBSD and Solaris facts
|
||||
* debug module always outputs data without having to specify -v
|
||||
* fix for sysctl module creating new keys (must specify checks=none)
|
||||
* NetBSD and OpenBSD support for the user and groups modules
|
||||
* Add encrypted password support to password lookup
|
||||
|
||||
1.1 "Mean Street" -- 4/2/2013
|
||||
|
||||
Core Features
|
||||
|
||||
* added --check option for "dry run" mode
|
||||
* added --diff option to show how templates or copied files change, or might change
|
||||
* --list-tasks for the playbook will list the tasks without running them
|
||||
* able to set the environment by setting "environment:" as a dictionary on any task (go proxy support!)
|
||||
* added ansible_ssh_user and ansible_ssh_pass for per-host/group username and password
|
||||
* jinja2 extensions can now be loaded from the config file
|
||||
* support for complex arguments to modules (within reason)
|
||||
* can specify ansible_connection=X to define the connection type in inventory variables
|
||||
* a new chroot connection type
|
||||
* module common code now has basic type checking (and casting) capability
|
||||
* module common now supports a 'no_log' attribute to mark a field as not to be syslogged
|
||||
* inventory can now point to a directory containing multiple scripts/hosts files, if using this, put group_vars/host_vars directories inside this directory
|
||||
* added configurable crypt scheme for 'vars_prompt'
|
||||
* password generating lookup plugin -- $PASSWORD(path/to/save/data/in)
|
||||
* added --step option to ansible-playbook, works just like Linux interactive startup!
|
||||
|
||||
Modules Added:
|
||||
|
||||
* bzr (bazaar version control)
|
||||
* cloudformation
|
||||
* django-manage
|
||||
* gem (ruby gems)
|
||||
* homebrew
|
||||
* lvg (logical volume groups)
|
||||
* lvol (LVM logical volumes)
|
||||
* macports
|
||||
* mongodb_user
|
||||
* netscaler
|
||||
* okg
|
||||
* openbsd_pkg
|
||||
* rabbit_mq_plugin
|
||||
* rabbit_mq_user
|
||||
* rabbit_mq_vhost
|
||||
* rabbit_mq_parameter
|
||||
* rhn_channel
|
||||
* s3 -- allows putting file contents in buckets for sharing over s3
|
||||
* uri module -- can get/put/post/etc
|
||||
* vagrant -- launching VMs with vagrant, this is different from existing vagrant plugin
|
||||
* zfs
|
||||
|
||||
Bugfixes and Misc Changes:
|
||||
|
||||
* stderr shown when commands fail to parse
|
||||
* uses yaml.safe_dump in filter plugins
|
||||
* authentication Q&A no longer happens before --syntax-check, but after
|
||||
* ability to get hostvars data for nodes not in the setup cache yet
|
||||
* SSH timeout now correctly passed to native SSH connection plugin
|
||||
* raise an error when multiple when_ statements are provided
|
||||
* --list-hosts applies host limit selections better
|
||||
* (internals) template engine specifications to use template_ds everywhere
|
||||
* better error message when your host file can not be found
|
||||
* end of line comments now work in the inventory file
|
||||
* directory destinations now work better with remote md5 code
|
||||
* lookup plugin macros like $FILE and $ENV now work without returning arrays in variable definitions/playbooks
|
||||
* uses yaml.safe_load everywhere
|
||||
* able to add EXAMPLES to documentation via EXAMPLES docstring, rather than just in main documentation YAML
|
||||
* can set ANSIBLE_COW_SELECTION to pick other cowsay types (including random)
|
||||
* to_nice_yaml and to_nice_json available as Jinja2 filters that indent and sort
|
||||
* cowsay able to run out of macports (very important!)
|
||||
* improved logging for fireball mode
|
||||
* nicer error message when talking to an older system that needs a JSON module installed
|
||||
* 'magic' variable 'inventory_dir' now gives path to inventory file
|
||||
* 'magic' variable 'vars' works like 'hostvars' but gives global scope variables, useful for debugging in templates mostly
|
||||
* conditionals can be used on plugins like add_host
|
||||
* developers: all callbacks now have access to a ".runner" and ".playbook", ".play", and ".task" object (use getattr, they may not always be set!)
|
||||
|
||||
Facts:
|
||||
|
||||
* block device facts for the setup module
|
||||
* facts for AIX
|
||||
* fact detection for OS type on Amazon Linux
|
||||
* device fact gathering stability improvements
|
||||
* ansible_os_family fact added
|
||||
* user_id (remote user name)
|
||||
* a whole series of current time information under the 'datetime' hash
|
||||
* more OS X facts
|
||||
* support for detecting Alpine Linux
|
||||
* added facts for OpenBSD
|
||||
|
||||
Module Changes/Fixes:
|
||||
|
||||
* ansible module common code (and ONLY that) which is mixed in with modules, is now BSD licensed. App remains GPLv3.
|
||||
* service code works better on platforms that mix upstart, systemd, and system-v
|
||||
* service enablement idempotence fixes for systemd and upstart
|
||||
* service status 4 is also 'not running'
|
||||
* supervisorctl restart fix
|
||||
* increased error handling for ec2 module
|
||||
* can recursively set permissions on directories
|
||||
* ec2: change to the way AMI tags are handled
|
||||
* cron module can now also manipulate cron.d files
|
||||
* virtualenv module can now inherit system site packages (or not)
|
||||
* lineinfile module now has an insertbefore option
|
||||
* NetBSD service module support
|
||||
* fixes to sysctl module where item has multiple values
|
||||
* AIX support for the user and group modules
|
||||
* able to specify a different hg repo to pull from than the original set
|
||||
* add_host module can set ports and other inventory variables
|
||||
* add_host module can add modules to multiple groups (groups=a,b,c), groups now alias for groupname
|
||||
* subnet ID can be set on EC2 module
|
||||
* MySQL module password handling improvements
|
||||
* added new virtualenv flags to pip and easy_install modules
|
||||
* various improvements to lineinfile module, now accepts common arguments from file
|
||||
* force= now replaces thirsty where used before, thirsty remains an alias
|
||||
* setup module can take a 'filter=<wildcard>' parameter to just return a few facts (not used by playbooks)
|
||||
* cron module works even if no crontab is present (for cron.d)
|
||||
* security group ID settable on EC2 module
|
||||
* misc fixes to sysctl module
|
||||
* fix to apt module so packages not in cache are still removable
|
||||
* charset fix to mail module
|
||||
* postresql db module now does not try to create the 'PUBLIC' user
|
||||
* SVN module now works correctly with self signed certs
|
||||
* apt module now has an upgrade parameter (values=yes, no, or 'dist')
|
||||
* nagios module gets new silence/unsilence commands
|
||||
* ability to disable proxy usage in get_url (use_proxy=no)
|
||||
* more OS X facts
|
||||
* added a 'fail_on_missing' (default no) option to fetch
|
||||
* added timeout to the uri module (default 30 seconds, adjustable)
|
||||
* ec2 now has a 'wait' parameter to wait for the instance to be active, eliminates need for separate wait_for call.
|
||||
* allow regex backreferences in lineinfile
|
||||
* id attribute on ec2 module can be used to set idempotent-do-not-recreate launches
|
||||
* icinga support for nagios module
|
||||
* fix default logins when no my.conf for MySQL module
|
||||
* option to create users with non-unique UIDs (user module)
|
||||
* macports module can enable/disable packages
|
||||
* quotes in my.cnf are stripped by the MySQL modules
|
||||
* Solaris Service management added
|
||||
* service module will attempt to auto-add unmanaged chkconfig services when needed
|
||||
* service module supports systemd service unit files
|
||||
|
||||
Plugins:
|
||||
|
||||
* added 'with_random_choice' filter plugin
|
||||
* fixed ~ expansion for fileglob
|
||||
* with_nested allows for nested loops (see examples in examples/playbooks)
|
||||
|
||||
1.0 "Eruption" -- Feb 1 2013
|
||||
|
||||
New modules:
|
||||
|
||||
* new sysctl module
|
||||
* new pacman module (Arch linux)
|
||||
* new apt_key module
|
||||
* hg module now in core
|
||||
* new ec2_facts module
|
||||
* added pkgin module for Joyent SmartOS
|
||||
|
||||
New config settings:
|
||||
|
||||
* sudo_exe parameter can be set in config to use sudo alternatives
|
||||
* sudo_flags parameter can alter the flags used with sudo
|
||||
|
||||
New playbook/language features:
|
||||
|
||||
* added when_failed and when_changed
|
||||
* task includes can now be of infinite depth
|
||||
* when_set and when_unset can take more than one var (when_set: $a and $b and $c)
|
||||
* added the with_sequence lookup plugin
|
||||
* can override "connection:" on an indvidual task
|
||||
* parameterized playbook includes can now define complex variables (not just all on one line)
|
||||
* making inventory variables available for use in vars_files paths
|
||||
* messages when skipping plays are now more clear
|
||||
* --extra-vars now has maximum precedence (as intended)
|
||||
|
||||
Module fixes and new flags:
|
||||
|
||||
* ability to use raw module without python on remote system
|
||||
* fix for service status checking on Ubuntu
|
||||
* service module now responds to additional exit code for SERVICE_UNAVAILABLE
|
||||
* fix for raw module with '-c local'
|
||||
* various fixes to git module
|
||||
* ec2 module now reports the public DNS name
|
||||
* can pass executable= to the raw module to specify alternative shells
|
||||
* fix for postgres module when user contains a "-"
|
||||
* added additional template variables -- $template_fullpath and $template_run_date
|
||||
* raise errors on invalid arguments used with a task include statement
|
||||
* shell/command module takes a executable= parameter to specify a different shell than /bin/sh
|
||||
* added return code and error output to the raw module
|
||||
* added support for @reboot to the cron module
|
||||
* misc fixes to the pip module
|
||||
* nagios module can schedule downtime for all services on the host
|
||||
* various subversion module improvements
|
||||
* various mail module improvements
|
||||
* SELinux fix for files created by authorized_key module
|
||||
* "template override" ??
|
||||
* get_url module can now send user/password authorization
|
||||
* ec2 module can now deploy multiple simultaneous instances
|
||||
* fix for apt_key modules stalling in some situations
|
||||
* fix to enable Jinja2 {% include %} to work again in template
|
||||
* ec2 module is now powered by Boto
|
||||
* setup module can now detect if package manager is using pacman
|
||||
* fix for yum module with enablerepo in use on EL 6
|
||||
|
||||
Core fixes and new behaviors:
|
||||
|
||||
* various fixes for variable resolution in playbooks
|
||||
* fixes for handling of "~" in some paths
|
||||
* various fixes to DWIM'ing of relative paths
|
||||
* /bin/ansible now takes a --list-hosts just like ansible-playbook did
|
||||
* various patterns can now take a regex vs a glob if they start with "~" (need docs on which!) - also /usr/bin/ansible
|
||||
* allow intersecting host patterns by using "&" ("webservers:!debian:&datacenter1")
|
||||
* handle tilde shell character for --private-key
|
||||
* hash merging policy is now selectable in the config file, can choose to override or merge
|
||||
* environment variables now available for setting all plugin paths (ANSIBLE_CALLBACK_PLUGINS, etc)
|
||||
* added packaging file for macports (not upstreamed yet)
|
||||
* hacking/test-module script now uses /usr/bin/env properly
|
||||
* fixed error formatting for certain classes of playbook syntax errors
|
||||
* fix for processing returns with large volumes of output
|
||||
|
||||
Inventory files/scripts:
|
||||
|
||||
* hostname patterns in the inventory file can now use alphabetic ranges
|
||||
* whitespace is now allowed around group variables in the inventory file
|
||||
* inventory scripts can now define groups of groups and group vars (need example for docs?)
|
||||
|
||||
0.9 "Dreams" -- Nov 30 2012
|
||||
|
||||
Highlighted core changes:
|
||||
|
||||
* various performance tweaks, ansible executes dramatically less SSH ops per unit of work
|
||||
* close paramiko SFTP connections less often on copy/template operations (speed increase)
|
||||
* change the way we use multiprocessing (speed/RAM usage improvements)
|
||||
* able to set default for asking password & sudo password in config file
|
||||
* ansible now installs nicely if running inside a virtualenv
|
||||
* flag to allow SSH connection to move files by scp vs sftp (in config file)
|
||||
* additional RPM subpackages for easily installing fireball mode deps (server and node)
|
||||
* group_vars/host_vars now available to ansible, not just playbooks
|
||||
* native ssh connection type (-c ssh) now supports passwords as well as keys
|
||||
* ansible-doc program to show details
|
||||
|
||||
Other core changes:
|
||||
|
||||
* fix for template calls when last character is '$'
|
||||
* if ansible_python_interpreter is set on a delegated host, it now works as intended
|
||||
* --limit can now take "," as separator as well as ";" or ":"
|
||||
* msg is now displaced with newlines when a task fails
|
||||
* if any with_ plugin has no results in a list (empty list for with_items, etc), the task is now skipped
|
||||
* various output formatting fixes/improvements
|
||||
* fix for Xen dom0/domU detection in default facts
|
||||
* 'ansible_domain' fact now available (ex value: example.com)
|
||||
* configured remote temp file location is now always used even for root
|
||||
* 'register'-ed variables are not recorded for skipped hosts (for example, using only_if/when)
|
||||
* duplicate host records for the same host can no longer result when a host is listed in multiple groups
|
||||
* ansible-pull now passes --limit to prevent running on multiple hosts when used with generic playbooks
|
||||
* remote md5sum check fixes for Solaris 10
|
||||
* ability to configure syslog facility used by remote module calls
|
||||
* in templating, stray '$' characters are now handled more correctly
|
||||
|
||||
Playbook changes:
|
||||
|
||||
* relative paths now work for 'first_available_file'
|
||||
* various templating engine fixes
|
||||
* 'when' is an easier form of only if
|
||||
* --list-hosts on the playbook command now supports multiple playbooks on the same command line
|
||||
* playbook includes can now be parameterized
|
||||
|
||||
Module additions:
|
||||
|
||||
* (addhost) new module for adding a temporary host record (used for creating new guests)
|
||||
* (group_by) module allows partitioning hosts based on group data
|
||||
* (ec2) new module for creating ec2 hosts
|
||||
* (script) added 'script' module for pushing and running self-deleting remote scripts
|
||||
* (svr4pkg) solaris svr4pkg module
|
||||
|
||||
Module changes:
|
||||
|
||||
* (authorized key) module uses temp file now to prevent failure on full disk
|
||||
* (fetch) now uses the 'slurp' internal code to work as you would expect under sudo'ed accounts
|
||||
* (fetch) internal usage of md5 sums fixed for BSD
|
||||
* (get_url) thirsty is no longer required for directory destinations
|
||||
* (git) various git module improvements/tweaks
|
||||
* (group) now subclassed for various platforms, includes SunOS support
|
||||
* (lineinfile) create= option on lineinfile can create the file when it does not exist
|
||||
* (mysql_db) module takes new grant options
|
||||
* (postgresql_db) module now takes role_attr_flags
|
||||
* (service) further upgrades to service module service status reporting
|
||||
* (service) tweaks to get service module to play nice with BSD style service systems (rc.conf)
|
||||
* (service) possible to pass additional arguments to services
|
||||
* (shell) and command module now take an 'executable=' flag for specifying an alternate shell than /bin/sh
|
||||
* (user) ability to create SSH keys for users when using user module to create users
|
||||
* (user) atomic replacement of files preserves permissions of original file
|
||||
* (user) module can create SSH keys
|
||||
* (user) module now does Solaris and BSD
|
||||
* (yum) module takes enablerepo= and disablerepo=
|
||||
* (yum) misc yum module fixing for various corner cases
|
||||
|
||||
Plugin changes:
|
||||
|
||||
* EC2 inventory script now produces nicer failure message if AWS is down (or similar)
|
||||
* plugin loading code now more streamlined
|
||||
* lookup plugins for DNS text records, environment variables, and redis
|
||||
* added a template lookup plugin $TEMPLATE('filename.j2')
|
||||
* various tweaks to the EC2 inventory plugin
|
||||
* jinja2 filters are now pluggable so it's easy to write your own (to_json/etc, are now impl. as such)
|
||||
|
||||
0.8 "Cathedral" -- Oct 19, 2012
|
||||
|
||||
Highlighted Core Changes:
|
||||
|
||||
* fireball mode -- ansible can bootstrap a ephemeral 0mq (zeromq) daemon that runs as a given user and expires after X period of time. It is very fast.
|
||||
* playbooks with errors now return 2 on failure. 1 indicates a more fatal syntax error. Similar for /usr/bin/ansible
|
||||
* server side action code (template, etc) are now fully pluggable
|
||||
* ability to write lookup plugins, like the code powering "with_fileglob" (see below)
|
||||
|
||||
Other Core Changes:
|
||||
|
||||
* ansible config file can also go in 'ansible.cfg' in cwd in addition to ~/.ansible.cfg and /etc/ansible/ansible.cfg
|
||||
* fix for inventory hosts at API level when hosts spec is a list and not a colon delimited string
|
||||
* ansible-pull example now sets up logrotate for the ansible-pull cron job log
|
||||
* negative host matching (!hosts) fixed for external inventory script usage
|
||||
* internals: os.executable check replaced with utils function so it plays nice on AIX
|
||||
* Debian packaging now includes ansible-pull manpage
|
||||
* magic variable 'ansible_ssh_host' can override the hostname (great for usage with tunnels)
|
||||
* date command usage in build scripts fixed for OS X
|
||||
* don't use SSH agent with paramiko if a password is specified
|
||||
* make output be cleaner on multi-line command/shell errors
|
||||
* /usr/bin/ansible now prints things when tasks are skipped, like when creates= is used with -m command and /usr/bin/ansible
|
||||
* when trying to async a module that is not a 'normal' asyncable module, ansible will now let you know
|
||||
* ability to access inventory variables via 'hostvars' for hosts not yet included in any play, using on demand lookups
|
||||
* merged ansible-plugins, ansible-resources, and ansible-docs into the main project
|
||||
* you can set ANSIBLE_NOCOWS=1 if you want to disable cowsay if it is installed. Though no one should ever want to do this! Cows are great!
|
||||
* you can set ANSIBLE_FORCECOLOR=1 to force color mode even when running without a TTY
|
||||
* fatal errors are now properly colored red.
|
||||
* skipped messages are now cyan, to differentiate them from unchanged messages.
|
||||
* extensive documentation upgrades
|
||||
* delegate_action to localhost (aka local_action) will always use the local connection type
|
||||
|
||||
Highlighted playbook changes:
|
||||
|
||||
* is_set is available for use inside of an only_if expression: is_set('ansible_eth0'). We intend to further upgrade this with a 'when'
|
||||
keyword providing better options to 'only_if' in the next release. Also is_unset('ansible_eth0')
|
||||
* playbooks can import playbooks in other directories and then be able to import tasks relative to them
|
||||
* FILE($path) now allows access of contents of file in a path, very good for use with SSH keys
|
||||
* similarly PIPE($command) will run a local command and return the results of executing this command
|
||||
* if all hosts in a play fail, stop the playbook, rather than letting the console log spool on by
|
||||
* only_if using register variables that are booleans now works in a boolean way like you'd expect
|
||||
* task includes now work with with_items (such as: include: path/to/wordpress.yml user=$item)
|
||||
* when using a $list variable with $var or ${var} syntax it will automatically join with commas
|
||||
* setup is not run more than once when we know it is has already been run in a play that included another play, etc
|
||||
* can set/override sudo and sudo_user on individual tasks in a play, defaults to what is set in the play if not present
|
||||
* ability to use with_fileglob to iterate over local file patterns
|
||||
* templates now use Jinja2's 'trim_blocks=True' to avoid stray newlines, small changes to templates may
|
||||
be required in rare cases.
|
||||
|
||||
Other playbook changes:
|
||||
|
||||
* to_yaml and from_yaml are available as Jinja2 filters
|
||||
* $group and $group_names are now accessible in with_items
|
||||
* where 'stdout' is provided a new 'stdout_lines' variable (type == list) is now generated and usable with with_items
|
||||
* when local_action is used the transport is automatically overridden to the local type
|
||||
* output on failed playbook commands is now nicely split for stderr/stdout and syntax errors
|
||||
* if local_action is not used and delegate_to was 127.0.0.1 or localhost, use local connection regardless
|
||||
* when running a playbook, and the statement has changed, prints 'changed:' now versus 'ok:' so it is obvious without colored mode
|
||||
* variables now usable within vars_prompt (just not host/group vars)
|
||||
* setup facts are now retained across plays (dictionary just gets updated as needed)
|
||||
* --sudo-user now works with --extra-vars
|
||||
* fix for multi_line strings with only_if
|
||||
|
||||
New Modules:
|
||||
|
||||
* ini_file module for manipulating INI files
|
||||
* new LSB facts (release, distro, etc)
|
||||
* pause module -- (pause seconds=10) (pause minutes=1) (pause prompt=foo) -- it's an action plugin
|
||||
* a module for adding entries to the main crontab (though you may still wish to just drop template files into cron.d)
|
||||
* debug module can be used for outputing messages without using 'shell echo'
|
||||
* a fail module is now available for causing errors, you might want to use it with only_if to fail in certain conditions
|
||||
|
||||
Other module Changes, Upgrades, and Fixes:
|
||||
|
||||
* removes= exists on command just like creates=
|
||||
* postgresql modules now take an optional port= parameter
|
||||
* /proc/cmdline info is now available in Linux facts
|
||||
* public host key detection for OS X
|
||||
* lineinfile module now uses 'search' not exact 'match' in regexes, making it much more intuitive and not needing regex syntax most of the time
|
||||
* added force=yes|no (default no) option for file module, which allows transition between files to directories and so on
|
||||
* additional facts for SunOS virtualization
|
||||
* copy module is now atomic when used across volumes
|
||||
* url_get module now returns 'dest' with the location of the file saved
|
||||
* fix for yum module when using local RPMs vs downloading
|
||||
* cleaner error messages with copy if destination directory does not exist
|
||||
* setup module now still works if PATH is not set
|
||||
* service module status now correct for services with 'subsys locked' status
|
||||
* misc fixes/upgrades to the wait_for module
|
||||
* git module now expands any "~" in provided destination paths
|
||||
* ignore stop error code failure for service module with state=restarted, always try to start
|
||||
* inline documentation for modules allows documentation source to built without pull requests to the ansible-docs project, among other things
|
||||
* variable '$ansible_managed' is now great to include at the top of your templates and includes useful information and a warning that it will be replaced
|
||||
* "~" now expanded in command module when using creates/removes
|
||||
* mysql module can do dumps and imports
|
||||
* selinux policy is only required if setting to not disabled
|
||||
* various fixes for yum module when working with packages not in any present repo
|
||||
|
||||
0.7 "Panama" -- Sept 6 2012
|
||||
|
||||
Module changes:
|
||||
|
||||
* login_unix_socket option for mysql user and database modules (see PR #781 for doc notes)
|
||||
* new modules -- pip, easy_install, apt_repository, supervisorctl
|
||||
* error handling for setup module when SELinux is in a weird state
|
||||
* misc yum module fixes
|
||||
* better changed=True/False detection in user module on older Linux distros
|
||||
* nicer errors from modules when arguments are not key=value
|
||||
* backup option on copy (backup=yes), as well as template, assemble, and lineinfile
|
||||
* file module will not recurse on directory properties
|
||||
* yum module now workable without having repoquery installed, but doesn't support comparisons or list= if so
|
||||
* setup module now detects interfaces with aliases
|
||||
* better handling of VM guest type detection in setup module
|
||||
* new module boilerplate code to check for mutually required arguments, arguments required together, exclusive args
|
||||
* add pattern= as a paramter to the service module (for init scripts that don't do status, or do poor status)
|
||||
* various fixes to mysql & postresql modules
|
||||
* added a thirsty= option (boolean, default no) to the get_url module to decide to download the file every time or not
|
||||
* added a wait_for module to poll for ports being open
|
||||
* added a nagios module for controlling outage windows and alert statuses
|
||||
* added a seboolean module for getsebool/setsebool type operations
|
||||
* added a selinux module for controlling overall SELinux policy
|
||||
* added a subversion module
|
||||
* added lineinfile for adding and removing lines from basic files
|
||||
* added facts for ARM-based CPUs
|
||||
* support for systemd in the service module
|
||||
* git moduleforce reset behavior is now controllable
|
||||
* file module can now operate on special files (block devices, etc)
|
||||
|
||||
Core changes:
|
||||
|
||||
* ansible --version will now give branch/SHA information if running from git
|
||||
* better sudo permissions when encountering different umasks
|
||||
* when using paramiko and SFTP is not accessible, do not traceback, but return a nice human readable msg
|
||||
* use -vvv for extreme debug levels. -v gives more playbook output as before
|
||||
* -vv shows module arguments to all module calls (and maybe some other things later)
|
||||
* don not pass "--" to sudo to work on older EL5
|
||||
* make remote_md5 internal function work with non-bash shells
|
||||
* allow user to be passed in via --extra-vars (regression)
|
||||
* add --limit option, which can be used to further confine the pattern given in ansible-playbooks
|
||||
* adds ranged patterns like dbservers[0-49] for usage with patterns or --limit
|
||||
* -u and user: defaults to current user, rather than root, override as before
|
||||
* /etc/ansible/ansible.cfg and ~/ansible.cfg now available to set default values and other things
|
||||
* (developers) ANSIBLE_KEEP_REMOTE_FILES=1 can be used in debugging (envrionment variable)
|
||||
* (developers) connection types are now plugins
|
||||
* (developers) callbacks can now be extended via plugins
|
||||
* added FreeBSD ports packaging scripts
|
||||
* check for terminal properties prior to engaging color modes
|
||||
* explicitly disable password auth with -c ssh, as it is not used anyway
|
||||
|
||||
Playbooks:
|
||||
|
||||
* YAML syntax errors detected and show where the problem is
|
||||
* if you ctrl+c a playbook it will not traceback (usually)
|
||||
* vars_prompt now has encryption options (see examples/playbooks/prompts.yml)
|
||||
* allow variables in parameterized task include parameters (regression)
|
||||
* add ability to store the result of any command in a register (see examples/playbooks/register_logic.yml)
|
||||
* --list-hosts to show what hosts are included in each play of a playbook
|
||||
* fix a variable ordering issue that could affect vars_files with selective file source lists
|
||||
* adds 'delegate_to' for a task, which can be used to signal outage windows and load balancers on behalf of hosts
|
||||
* adds 'serial' to playbook, allowing you to specify how many hosts can be processing a playbook at one time (default 0=all)
|
||||
* adds 'local_action: <action parameters>' as an alias to 'delegate_to: 127.0.0.1'
|
||||
|
||||
0.6 "Cabo" -- August 6, 2012
|
||||
|
||||
playbooks:
|
||||
|
||||
* support to tag tasks and includes and use --tags in playbook CLI
|
||||
* playbooks can now include other playbooks (example/playbooks/nested_playbooks.yml)
|
||||
* vars_files now usable with with_items, provided file paths don't contain host specific facts
|
||||
* error reporting if with_items value is unbound
|
||||
* with_items no longer creates lots of tasks, creates one task that makes multiple calls
|
||||
* can use host_specific facts inside with_items (see above)
|
||||
* at the top level of a playbook, set 'gather_facts: no' to skip fact gathering
|
||||
* first_available_file and with_items used together will now raise an error
|
||||
* to catch typos, like 'var' for 'vars', playbooks and tasks now yell on invalid parameters
|
||||
* automatically load (directory_of_inventory_file)/group_vars/groupname and /host_vars/hostname in vars_files
|
||||
* playbook is now colorized, set ANSIBLE_NOCOLOR=1 if you do not like this, does not colorize if not a TTY
|
||||
* hostvars now preserved between plays (regression in 0.5 from 0.4), useful for sharing vars in multinode configs
|
||||
* ignore_errors: yes on a task can be used to allow a task to fail and not stop the play
|
||||
* with_items with the apt/yum module will install/remove/update everything in a single command
|
||||
|
||||
inventory:
|
||||
|
||||
* groups variable available as a hash to return the hosts in each group name
|
||||
* in YAML inventory, hosts can list their groups in inverted order now also (see tests/yaml_hosts)
|
||||
* YAML inventory is deprecated and will be removed in 0.7
|
||||
* ec2 inventory script
|
||||
* support ranges of hosts in the host file, like www[001-100].example.com (supports leading zeros and also not)
|
||||
|
||||
modules:
|
||||
|
||||
* fetch module now does not fail a system when requesting file paths (ex: logs) that don't exist
|
||||
* apt module now takes an optional install-recommends=yes|no (default yes)
|
||||
* fixes to the return codes of the copy module
|
||||
* copy module takes a remote md5sum to avoid large file transfer
|
||||
* various user and group module fixes (error handling, etc)
|
||||
* apt module now takes an optional force parameter
|
||||
* slightly better psychic service status handling for the service module
|
||||
* fetch module fixes for SSH connection type
|
||||
* modules now consistently all take yes/no for boolean parameters (and DWIM on true/false/1/0/y/n/etc)
|
||||
* setup module no longer saves to disk, template module now only used in playbooks
|
||||
* setup module no longer needs to run twice per playbook
|
||||
* apt module now passes DEBIAN_FRONTEND=noninteractive
|
||||
* mount module (manages active mounts + fstab)
|
||||
* setup module fixes if no ipv6 support
|
||||
* internals: template in common module boilerplate, also causes less SSH operations when used
|
||||
* git module fixes
|
||||
* setup module overhaul, more modular
|
||||
* minor caching logic added to inventory to reduce hammering of inventory scripts.
|
||||
* MySQL and PostgreSQL modules for user and db management
|
||||
* vars_prompt now supports private password entry (see examples/playbooks/prompts.yml)
|
||||
* yum module modified to be more tolerant of plugins spewing random console messages (ex: RHN)
|
||||
|
||||
internals:
|
||||
|
||||
* when sudoing to root, still use /etc/ansible/setup as the metadata path, as if root
|
||||
* paramiko is now only imported if needed when running from source checkout
|
||||
* cowsay support on Ubuntu
|
||||
* various ssh connection fixes for old Ubuntu clients
|
||||
* ./hacking/test-module now supports options like ansible takes and has a debugger mode
|
||||
* sudoing to a user other than root now works more seamlessly (uses /tmp, avoids umask issues)
|
||||
|
||||
0.5 "Amsterdam" ------- July 04, 2012
|
||||
|
||||
* Service module gets more accurate service states when running with upstart
|
||||
* Jinja2 usage in playbooks (not templates), reinstated, supports %include directive
|
||||
* support for --connection ssh (supports Kerberos, bastion hosts, etc), requires ControlMaster
|
||||
* misc tracebacks replaced with error messages
|
||||
* various API/internals refactoring
|
||||
* vars can be built from other variables
|
||||
* support for exclusion of hosts/groups with "!groupname"
|
||||
* various changes to support md5 tool differences for FreeBSD nodes & OS X clients
|
||||
* "unparseable" command output shows in command output for easier debugging
|
||||
* mktemp is no longer required on remotes (not available on BSD)
|
||||
* support for older versions of python-apt in the apt module
|
||||
* a new "assemble" module, for constructing files from pieces of files (inspired by Puppet "fragments" idiom)
|
||||
* ability to override most default values with ANSIBLE_FOO environment variables
|
||||
* --module-path parameter can support multiple directories separated with the OS path separator
|
||||
* with_items can take a variable of type list
|
||||
* ansible_python_interpreter variable available for systems with more than one Python
|
||||
* BIOS and VMware "fact" upgrades
|
||||
* cowsay is used by ansible-playbook if installed to improve output legibility (try installing it)
|
||||
* authorized_key module
|
||||
* SELinux facts now sourced from the python selinux library
|
||||
* removed module debug option -D
|
||||
* added --verbose, which shows output from successful playbook operations
|
||||
* print the output of the raw command inside /usr/bin/ansible as with command/shell
|
||||
* basic setup module support for Solaris
|
||||
* ./library relative to the playbook is always in path so modules can be included in tarballs with playbooks
|
||||
|
||||
0.4 "Unchained" ------- May 23, 2012
|
||||
|
||||
Internals/Core
|
||||
* internal inventory API now more object oriented, parsers decoupled
|
||||
* async handling improvements
|
||||
* misc fixes for running ansible on OS X (overlord only)
|
||||
* sudo improvements, now works much more smoothly
|
||||
* sudo to a particular user with -U/--sudo-user, or using 'sudo_user: foo' in a playbook
|
||||
* --private-key CLI option to work with pem files
|
||||
|
||||
Inventory
|
||||
* can use -i host1,host2,host3:port to specify hosts not in inventory (replaces --override-hosts)
|
||||
* ansible INI style format can do groups of groups [groupname:children] and group vars [groupname:vars]
|
||||
* groups and users module takes an optional system=yes|no on creation (default no)
|
||||
* list of hosts in playbooks can be expressed as a YAML list in addition to ; delimited
|
||||
|
||||
Playbooks
|
||||
* variables can be replaced like ${foo.nested_hash_key.nested_subkey[array_index]}
|
||||
* unicode now ok in templates (assumes utf8)
|
||||
* able to pass host specifier or group name in to "hosts:" with --extra-vars
|
||||
* ansible-pull script and example playbook (extreme scaling, remediation)
|
||||
* inventory_hostname variable available that contains the value of the host as ansible knows it
|
||||
* variables in the 'all' section can be used to define other variables based on those values
|
||||
* 'group_names' is now a variable made available to templates
|
||||
* first_available_file feature, see selective_file_sources.yml in examples/playbooks for info
|
||||
* --extra-vars="a=2 b=3" etc, now available to inject parameters into playbooks from CLI
|
||||
|
||||
Incompatible Changes
|
||||
* jinja2 is only usable in templates, not playbooks, use $foo instead
|
||||
* --override-hosts removed, can use -i with comma notation (-i "ahost,bhost")
|
||||
* modules can no longer include stderr output (paramiko limitation from sudo)
|
||||
|
||||
Module Changes
|
||||
* tweaks to SELinux implementation for file module
|
||||
* fixes for yum module corner cases on EL5
|
||||
* file module now correctly returns the mode in octal
|
||||
* fix for symlink handling in the file module
|
||||
* service takes an enable=yes|no which works with chkconfig or updates-rc.d as appropriate
|
||||
* service module works better on Ubuntu
|
||||
* git module now does resets and such to work more smoothly on updates
|
||||
* modules all now log to syslog
|
||||
* enabled=yes|no on a service can be used to toggle chkconfig & updates-rc.d states
|
||||
* git module supports branch=
|
||||
* service fixes to better detect status using return codes of the service script
|
||||
* custom facts provided by the setup module mean no dependency on Ruby, facter, or ohai
|
||||
* service now has a state=reloaded
|
||||
* raw module for bootstrapping and talking to routers w/o Python, etc
|
||||
|
||||
Misc Bugfixes
|
||||
* fixes for variable parsing in only_if lines
|
||||
* misc fixes to key=value parsing
|
||||
* variables with mixed case now legal
|
||||
* fix to internals of hacking/test-module development script
|
||||
|
||||
|
||||
0.3 "Baluchitherium" -- April 23, 2012
|
||||
|
||||
* Packaging for Debian, Gentoo, and Arch
|
||||
* Improvements to the apt and yum modules
|
||||
* A virt module
|
||||
* SELinux support for the file module
|
||||
* Ability to use facts from other systems in templates (aka exported
|
||||
resources like support)
|
||||
* Built in Ansible facts so you don't need ohai, facter, or Ruby
|
||||
* tempdir selections that work with noexec mounted /tmp
|
||||
* templates happen locally, not remotely, so no dependency on
|
||||
python-jinja2 for remote computers
|
||||
* advanced inventory format in YAML allows more control over variables
|
||||
per host and per group
|
||||
* variables in playbooks can be structured/nested versus just a flat namespace
|
||||
* manpage upgrades (docs)
|
||||
* various bugfixes
|
||||
* can specify a default --user for playbooks rather than specifying it
|
||||
in the playbook file
|
||||
* able to specify ansible port in ansible host file (see docs)
|
||||
* refactored Inventory API to make it easier to write scripts using Ansible
|
||||
* looping capability for playbooks (with_items)
|
||||
* support for using sudo with a password
|
||||
* module arguments can be unicode
|
||||
* A local connection type, --connection=local, for use with cron or
|
||||
in kickstarts
|
||||
* better module debugging with -D
|
||||
* fetch module for pulling in files from remote hosts
|
||||
* command task supports creates=foo for idempotent semantics, won't run if file foo already exists
|
||||
|
||||
0.0.2 and 0.0.1
|
||||
|
||||
* Initial stages of project
|
||||
|
||||
73
CONTRIBUTING.md
Normal file
73
CONTRIBUTING.md
Normal file
@ -0,0 +1,73 @@
|
||||
Contributing to Ansible
|
||||
=======================
|
||||
|
||||
It is required that you read the following information to learn how to contribute to this project.
|
||||
|
||||
Branch Info
|
||||
===========
|
||||
|
||||
Here's how to understand the branches.
|
||||
|
||||
* The devel branch corresponds to the latest ongoing release
|
||||
* Various release-X.Y branches exist for previous releases
|
||||
* All feature work happens on the development branch.
|
||||
* Major bug fixes will be made to the last release branch only
|
||||
* See CHANGELOG.md for release notes to track each release.
|
||||
|
||||
Patch Instructions
|
||||
==================
|
||||
|
||||
Contributions to the core and modules are greatly welcome.
|
||||
|
||||
* Required Process:
|
||||
* Submit github pull requests to the "ansible/devel" branch for features
|
||||
* Fixes for bugs may also be submitted to "ansible/release-X.Y" for the last release
|
||||
* Make sure "make tests" passes before submitting any requests.
|
||||
* Bonus points:
|
||||
* Joining the mailing list
|
||||
* Fixing bugs instead of sending bug reports.
|
||||
* Using squash merges
|
||||
* Updating the "rst/*" files in the "docsite/" directory and "docs/" manpage content
|
||||
* Adding more unit tests
|
||||
* Avoid:
|
||||
* Sending patches to the mailing list directly.
|
||||
* Sending feature pull requests to the 'release' branch instead of the devel branch
|
||||
* Sending pull requests to mpdehaan's personal ansible fork.
|
||||
* Sending pull requests about more than one feature in the same pull request.
|
||||
* Whitespace restructuring
|
||||
* Large scale refactoring without a discussion on the list
|
||||
|
||||
Coding Standards
|
||||
================
|
||||
|
||||
We're not too strict on style considerations, but we require:
|
||||
|
||||
* python 2.6 compliant code, unless in ansible modules, then python *2.4* compliant code (no 'with', etc)
|
||||
* 4-space indents, no tabs except in Makefiles
|
||||
* under_scores for method names and variables, not camelCase
|
||||
* GPLv3 license headers on all files, with copyright on new files with your name on it
|
||||
* no single-line if statements, deeply nested list comprehensions, or clever use of metaclasses -- keep it simple
|
||||
* comments where appropriate
|
||||
|
||||
Testing Requirements
|
||||
====================
|
||||
|
||||
Automation tests are run by "make tests" and contain a mixture of integration and "unit" level tests. To run the tests you need the following:
|
||||
|
||||
* nose must be installed - https://nose.readthedocs.org/en/latest/
|
||||
* ansible tests require paramiko, PyYAML python modules, and python 2.6+.
|
||||
* Some tests require additional components (facter, ohai) and will be skipped if not available.
|
||||
* Your user environment should allow "ssh 127.0.0.1"
|
||||
without a password - so a key held in ssh-agent and an authorized_keys entry.
|
||||
|
||||
If your module does not require any additional dependencies beyond ansible-core, it is a good idea to write some
|
||||
tests for the module.
|
||||
|
||||
Contributors License Agreement
|
||||
==============================
|
||||
|
||||
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.
|
||||
|
||||
|
||||
|
||||
9
COPYING
9
COPYING
@ -1,7 +1,7 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
@ -664,11 +664,12 @@ might be different; for a GUI interface, you would use an "about box".
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
|
||||
|
||||
19
MANIFEST.in
19
MANIFEST.in
@ -1,11 +1,8 @@
|
||||
include COPYING
|
||||
include bin/*
|
||||
include changelogs/CHANGELOG*.rst
|
||||
include changelogs/changelog.yaml
|
||||
include licenses/*.txt
|
||||
include requirements.txt
|
||||
recursive-include packaging *.py *.j2
|
||||
recursive-include test/integration *
|
||||
recursive-include test/sanity *.in *.json *.py *.txt
|
||||
recursive-include test/support *.py *.ps1 *.psm1 *.cs *.md
|
||||
recursive-include test/units *
|
||||
include README.md packaging/rpm/ansible.spec COPYING
|
||||
include examples/hosts
|
||||
include examples/ansible.cfg
|
||||
graft examples/playbooks
|
||||
include packaging/distutils/setup.py
|
||||
recursive-include docs *
|
||||
recursive-include library *
|
||||
include Makefile
|
||||
|
||||
186
Makefile
Normal file
186
Makefile
Normal file
@ -0,0 +1,186 @@
|
||||
#!/usr/bin/make
|
||||
# WARN: gmake syntax
|
||||
########################################################
|
||||
# Makefile for Ansible
|
||||
#
|
||||
# useful targets:
|
||||
# make sdist ---------------- produce a tarball
|
||||
# make rpm ----------------- produce RPMs
|
||||
# make deb ------------------ produce a DEB
|
||||
# make docs ----------------- rebuild the manpages (results are checked in)
|
||||
# make tests ---------------- run the tests
|
||||
# make pyflakes, make pep8 -- source code checks
|
||||
|
||||
########################################################
|
||||
# variable section
|
||||
|
||||
NAME = "ansible"
|
||||
OS = $(shell uname -s)
|
||||
|
||||
# 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 := docs/man/man1/ansible.1 docs/man/man1/ansible-playbook.1 docs/man/man1/ansible-pull.1 docs/man/man1/ansible-doc.1
|
||||
ifneq ($(shell which a2x 2>/dev/null),)
|
||||
ASCII2MAN = a2x -D $(dir $@) -d manpage -f manpage $<
|
||||
ASCII2HTMLMAN = a2x -D docs/html/man/ -d manpage -f xhtml
|
||||
else
|
||||
ASCII2MAN = @echo "ERROR: AsciiDoc 'a2x' command is not installed but is required to build $(MANPAGES)" && exit 1
|
||||
endif
|
||||
|
||||
PYTHON=python
|
||||
SITELIB = $(shell $(PYTHON) -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
|
||||
|
||||
# VERSION file provides one place to update the software version
|
||||
VERSION := $(shell cat VERSION)
|
||||
|
||||
# Get the branch information from git
|
||||
ifneq ($(shell which git),)
|
||||
GIT_DATE := $(shell git log -n 1 --format="%ai")
|
||||
endif
|
||||
|
||||
ifeq ($(OS), FreeBSD)
|
||||
DATE := $(shell date -j -f "%Y-%m-%d %H:%M:%s" "$(GIT_DATE)" +%Y%m%d%H%M)
|
||||
else
|
||||
ifeq ($(OS), Darwin)
|
||||
DATE := $(shell date -j -f "%Y-%m-%d %H:%M:%S" "$(GIT_DATE)" +%Y%m%d%H%M)
|
||||
else
|
||||
DATE := $(shell date --utc --date="$(GIT_DATE)" +%Y%m%d%H%M)
|
||||
endif
|
||||
endif
|
||||
|
||||
# RPM build parameters
|
||||
RPMSPECDIR= packaging/rpm
|
||||
RPMSPEC = $(RPMSPECDIR)/ansible.spec
|
||||
RPMDIST = $(shell rpm --eval '%{?dist}')
|
||||
RPMRELEASE = 1
|
||||
ifeq ($(OFFICIAL),)
|
||||
RPMRELEASE = 0.git$(DATE)
|
||||
endif
|
||||
RPMNVR = "$(NAME)-$(VERSION)-$(RPMRELEASE)$(RPMDIST)"
|
||||
|
||||
NOSETESTS := nosetests
|
||||
|
||||
########################################################
|
||||
|
||||
all: clean python
|
||||
|
||||
tests:
|
||||
PYTHONPATH=./lib $(NOSETESTS) -d -v
|
||||
|
||||
# To force a rebuild of the docs run 'touch VERSION && make docs'
|
||||
docs: $(MANPAGES) modulepages
|
||||
|
||||
authors:
|
||||
sh hacking/authors.sh
|
||||
|
||||
# Regenerate %.1.asciidoc if %.1.asciidoc.in has been modified more
|
||||
# recently than %.1.asciidoc.
|
||||
%.1.asciidoc: %.1.asciidoc.in
|
||||
sed "s/%VERSION%/$(VERSION)/" $< > $@
|
||||
|
||||
# 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)
|
||||
|
||||
loc:
|
||||
sloccount lib library bin
|
||||
|
||||
pep8:
|
||||
@echo "#############################################"
|
||||
@echo "# Running PEP8 Compliance Tests"
|
||||
@echo "#############################################"
|
||||
-pep8 -r --ignore=E501,E221,W291,W391,E302,E251,E203,W293,E231,E303,E201,E225,E261,E241 lib/ bin/
|
||||
-pep8 -r --ignore=E501,E221,W291,W391,E302,E251,E203,W293,E231,E303,E201,E225,E261,E241 --filename "*" library/
|
||||
|
||||
pyflakes:
|
||||
pyflakes lib/ansible/*.py bin/*
|
||||
|
||||
clean:
|
||||
@echo "Cleaning up distutils stuff"
|
||||
rm -rf build
|
||||
rm -rf dist
|
||||
@echo "Cleaning up byte compiled python stuff"
|
||||
find . -type f -regex ".*\.py[co]$$" -delete
|
||||
@echo "Cleaning up editor backup files"
|
||||
find . -type f \( -name "*~" -or -name "#*" \) -delete
|
||||
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 "*.asciidoc" -delete
|
||||
find ./docs/man/man3 -type f -name "*.3" -delete
|
||||
@echo "Cleaning up output from test runs"
|
||||
rm -rf test/test_data
|
||||
@echo "Cleaning up RPM building stuff"
|
||||
rm -rf MANIFEST rpm-build
|
||||
@echo "Cleaning up Debian building stuff"
|
||||
rm -rf debian
|
||||
rm -rf deb-build
|
||||
rm -rf docs/json
|
||||
rm -rf docs/js
|
||||
@echo "Cleaning up authors file"
|
||||
rm -f AUTHORS.TXT
|
||||
|
||||
python:
|
||||
$(PYTHON) setup.py build
|
||||
|
||||
install:
|
||||
$(PYTHON) setup.py install
|
||||
|
||||
sdist: clean docs
|
||||
$(PYTHON) setup.py sdist -t MANIFEST.in
|
||||
|
||||
rpmcommon: sdist
|
||||
@mkdir -p rpm-build
|
||||
@cp dist/*.gz rpm-build/
|
||||
@sed -e 's#^Version:.*#Version: $(VERSION)#' -e 's#^Release:.*#Release: $(RPMRELEASE)%{?dist}#' $(RPMSPEC) >rpm-build/$(NAME).spec
|
||||
|
||||
srpm: rpmcommon
|
||||
@rpmbuild --define "_topdir %(pwd)/rpm-build" \
|
||||
--define "_builddir %{_topdir}" \
|
||||
--define "_rpmdir %{_topdir}" \
|
||||
--define "_srcrpmdir %{_topdir}" \
|
||||
--define "_specdir $(RPMSPECDIR)" \
|
||||
--define "_sourcedir %{_topdir}" \
|
||||
-bs rpm-build/$(NAME).spec
|
||||
@rm -f rpm-build/$(NAME).spec
|
||||
@echo "#############################################"
|
||||
@echo "Ansible SRPM is built:"
|
||||
@echo " rpm-build/$(RPMNVR).src.rpm"
|
||||
@echo "#############################################"
|
||||
|
||||
rpm: rpmcommon
|
||||
@rpmbuild --define "_topdir %(pwd)/rpm-build" \
|
||||
--define "_builddir %{_topdir}" \
|
||||
--define "_rpmdir %{_topdir}" \
|
||||
--define "_srcrpmdir %{_topdir}" \
|
||||
--define "_specdir $(RPMSPECDIR)" \
|
||||
--define "_sourcedir %{_topdir}" \
|
||||
--define "_rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" \
|
||||
--define "__python `which $(PYTHON)`" \
|
||||
-ba rpm-build/$(NAME).spec
|
||||
@rm -f rpm-build/$(NAME).spec
|
||||
@echo "#############################################"
|
||||
@echo "Ansible RPM is built:"
|
||||
@echo " rpm-build/$(RPMNVR).noarch.rpm"
|
||||
@echo "#############################################"
|
||||
|
||||
debian: sdist
|
||||
deb: debian
|
||||
cp -r packaging/debian ./
|
||||
chmod 755 debian/rules
|
||||
fakeroot debian/rules clean
|
||||
fakeroot dh_install
|
||||
fakeroot debian/rules binary
|
||||
|
||||
# for arch or gentoo, read instructions in the appropriate 'packaging' subdirectory directory
|
||||
|
||||
modulepages:
|
||||
PYTHONPATH=./lib $(PYTHON) hacking/module_formatter.py -A $(VERSION) -t man -o docs/man/man3/ --module-dir=library --template-dir=hacking/templates # --verbose
|
||||
|
||||
# because this requires Sphinx it is not run as part of every build, those building the RPM and so on can ignore this
|
||||
|
||||
webdocs:
|
||||
(cd docsite/latest; make docs)
|
||||
|
||||
109
README.md
109
README.md
@ -1,89 +1,44 @@
|
||||
[](https://pypi.org/project/ansible-core)
|
||||
[](https://docs.ansible.com/ansible/latest/)
|
||||
[](https://docs.ansible.com/ansible/latest/community/communication.html)
|
||||
[](https://dev.azure.com/ansible/ansible/_build/latest?definitionId=20&branchName=devel)
|
||||
[](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html)
|
||||
[](https://docs.ansible.com/ansible/latest/community/communication.html#mailing-list-information)
|
||||
[](COPYING)
|
||||
[](https://bestpractices.coreinfrastructure.org/projects/2372)
|
||||
Ansible
|
||||
=======
|
||||
|
||||
# Ansible
|
||||
Ansible is a radically simple configuration-management, deployment, task-execution, and
|
||||
multinode orchestration framework.
|
||||
|
||||
Ansible is a radically simple IT automation system. It handles
|
||||
configuration management, application deployment, cloud provisioning,
|
||||
ad-hoc task execution, network automation, and multi-node orchestration. Ansible makes complex
|
||||
changes like zero-downtime rolling updates with load balancers easy. More information on the Ansible [website](https://ansible.com/).
|
||||
Read the documentation and more at http://ansibleworks.com/
|
||||
|
||||
## Design Principles
|
||||
Many users run straight from the development branch (it's generally fine to do so), but you might also wish to consume a release. You can find
|
||||
instructions on http://ansibleworks.com/docs/gettingstarted.html for a variety of platforms. If you want a tarball of the last release, go to
|
||||
http://ansibleworks.com/releases/ and you can also install with pip (though that will bring in some optional binary dependencies you normally do not need).
|
||||
|
||||
* Have an extremely simple setup process with a minimal learning curve.
|
||||
* Manage machines 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.
|
||||
Design Principles
|
||||
=================
|
||||
|
||||
## Use Ansible
|
||||
* Dead simple setup
|
||||
* Super fast & parallel by default
|
||||
* No server or client daemons; use existing SSHd
|
||||
* No additional software required on client boxes
|
||||
* Modules can be written in ANY language
|
||||
* Awesome API for creating very powerful distributed scripts
|
||||
* Be usable as non-root
|
||||
* The easiest config management system to use, ever.
|
||||
|
||||
You can install a released version of Ansible with `pip` or a package manager. See our
|
||||
[installation guide](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) for details on installing Ansible
|
||||
on a variety of platforms.
|
||||
Get Involved
|
||||
============
|
||||
|
||||
Power users and developers can run the `devel` branch, which has the latest
|
||||
features and fixes, directly. Although it is reasonably stable, you are more likely to encounter
|
||||
breaking changes when running the `devel` branch. We recommend getting involved
|
||||
in the Ansible community if you want to run the `devel` branch.
|
||||
* [ansible-project mailing list](http://groups.google.com/group/ansible-project), rss: [here](https://groups.google.com/group/ansible-project/feed/rss_v2_0_msgs.xml?num=50&pli=1)
|
||||
* irc.freenode.net: #ansible
|
||||
|
||||
## Get Involved
|
||||
Branch Info
|
||||
===========
|
||||
|
||||
* 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.
|
||||
* Join a [Working Group](https://github.com/ansible/community/wiki),
|
||||
an organized community devoted to a specific technology domain or platform.
|
||||
* Submit a proposed code update through a pull request to the `devel` branch.
|
||||
* Talk to us before making larger changes
|
||||
to avoid duplicate efforts. This not only helps everyone
|
||||
know what is going on, but it also helps save time and effort if we decide
|
||||
some changes are needed.
|
||||
* For a list of email lists, IRC channels and Working Groups, see the
|
||||
[Communication page](https://docs.ansible.com/ansible/latest/community/communication.html)
|
||||
* Releases are 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 "CONTRIBUTING.md" for process notes.
|
||||
|
||||
## Coding Guidelines
|
||||
Author
|
||||
======
|
||||
|
||||
We document our Coding Guidelines in the [Developer Guide](https://docs.ansible.com/ansible/devel/dev_guide/). We particularly suggest you review:
|
||||
Michael DeHaan -- michael@ansibleworks.com
|
||||
|
||||
* [Contributing your module to Ansible](https://docs.ansible.com/ansible/devel/dev_guide/developing_modules_checklist.html)
|
||||
* [Conventions, tips, and pitfalls](https://docs.ansible.com/ansible/devel/dev_guide/developing_modules_best_practices.html)
|
||||
|
||||
## Branch Info
|
||||
|
||||
* The `devel` branch corresponds to the release actively under development.
|
||||
* The `stable-2.X` branches correspond to stable releases.
|
||||
* Create a branch based on `devel` and set up a [dev environment](https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html#common-environment-setup) if you want to open a PR.
|
||||
* See the [Ansible release and maintenance](https://docs.ansible.com/ansible/devel/reference_appendices/release_and_maintenance.html) page for information about active branches.
|
||||
|
||||
## Roadmap
|
||||
|
||||
Based on team and community feedback, an initial roadmap will be published for a major or minor version (ex: 2.7, 2.8).
|
||||
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)
|
||||
and has contributions from over 5000 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 or later
|
||||
|
||||
See [COPYING](COPYING) to see the full text.
|
||||
[AnsibleWorks](http://ansibleworks.com)
|
||||
|
||||
22
RELEASES.txt
Normal file
22
RELEASES.txt
Normal file
@ -0,0 +1,22 @@
|
||||
Ansible Releases at a Glance
|
||||
============================
|
||||
|
||||
1.4 "Could This Be Magic?" - active development
|
||||
1.3 "Top of the World" ----- 09-13-2013
|
||||
1.2.3 "Hear About It Later" -- 08-21-2013
|
||||
1.2.2 "Hear About It Later" -- 07-05-2013
|
||||
1.2.1 "Hear About It Later" -- 07-04-2013
|
||||
1.2 "Right Now" ------------ 06-10-2013
|
||||
1.1 "Mean Street" ---------- 04-02-2013
|
||||
1.0 "Eruption" ------------- 02-01-2013
|
||||
0.9 "Dreams" --------------- 11-30-2012
|
||||
0.8 "Cathedral" ------------ 10-19-2012
|
||||
0.7 "Panama" --------------- 09-06-2012
|
||||
0.6 "Cabo" ----------------- 08-06-2012
|
||||
0.5 "Amsterdam" ------------ 07-04-2012
|
||||
0.4 "Unchained" ------------ 05-23-2012
|
||||
0.3 "Baluchitherium" ------- 04-23-2012
|
||||
0.0.2 Untitled
|
||||
0.0.1 Untitled
|
||||
|
||||
|
||||
@ -1 +0,0 @@
|
||||
../lib/ansible/cli/adhoc.py
|
||||
167
bin/ansible
Executable file
167
bin/ansible
Executable file
@ -0,0 +1,167 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# (c) 2012, Michael DeHaan <michael.dehaan@gmail.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/>.
|
||||
|
||||
########################################################
|
||||
|
||||
import sys
|
||||
|
||||
from ansible.runner import Runner
|
||||
import ansible.constants as C
|
||||
from ansible import utils
|
||||
from ansible import errors
|
||||
from ansible import callbacks
|
||||
from ansible import inventory
|
||||
########################################################
|
||||
|
||||
class Cli(object):
|
||||
''' code behind bin/ansible '''
|
||||
|
||||
# ----------------------------------------------
|
||||
|
||||
def __init__(self):
|
||||
self.stats = callbacks.AggregateStats()
|
||||
self.callbacks = callbacks.CliRunnerCallbacks()
|
||||
|
||||
# ----------------------------------------------
|
||||
|
||||
def parse(self):
|
||||
''' create an options parser for bin/ansible '''
|
||||
|
||||
parser = utils.base_parser(
|
||||
constants=C,
|
||||
runas_opts=True,
|
||||
subset_opts=True,
|
||||
async_opts=True,
|
||||
output_opts=True,
|
||||
connect_opts=True,
|
||||
check_opts=True,
|
||||
diff_opts=False,
|
||||
usage='%prog <host-pattern> [options]'
|
||||
)
|
||||
|
||||
parser.add_option('-a', '--args', dest='module_args',
|
||||
help="module arguments", default=C.DEFAULT_MODULE_ARGS)
|
||||
parser.add_option('-m', '--module-name', dest='module_name',
|
||||
help="module name to execute (default=%s)" % C.DEFAULT_MODULE_NAME,
|
||||
default=C.DEFAULT_MODULE_NAME)
|
||||
|
||||
options, args = parser.parse_args()
|
||||
self.callbacks.options = options
|
||||
|
||||
if len(args) == 0 or len(args) > 1:
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
return (options, args)
|
||||
|
||||
# ----------------------------------------------
|
||||
|
||||
def run(self, options, args):
|
||||
''' use Runner lib to do SSH things '''
|
||||
|
||||
pattern = args[0]
|
||||
|
||||
inventory_manager = inventory.Inventory(options.inventory)
|
||||
if options.subset:
|
||||
inventory_manager.subset(options.subset)
|
||||
hosts = inventory_manager.list_hosts(pattern)
|
||||
if len(hosts) == 0:
|
||||
callbacks.display("No hosts matched", stderr=True)
|
||||
sys.exit(1)
|
||||
|
||||
if options.listhosts:
|
||||
for host in hosts:
|
||||
callbacks.display(' %s' % host)
|
||||
sys.exit(0)
|
||||
|
||||
if ((options.module_name == 'command' or options.module_name == 'shell')
|
||||
and not options.module_args):
|
||||
callbacks.display("No argument passed to %s module" % options.module_name, color='red', stderr=True)
|
||||
sys.exit(1)
|
||||
|
||||
sshpass = None
|
||||
sudopass = None
|
||||
options.ask_pass = options.ask_pass or C.DEFAULT_ASK_PASS
|
||||
# Never ask for an SSH password when we run with local connection
|
||||
if options.connection == "local":
|
||||
options.ask_pass = False
|
||||
options.ask_sudo_pass = options.ask_sudo_pass or C.DEFAULT_ASK_SUDO_PASS
|
||||
(sshpass, sudopass) = utils.ask_passwords(ask_pass=options.ask_pass, ask_sudo_pass=options.ask_sudo_pass)
|
||||
if options.sudo_user or options.ask_sudo_pass:
|
||||
options.sudo = True
|
||||
options.sudo_user = options.sudo_user or C.DEFAULT_SUDO_USER
|
||||
if options.tree:
|
||||
utils.prepare_writeable_dir(options.tree)
|
||||
|
||||
runner = Runner(
|
||||
module_name=options.module_name, module_path=options.module_path,
|
||||
module_args=options.module_args,
|
||||
remote_user=options.remote_user, remote_pass=sshpass,
|
||||
inventory=inventory_manager, timeout=options.timeout,
|
||||
private_key_file=options.private_key_file,
|
||||
forks=options.forks,
|
||||
pattern=pattern,
|
||||
callbacks=self.callbacks, sudo=options.sudo,
|
||||
sudo_pass=sudopass,sudo_user=options.sudo_user,
|
||||
transport=options.connection, subset=options.subset,
|
||||
check=options.check,
|
||||
diff=options.check
|
||||
)
|
||||
|
||||
if options.seconds:
|
||||
callbacks.display("background launch...\n\n", color='cyan')
|
||||
results, poller = runner.run_async(options.seconds)
|
||||
results = self.poll_while_needed(poller, options)
|
||||
else:
|
||||
results = runner.run()
|
||||
|
||||
return (runner, results)
|
||||
|
||||
# ----------------------------------------------
|
||||
|
||||
def poll_while_needed(self, poller, options):
|
||||
''' summarize results from Runner '''
|
||||
|
||||
# BACKGROUND POLL LOGIC when -B and -P are specified
|
||||
if options.seconds and options.poll_interval > 0:
|
||||
poller.wait(options.seconds, options.poll_interval)
|
||||
|
||||
return poller.results
|
||||
|
||||
|
||||
########################################################
|
||||
|
||||
if __name__ == '__main__':
|
||||
callbacks.display("", log_only=True)
|
||||
callbacks.display(" ".join(sys.argv), log_only=True)
|
||||
callbacks.display("", log_only=True)
|
||||
|
||||
cli = Cli()
|
||||
(options, args) = cli.parse()
|
||||
try:
|
||||
(runner, results) = cli.run(options, args)
|
||||
for result in results['contacted'].values():
|
||||
if 'failed' in result or result.get('rc', 0) != 0:
|
||||
sys.exit(2)
|
||||
if results['dark']:
|
||||
sys.exit(3)
|
||||
except errors.AnsibleError, e:
|
||||
# Generic handler for ansible specific errors
|
||||
callbacks.display("ERROR: %s" % str(e), stderr=True, color='red')
|
||||
sys.exit(1)
|
||||
|
||||
@ -1 +0,0 @@
|
||||
../lib/ansible/cli/config.py
|
||||
@ -1 +0,0 @@
|
||||
../lib/ansible/cli/scripts/ansible_connection_cli_stub.py
|
||||
@ -1 +0,0 @@
|
||||
../lib/ansible/cli/console.py
|
||||
@ -1 +0,0 @@
|
||||
../lib/ansible/cli/doc.py
|
||||
233
bin/ansible-doc
Executable file
233
bin/ansible-doc
Executable file
@ -0,0 +1,233 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# (c) 2012, Jan-Piet Mens <jpmens () gmail.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/>.
|
||||
#
|
||||
|
||||
import os
|
||||
import sys
|
||||
import textwrap
|
||||
import re
|
||||
import optparse
|
||||
import datetime
|
||||
from ansible import utils
|
||||
from ansible.utils import module_docs
|
||||
import ansible.constants as C
|
||||
from ansible.utils import version
|
||||
import traceback
|
||||
|
||||
MODULEDIR = C.DEFAULT_MODULE_PATH
|
||||
|
||||
BLACKLIST_EXTS = ('.swp', '.bak', '~', '.rpm')
|
||||
|
||||
_ITALIC = re.compile(r"I\(([^)]+)\)")
|
||||
_BOLD = re.compile(r"B\(([^)]+)\)")
|
||||
_MODULE = re.compile(r"M\(([^)]+)\)")
|
||||
_URL = re.compile(r"U\(([^)]+)\)")
|
||||
_CONST = re.compile(r"C\(([^)]+)\)")
|
||||
|
||||
def tty_ify(text):
|
||||
|
||||
t = _ITALIC.sub("`" + r"\1" + "'", text) # I(word) => `word'
|
||||
t = _BOLD.sub("*" + r"\1" + "*", t) # B(word) => *word*
|
||||
t = _MODULE.sub("[" + r"\1" + "]", t) # M(word) => [word]
|
||||
t = _URL.sub(r"\1", t) # U(word) => word
|
||||
t = _CONST.sub("`" + r"\1" + "'", t) # C(word) => `word'
|
||||
|
||||
return t
|
||||
|
||||
def print_man(doc):
|
||||
|
||||
opt_indent=" "
|
||||
print "> %s\n" % doc['module'].upper()
|
||||
|
||||
desc = "".join(doc['description'])
|
||||
|
||||
print "%s\n" % textwrap.fill(tty_ify(desc), initial_indent=" ", subsequent_indent=" ")
|
||||
|
||||
if 'option_keys' in doc and len(doc['option_keys']) > 0:
|
||||
print "Options (= is mandatory):\n"
|
||||
|
||||
for o in doc['option_keys']:
|
||||
opt = doc['options'][o]
|
||||
|
||||
if opt.get('required', False):
|
||||
opt_leadin = "="
|
||||
else:
|
||||
opt_leadin = "-"
|
||||
|
||||
print "%s %s" % (opt_leadin, o)
|
||||
|
||||
desc = "".join(opt['description'])
|
||||
|
||||
if 'choices' in opt:
|
||||
choices = ", ".join(str(i) for i in opt['choices'])
|
||||
desc = desc + " (Choices: " + choices + ")"
|
||||
print "%s\n" % textwrap.fill(tty_ify(desc), initial_indent=opt_indent,
|
||||
subsequent_indent=opt_indent)
|
||||
|
||||
if 'notes' in doc and len(doc['notes']) > 0:
|
||||
notes = "".join(doc['notes'])
|
||||
print "Notes:%s\n" % textwrap.fill(tty_ify(notes), initial_indent=" ",
|
||||
subsequent_indent=opt_indent)
|
||||
|
||||
|
||||
if 'requirements' in doc and doc['requirements'] is not None and len(doc['requirements']) > 0:
|
||||
req = ", ".join(doc['requirements'])
|
||||
print "Requirements:%s\n" % textwrap.fill(tty_ify(req), initial_indent=" ",
|
||||
subsequent_indent=opt_indent)
|
||||
|
||||
if 'examples' in doc and len(doc['examples']) > 0:
|
||||
print "Example%s:\n" % ('' if len(doc['examples']) < 2 else 's')
|
||||
for ex in doc['examples']:
|
||||
print "%s\n" % (ex['code'])
|
||||
|
||||
if 'plainexamples' in doc and doc['plainexamples'] is not None:
|
||||
print doc['plainexamples']
|
||||
|
||||
|
||||
def print_snippet(doc):
|
||||
|
||||
desc = tty_ify("".join(doc['short_description']))
|
||||
print "- name: %s" % (desc)
|
||||
print " action: %s" % (doc['module'])
|
||||
|
||||
for o in doc['options']:
|
||||
opt = doc['options'][o]
|
||||
desc = tty_ify("".join(opt['description']))
|
||||
s = o + "="
|
||||
print " %-20s # %s" % (s, desc)
|
||||
|
||||
def main():
|
||||
|
||||
p = optparse.OptionParser(
|
||||
version=version("%prog"),
|
||||
usage='usage: %prog [options] [module...]',
|
||||
description='Show Ansible module documentation',
|
||||
)
|
||||
|
||||
p.add_option("-M", "--module-path",
|
||||
action="store",
|
||||
dest="module_path",
|
||||
default=MODULEDIR,
|
||||
help="Ansible modules/ directory")
|
||||
p.add_option("-l", "--list",
|
||||
action="store_true",
|
||||
default=False,
|
||||
dest='list_dir',
|
||||
help='List available modules')
|
||||
p.add_option("-s", "--snippet",
|
||||
action="store_true",
|
||||
default=False,
|
||||
dest='show_snippet',
|
||||
help='Show playbook snippet for specified module(s)')
|
||||
p.add_option('-v', action='version', help='Show version number and exit')
|
||||
|
||||
(options, args) = p.parse_args()
|
||||
|
||||
if options.module_path is not None:
|
||||
for i in options.module_path.split(os.pathsep):
|
||||
utils.plugins.module_finder.add_directory(i)
|
||||
|
||||
if options.list_dir:
|
||||
# list all modules
|
||||
paths = utils.plugins.module_finder._get_paths()
|
||||
module_list = []
|
||||
for path in paths:
|
||||
# os.system("ls -C %s" % (path))
|
||||
if os.path.isdir(path):
|
||||
for module in os.listdir(path):
|
||||
if any(module.endswith(x) for x in BLACKLIST_EXTS):
|
||||
continue
|
||||
module_list.append(module)
|
||||
|
||||
for module in sorted(set(module_list)):
|
||||
|
||||
if module in module_docs.BLACKLIST_MODULES:
|
||||
continue
|
||||
|
||||
filename = utils.plugins.module_finder.find_plugin(module)
|
||||
if os.path.isdir(filename):
|
||||
continue
|
||||
try:
|
||||
doc, plainexamples = module_docs.get_docstring(filename)
|
||||
desc = tty_ify(doc.get('short_description', '?'))
|
||||
if len(desc) > 55:
|
||||
desc = desc + '...'
|
||||
print "%-20s %-60.60s" % (module, desc)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
sys.stderr.write("ERROR: module %s has a documentation error formatting or is missing documentation\n" % module)
|
||||
pass
|
||||
|
||||
sys.exit()
|
||||
|
||||
if len(args) == 0:
|
||||
p.print_help()
|
||||
|
||||
def print_paths(finder):
|
||||
''' Returns a string suitable for printing of the search path '''
|
||||
|
||||
# Uses a list to get the order right
|
||||
ret = []
|
||||
for i in finder._get_paths():
|
||||
if i not in ret:
|
||||
ret.append(i)
|
||||
return os.pathsep.join(ret)
|
||||
|
||||
for module in args:
|
||||
|
||||
filename = utils.plugins.module_finder.find_plugin(module)
|
||||
if filename is None:
|
||||
sys.stderr.write("module %s not found in %s\n" % (module,
|
||||
print_paths(utils.plugins.module_finder)))
|
||||
continue
|
||||
|
||||
if any(filename.endswith(x) for x in BLACKLIST_EXTS):
|
||||
continue
|
||||
|
||||
try:
|
||||
doc, plainexamples = module_docs.get_docstring(filename)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
sys.stderr.write("ERROR: module %s has a documentation error formatting or is missing documentation\n" % module)
|
||||
continue
|
||||
|
||||
if doc is not None:
|
||||
|
||||
all_keys = []
|
||||
for (k,v) in doc['options'].iteritems():
|
||||
all_keys.append(k)
|
||||
all_keys = sorted(all_keys)
|
||||
doc['option_keys'] = all_keys
|
||||
|
||||
doc['filename'] = filename
|
||||
doc['docuri'] = doc['module'].replace('_', '-')
|
||||
doc['now_date'] = datetime.date.today().strftime('%Y-%m-%d')
|
||||
doc['plainexamples'] = plainexamples
|
||||
|
||||
if options.show_snippet:
|
||||
print_snippet(doc)
|
||||
else:
|
||||
print_man(doc)
|
||||
else:
|
||||
# this typically means we couldn't even parse the docstring, not just that the YAML is busted,
|
||||
# probably a quoting issue.
|
||||
sys.stderr.write("ERROR: module %s missing documentation (or could not parse documentation)\n" % module)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -1 +0,0 @@
|
||||
../lib/ansible/cli/galaxy.py
|
||||
@ -1 +0,0 @@
|
||||
../lib/ansible/cli/inventory.py
|
||||
@ -1 +0,0 @@
|
||||
../lib/ansible/cli/playbook.py
|
||||
272
bin/ansible-playbook
Executable file
272
bin/ansible-playbook
Executable file
@ -0,0 +1,272 @@
|
||||
#!/usr/bin/env python
|
||||
# (C) 2012, Michael DeHaan, <michael.dehaan@gmail.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/>.
|
||||
|
||||
#######################################################
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
import ansible.playbook
|
||||
import ansible.constants as C
|
||||
import ansible.utils.template
|
||||
from ansible import errors
|
||||
from ansible import callbacks
|
||||
from ansible import utils
|
||||
from ansible.color import ANSIBLE_COLOR, stringc
|
||||
from ansible.callbacks import display
|
||||
|
||||
def colorize(lead, num, color):
|
||||
""" Print 'lead' = 'num' in 'color' """
|
||||
if num != 0 and ANSIBLE_COLOR and color is not None:
|
||||
return "%s%s%-15s" % (stringc(lead, color), stringc("=", color), stringc(str(num), color))
|
||||
else:
|
||||
return "%s=%-4s" % (lead, str(num))
|
||||
|
||||
def hostcolor(host, stats, color=True):
|
||||
if ANSIBLE_COLOR and color:
|
||||
if stats['failures'] != 0 or stats['unreachable'] != 0:
|
||||
return "%-37s" % stringc(host, 'red')
|
||||
elif stats['changed'] != 0:
|
||||
return "%-37s" % stringc(host, 'yellow')
|
||||
else:
|
||||
return "%-37s" % stringc(host, 'green')
|
||||
return "%-26s" % host
|
||||
|
||||
|
||||
def main(args):
|
||||
''' run ansible-playbook operations '''
|
||||
|
||||
# create parser for CLI options
|
||||
parser = utils.base_parser(
|
||||
constants=C,
|
||||
usage = "%prog playbook.yml",
|
||||
connect_opts=True,
|
||||
runas_opts=True,
|
||||
subset_opts=True,
|
||||
check_opts=True,
|
||||
diff_opts=True
|
||||
)
|
||||
parser.add_option('-e', '--extra-vars', dest="extra_vars", action="append",
|
||||
help="set additional variables as key=value or YAML/JSON", default=[])
|
||||
parser.add_option('-t', '--tags', dest='tags', default='all',
|
||||
help="only run plays and tasks tagged with these values")
|
||||
parser.add_option('--skip-tags', dest='skip_tags',
|
||||
help="only run plays and tasks whose tags do not match these values")
|
||||
parser.add_option('--syntax-check', dest='syntax', action='store_true',
|
||||
help="perform a syntax check on the playbook, but do not execute it")
|
||||
parser.add_option('--list-tasks', dest='listtasks', action='store_true',
|
||||
help="list all tasks that would be executed")
|
||||
parser.add_option('--step', dest='step', action='store_true',
|
||||
help="one-step-at-a-time: confirm each task before running")
|
||||
parser.add_option('--start-at-task', dest='start_at',
|
||||
help="start the playbook at the task matching this name")
|
||||
|
||||
options, args = parser.parse_args(args)
|
||||
|
||||
if len(args) == 0:
|
||||
parser.print_help(file=sys.stderr)
|
||||
return 1
|
||||
|
||||
inventory = ansible.inventory.Inventory(options.inventory)
|
||||
inventory.subset(options.subset)
|
||||
if len(inventory.list_hosts()) == 0:
|
||||
raise errors.AnsibleError("provided hosts list is empty")
|
||||
|
||||
sshpass = None
|
||||
sudopass = None
|
||||
if not options.listhosts and not options.syntax and not options.listtasks:
|
||||
options.ask_pass = options.ask_pass or C.DEFAULT_ASK_PASS
|
||||
# Never ask for an SSH password when we run with local connection
|
||||
if options.connection == "local":
|
||||
options.ask_pass = False
|
||||
options.ask_sudo_pass = options.ask_sudo_pass or C.DEFAULT_ASK_SUDO_PASS
|
||||
(sshpass, sudopass) = utils.ask_passwords(ask_pass=options.ask_pass, ask_sudo_pass=options.ask_sudo_pass)
|
||||
options.sudo_user = options.sudo_user or C.DEFAULT_SUDO_USER
|
||||
|
||||
extra_vars = {}
|
||||
for extra_vars_opt in options.extra_vars:
|
||||
if extra_vars_opt.startswith("@"):
|
||||
# Argument is a YAML file (JSON is a subset of YAML)
|
||||
extra_vars = utils.combine_vars(extra_vars, utils.parse_yaml_from_file(extra_vars_opt[1:]))
|
||||
elif extra_vars_opt and extra_vars_opt[0] in '[{':
|
||||
# Arguments as YAML
|
||||
extra_vars = utils.combine_vars(extra_vars, utils.parse_yaml(extra_vars_opt))
|
||||
else:
|
||||
# Arguments as Key-value
|
||||
extra_vars = utils.combine_vars(extra_vars, utils.parse_kv(extra_vars_opt))
|
||||
|
||||
only_tags = options.tags.split(",")
|
||||
skip_tags = options.skip_tags
|
||||
if options.skip_tags is not None:
|
||||
skip_tags = options.skip_tags.split(",")
|
||||
|
||||
for playbook in args:
|
||||
if not os.path.exists(playbook):
|
||||
raise errors.AnsibleError("the playbook: %s could not be found" % playbook)
|
||||
if not os.path.isfile(playbook):
|
||||
raise errors.AnsibleError("the playbook: %s does not appear to be a file" % playbook)
|
||||
|
||||
# run all playbooks specified on the command line
|
||||
for playbook in args:
|
||||
|
||||
# let inventory know which playbooks are using so it can know the basedirs
|
||||
inventory.set_playbook_basedir(os.path.dirname(playbook))
|
||||
|
||||
stats = callbacks.AggregateStats()
|
||||
playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
|
||||
if options.step:
|
||||
playbook_cb.step = options.step
|
||||
if options.start_at:
|
||||
playbook_cb.start_at = options.start_at
|
||||
runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)
|
||||
|
||||
pb = ansible.playbook.PlayBook(
|
||||
playbook=playbook,
|
||||
module_path=options.module_path,
|
||||
inventory=inventory,
|
||||
forks=options.forks,
|
||||
remote_user=options.remote_user,
|
||||
remote_pass=sshpass,
|
||||
callbacks=playbook_cb,
|
||||
runner_callbacks=runner_cb,
|
||||
stats=stats,
|
||||
timeout=options.timeout,
|
||||
transport=options.connection,
|
||||
sudo=options.sudo,
|
||||
sudo_user=options.sudo_user,
|
||||
sudo_pass=sudopass,
|
||||
extra_vars=extra_vars,
|
||||
private_key_file=options.private_key_file,
|
||||
only_tags=only_tags,
|
||||
skip_tags=skip_tags,
|
||||
check=options.check,
|
||||
diff=options.diff
|
||||
)
|
||||
|
||||
if options.listhosts or options.listtasks:
|
||||
print ''
|
||||
print 'playbook: %s' % playbook
|
||||
print ''
|
||||
playnum = 0
|
||||
for (play_ds, play_basedir) in zip(pb.playbook, pb.play_basedirs):
|
||||
playnum += 1
|
||||
play = ansible.playbook.Play(pb, play_ds, play_basedir)
|
||||
label = play.name
|
||||
if options.listhosts:
|
||||
hosts = pb.inventory.list_hosts(play.hosts)
|
||||
print ' play #%d (%s): host count=%d' % (playnum, label, len(hosts))
|
||||
for host in hosts:
|
||||
print ' %s' % host
|
||||
if options.listtasks:
|
||||
matched_tags, unmatched_tags = play.compare_tags(pb.only_tags)
|
||||
|
||||
# Remove skipped tasks
|
||||
matched_tags = matched_tags - set(pb.skip_tags)
|
||||
|
||||
unmatched_tags.discard('all')
|
||||
unknown_tags = ((set(pb.only_tags) | set(pb.skip_tags)) -
|
||||
(matched_tags | unmatched_tags))
|
||||
|
||||
if unknown_tags:
|
||||
continue
|
||||
print ' play #%d (%s):' % (playnum, label)
|
||||
|
||||
for task in play.tasks():
|
||||
if (set(task.tags).intersection(pb.only_tags) and not
|
||||
set(task.tags).intersection(pb.skip_tags)):
|
||||
if getattr(task, 'name', None) is not None:
|
||||
# meta tasks have no names
|
||||
print ' %s' % task.name
|
||||
print ''
|
||||
continue
|
||||
|
||||
if options.syntax:
|
||||
# if we've not exited by now then we are fine.
|
||||
print 'Playbook Syntax is fine'
|
||||
return 0
|
||||
|
||||
failed_hosts = []
|
||||
unreachable_hosts = []
|
||||
|
||||
try:
|
||||
|
||||
pb.run()
|
||||
|
||||
hosts = sorted(pb.stats.processed.keys())
|
||||
display(callbacks.banner("PLAY RECAP"))
|
||||
playbook_cb.on_stats(pb.stats)
|
||||
|
||||
for h in hosts:
|
||||
t = pb.stats.summarize(h)
|
||||
if t['failures'] > 0:
|
||||
failed_hosts.append(h)
|
||||
if t['unreachable'] > 0:
|
||||
unreachable_hosts.append(h)
|
||||
|
||||
retries = failed_hosts + unreachable_hosts
|
||||
|
||||
if len(retries) > 0:
|
||||
filename = pb.generate_retry_inventory(retries)
|
||||
if filename:
|
||||
display(" to retry, use: --limit @%s\n" % filename)
|
||||
|
||||
for h in hosts:
|
||||
t = pb.stats.summarize(h)
|
||||
|
||||
display("%s : %s %s %s %s" % (
|
||||
hostcolor(h, t),
|
||||
colorize('ok', t['ok'], 'green'),
|
||||
colorize('changed', t['changed'], 'yellow'),
|
||||
colorize('unreachable', t['unreachable'], 'red'),
|
||||
colorize('failed', t['failures'], 'red')),
|
||||
screen_only=True
|
||||
)
|
||||
|
||||
display("%s : %s %s %s %s" % (
|
||||
hostcolor(h, t, False),
|
||||
colorize('ok', t['ok'], None),
|
||||
colorize('changed', t['changed'], None),
|
||||
colorize('unreachable', t['unreachable'], None),
|
||||
colorize('failed', t['failures'], None)),
|
||||
log_only=True
|
||||
)
|
||||
|
||||
|
||||
print ""
|
||||
if len(failed_hosts) > 0:
|
||||
return 2
|
||||
if len(unreachable_hosts) > 0:
|
||||
return 3
|
||||
|
||||
except errors.AnsibleError, e:
|
||||
display("ERROR: %s" % e, color='red')
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
display(" ", log_only=True)
|
||||
display(" ".join(sys.argv), log_only=True)
|
||||
display(" ", log_only=True)
|
||||
try:
|
||||
sys.exit(main(sys.argv[1:]))
|
||||
except errors.AnsibleError, e:
|
||||
display("ERROR: %s" % e, color='red', stderr=True)
|
||||
sys.exit(1)
|
||||
|
||||
@ -1 +0,0 @@
|
||||
../lib/ansible/cli/pull.py
|
||||
180
bin/ansible-pull
Executable file
180
bin/ansible-pull
Executable file
@ -0,0 +1,180 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# (c) 2012, Stephen Fromm <sfromm@gmail.com>
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
# ansible-pull is a script that runs ansible in local mode
|
||||
# after checking out a playbooks directory from source repo. There is an
|
||||
# example playbook to bootstrap this script in the examples/ dir which
|
||||
# installs ansible and sets it up to run on cron.
|
||||
|
||||
# usage:
|
||||
# ansible-pull -d /var/lib/ansible \
|
||||
# -U http://example.net/content.git [-C production] \
|
||||
# [path/playbook.yml]
|
||||
#
|
||||
# the -d and -U arguments are required; the -C argument is optional.
|
||||
#
|
||||
# ansible-pull accepts an optional argument to specify a playbook
|
||||
# location underneath the workdir and then searches the source repo
|
||||
# for playbooks in the following order, stopping at the first match:
|
||||
#
|
||||
# 1. $workdir/path/playbook.yml, if specified
|
||||
# 2. $workdir/$hostname.yml
|
||||
# 3. $workdir/local.yml
|
||||
#
|
||||
# the source repo must contain at least one of these playbooks.
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import datetime
|
||||
import socket
|
||||
from ansible import utils
|
||||
|
||||
DEFAULT_REPO_TYPE = 'git'
|
||||
DEFAULT_PLAYBOOK = 'local.yml'
|
||||
PLAYBOOK_ERRORS = {1: 'File does not exist',
|
||||
2: 'File is not readable'}
|
||||
|
||||
|
||||
def _run(cmd):
|
||||
print >>sys.stderr, "Running: '%s'" % cmd
|
||||
cmd = subprocess.Popen(cmd, shell=True,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
(out, err) = cmd.communicate()
|
||||
print out
|
||||
if cmd.returncode != 0:
|
||||
print >>sys.stderr, err
|
||||
return cmd.returncode, out
|
||||
|
||||
|
||||
def try_playbook(path):
|
||||
if not os.path.exists(path):
|
||||
return 1
|
||||
if not os.access(path, os.R_OK):
|
||||
return 2
|
||||
return 0
|
||||
|
||||
|
||||
def select_playbook(path, args):
|
||||
playbook = None
|
||||
if len(args) > 0 and args[0] is not None:
|
||||
playbook = "%s/%s" % (path, args[0])
|
||||
rc = try_playbook(playbook)
|
||||
if rc != 0:
|
||||
print >>sys.stderr, "%s: %s" % (playbook, PLAYBOOK_ERRORS[rc])
|
||||
return None
|
||||
return playbook
|
||||
else:
|
||||
hostpb = "%s/%s.yml" % (path, socket.getfqdn())
|
||||
localpb = "%s/%s" % (path, DEFAULT_PLAYBOOK)
|
||||
errors = []
|
||||
for pb in [hostpb, localpb]:
|
||||
rc = try_playbook(pb)
|
||||
if rc == 0:
|
||||
playbook = pb
|
||||
break
|
||||
else:
|
||||
errors.append("%s: %s" % (pb, PLAYBOOK_ERRORS[rc]))
|
||||
if playbook is None:
|
||||
print >>sys.stderr, "\n".join(errors)
|
||||
return playbook
|
||||
|
||||
|
||||
def main(args):
|
||||
""" Set up and run a local playbook """
|
||||
usage = "%prog [options] [playbook.yml]"
|
||||
parser = utils.SortedOptParser(usage=usage)
|
||||
parser.add_option('--purge', default=False, action='store_true',
|
||||
help='purge checkout after playbook run')
|
||||
parser.add_option('-o', '--only-if-changed', dest='ifchanged', default=False, action='store_true',
|
||||
help='only run the playbook if the repository has been updated')
|
||||
parser.add_option('-d', '--directory', dest='dest', default=None,
|
||||
help='directory to checkout repository to')
|
||||
parser.add_option('-U', '--url', dest='url', default=None,
|
||||
help='URL of the playbook repository')
|
||||
parser.add_option('-C', '--checkout', dest='checkout',
|
||||
help='branch/tag/commit to checkout. '
|
||||
'Defaults to behavior of repository module.')
|
||||
parser.add_option('-i', '--inventory-file', dest='inventory',
|
||||
help="location of the inventory host file")
|
||||
parser.add_option('-m', '--module-name', dest='module_name',
|
||||
default=DEFAULT_REPO_TYPE,
|
||||
help='Module name used to check out repository. '
|
||||
'Default is %s.' % DEFAULT_REPO_TYPE)
|
||||
options, args = parser.parse_args(args)
|
||||
|
||||
if not options.dest:
|
||||
parser.error("Missing required directory argument")
|
||||
return 1
|
||||
|
||||
options.dest = os.path.abspath(options.dest)
|
||||
|
||||
if not options.url:
|
||||
parser.error("URL for repository not specified, use -h for help")
|
||||
return 1
|
||||
|
||||
now = datetime.datetime.now()
|
||||
print >>sys.stderr, now.strftime("Starting ansible-pull at %F %T")
|
||||
|
||||
inv_opts = 'localhost,'
|
||||
limit_opts = 'localhost:%s:127.0.0.1' % socket.getfqdn()
|
||||
base_opts = '-c local --limit "%s"' % limit_opts
|
||||
repo_opts = "name=%s dest=%s" % (options.url, options.dest)
|
||||
if options.checkout:
|
||||
repo_opts += ' version=%s' % options.checkout
|
||||
path = utils.plugins.module_finder.find_plugin(options.module_name)
|
||||
if path is None:
|
||||
sys.stderr.write("module '%s' not found.\n" % options.module_name)
|
||||
return 1
|
||||
cmd = 'ansible all -i "%s" %s -m %s -a "%s"' % (
|
||||
inv_opts, base_opts, options.module_name, repo_opts
|
||||
)
|
||||
rc, out = _run(cmd)
|
||||
if rc != 0:
|
||||
return rc
|
||||
elif options.ifchanged and '"changed": true' not in out:
|
||||
print "Repository has not changed, quitting."
|
||||
return 0
|
||||
|
||||
playbook = select_playbook(options.dest, args)
|
||||
|
||||
if playbook is None:
|
||||
print >>sys.stderr, "Could not find a playbook to run."
|
||||
return 1
|
||||
|
||||
cmd = 'ansible-playbook %s %s' % (base_opts, playbook)
|
||||
if options.inventory:
|
||||
cmd += ' -i "%s"' % options.inventory
|
||||
os.chdir(options.dest)
|
||||
rc, out = _run(cmd)
|
||||
|
||||
if options.purge:
|
||||
os.chdir('/')
|
||||
try:
|
||||
shutil.rmtree(options.dest)
|
||||
except Exception, e:
|
||||
print >>sys.stderr, "Failed to remove %s: %s" % (options.dest, str(e))
|
||||
|
||||
return rc
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
sys.exit(main(sys.argv[1:]))
|
||||
except KeyboardInterrupt, e:
|
||||
print >>sys.stderr, "Exit on user request.\n"
|
||||
sys.exit(1)
|
||||
@ -1 +0,0 @@
|
||||
../test/lib/ansible_test/_util/target/cli/ansible_test_cli_stub.py
|
||||
@ -1 +0,0 @@
|
||||
../lib/ansible/cli/vault.py
|
||||
@ -1,342 +0,0 @@
|
||||
=============================================
|
||||
ansible-core 2.16 "All My Love" Release Notes
|
||||
=============================================
|
||||
|
||||
.. contents:: Topics
|
||||
|
||||
|
||||
v2.16.1
|
||||
=======
|
||||
|
||||
Release Summary
|
||||
---------------
|
||||
|
||||
| Release Date: 2023-12-04
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
|
||||
|
||||
Breaking Changes / Porting Guide
|
||||
--------------------------------
|
||||
|
||||
- assert - Nested templating may result in an inability for the conditional to be evaluated. See the porting guide for more information.
|
||||
|
||||
Security Fixes
|
||||
--------------
|
||||
|
||||
- templating - Address issues where internal templating can cause unsafe variables to lose their unsafe designation (CVE-2023-5764)
|
||||
|
||||
Bugfixes
|
||||
--------
|
||||
|
||||
- Fix issue where an ``include_tasks`` handler in a role was not able to locate a file in ``tasks/`` when ``tasks_from`` was used as a role entry point and ``main.yml`` was not present (https://github.com/ansible/ansible/issues/82241)
|
||||
- Plugin loader does not dedupe nor cache filter/test plugins by file basename, but full path name.
|
||||
- Restoring the ability of filters/tests can have same file base name but different tests/filters defined inside.
|
||||
- ansible-pull now will expand relative paths for the ``-d|--directory`` option is now expanded before use.
|
||||
- ansible-pull will now correctly handle become and connection password file options for ansible-playbook.
|
||||
- flush_handlers - properly handle a handler failure in a nested block when ``force_handlers`` is set (http://github.com/ansible/ansible/issues/81532)
|
||||
- module no_log will no longer affect top level booleans, for example ``no_log_module_parameter='a'`` will no longer hide ``changed=False`` as a 'no log value' (matches 'a').
|
||||
- role params now have higher precedence than host facts again, matching documentation, this had unintentionally changed in 2.15.
|
||||
- wait_for should not handle 'non mmapable files' again.
|
||||
|
||||
v2.16.0
|
||||
=======
|
||||
|
||||
Release Summary
|
||||
---------------
|
||||
|
||||
| Release Date: 2023-11-06
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
|
||||
|
||||
Minor Changes
|
||||
-------------
|
||||
|
||||
- Add Python type hints to the Display class (https://github.com/ansible/ansible/issues/80841)
|
||||
- Add ``GALAXY_COLLECTIONS_PATH_WARNING`` option to disable the warning given by ``ansible-galaxy collection install`` when installing a collection to a path that isn't in the configured collection paths.
|
||||
- Add ``python3.12`` to the default ``INTERPRETER_PYTHON_FALLBACK`` list.
|
||||
- Add ``utcfromtimestamp`` and ``utcnow`` to ``ansible.module_utils.compat.datetime`` to return fixed offset datetime objects.
|
||||
- Add a general ``GALAXY_SERVER_TIMEOUT`` config option for distribution servers (https://github.com/ansible/ansible/issues/79833).
|
||||
- Added Python type annotation to connection plugins
|
||||
- CLI argument parsing - Automatically prepend to the help of CLI arguments that support being specified multiple times. (https://github.com/ansible/ansible/issues/22396)
|
||||
- DEFAULT_TRANSPORT now defaults to 'ssh', the old 'smart' option is being deprecated as versions of OpenSSH without control persist are basically not present anymore.
|
||||
- Documentation for set filters ``intersect``, ``difference``, ``symmetric_difference`` and ``union`` now states that the returned list items are in arbitrary order.
|
||||
- Record ``removal_date`` in runtime metadata as a string instead of a date.
|
||||
- Remove the ``CleansingNodeVisitor`` class and its usage due to the templating changes that made it superfluous. Also simplify the ``Conditional`` class.
|
||||
- Removed ``exclude`` and ``recursive-exclude`` commands for generated files from the ``MANIFEST.in`` file. These excludes were unnecessary since releases are expected to be built with a clean worktree.
|
||||
- Removed ``exclude`` commands for sanity test files from the ``MANIFEST.in`` file. These tests were previously excluded because they did not pass when run from an sdist. However, sanity tests are not expected to pass from an sdist, so excluding some (but not all) of the failing tests makes little sense.
|
||||
- Removed redundant ``include`` commands from the ``MANIFEST.in`` file. These includes either duplicated default behavior or another command.
|
||||
- The ``ansible-core`` sdist no longer contains pre-generated man pages. Instead, a ``packaging/cli-doc/build.py`` script is included in the sdist. This script can generate man pages and standalone RST documentation for ``ansible-core`` CLI programs.
|
||||
- The ``docs`` and ``examples`` directories are no longer included in the ``ansible-core`` sdist. These directories have been moved to the https://github.com/ansible/ansible-documentation repository.
|
||||
- The minimum required ``setuptools`` version is now 66.1.0, as it is the oldest version to support Python 3.12.
|
||||
- Update ``ansible_service_mgr`` fact to include init system for SMGL OS family
|
||||
- Use ``ansible.module_utils.common.text.converters`` instead of ``ansible.module_utils._text``.
|
||||
- Use ``importlib.resources.abc.TraversableResources`` instead of deprecated ``importlib.abc.TraversableResources`` where available (https:/github.com/ansible/ansible/pull/81082).
|
||||
- Use ``include`` where ``recursive-include`` is unnecessary in the ``MANIFEST.in`` file.
|
||||
- Use ``package_data`` instead of ``include_package_data`` for ``setup.cfg`` to avoid ``setuptools`` warnings.
|
||||
- Utilize gpg check provided internally by the ``transaction.run`` method as oppose to calling it manually.
|
||||
- ``Templar`` - do not add the ``dict`` constructor to ``globals`` as all required Jinja2 versions already do so
|
||||
- ansible-doc - allow to filter listing of collections and metadata dump by more than one collection (https://github.com/ansible/ansible/pull/81450).
|
||||
- ansible-galaxy - Add a plural option to improve ignoring multiple signature error status codes when installing or verifying collections. A space-separated list of error codes can follow --ignore-signature-status-codes in addition to specifying --ignore-signature-status-code multiple times (for example, ``--ignore-signature-status-codes NO_PUBKEY UNEXPECTED``).
|
||||
- ansible-galaxy - Remove internal configuration argument ``v3`` (https://github.com/ansible/ansible/pull/80721)
|
||||
- ansible-galaxy - add note to the collection dependency resolver error message about pre-releases if ``--pre`` was not provided (https://github.com/ansible/ansible/issues/80048).
|
||||
- ansible-galaxy - used to crash out with a "Errno 20 Not a directory" error when extracting files from a role when hitting a file with an illegal name (https://github.com/ansible/ansible/pull/81553). Now it gives a warning identifying the culprit file and the rule violation (e.g., ``my$class.jar`` has a ``$`` in the name) before crashing out, giving the user a chance to remove the invalid file and try again. (https://github.com/ansible/ansible/pull/81555).
|
||||
- ansible-test - Add Alpine 3.18 to remotes
|
||||
- ansible-test - Add Fedora 38 container.
|
||||
- ansible-test - Add Fedora 38 remote.
|
||||
- ansible-test - Add FreeBSD 13.2 remote.
|
||||
- ansible-test - Add new pylint checker for new ``# deprecated:`` comments within code to trigger errors when time to remove code that has no user facing deprecation message. Only supported in ansible-core, not collections.
|
||||
- ansible-test - Add support for RHEL 8.8 remotes.
|
||||
- ansible-test - Add support for RHEL 9.2 remotes.
|
||||
- ansible-test - Add support for testing with Python 3.12.
|
||||
- ansible-test - Allow float values for the ``--timeout`` option to the ``env`` command. This simplifies testing.
|
||||
- ansible-test - Enable ``thread`` code coverage in addition to the existing ``multiprocessing`` coverage.
|
||||
- ansible-test - Make Python 3.12 the default version used in the ``base`` and ``default`` containers.
|
||||
- ansible-test - RHEL 8.8 provisioning can now be used with the ``--python 3.11`` option.
|
||||
- ansible-test - RHEL 9.2 provisioning can now be used with the ``--python 3.11`` option.
|
||||
- ansible-test - Refactored ``env`` command logic and timeout handling.
|
||||
- ansible-test - Remove Fedora 37 remote support.
|
||||
- ansible-test - Remove Fedora 37 test container.
|
||||
- ansible-test - Remove Python 3.8 and 3.9 from RHEL 8.8.
|
||||
- ansible-test - Remove obsolete embedded script for configuring WinRM on Windows remotes.
|
||||
- ansible-test - Removed Ubuntu 20.04 LTS image from the `--remote` option.
|
||||
- ansible-test - Removed `freebsd/12.4` remote.
|
||||
- ansible-test - Removed `freebsd/13.1` remote.
|
||||
- ansible-test - Removed test remotes: rhel/8.7, rhel/9.1
|
||||
- ansible-test - Removed the deprecated ``--docker-no-pull`` option.
|
||||
- ansible-test - Removed the deprecated ``--no-pip-check`` option.
|
||||
- ansible-test - Removed the deprecated ``foreman`` test plugin.
|
||||
- ansible-test - Removed the deprecated ``govcsim`` support from the ``vcenter`` test plugin.
|
||||
- ansible-test - Replace the ``pytest-forked`` pytest plugin with a custom plugin.
|
||||
- ansible-test - The ``no-get-exception`` sanity test is now limited to plugins in collections. Previously any Python file in a collection was checked for ``get_exception`` usage.
|
||||
- ansible-test - The ``replace-urlopen`` sanity test is now limited to plugins in collections. Previously any Python file in a collection was checked for ``urlopen`` usage.
|
||||
- ansible-test - The ``use-compat-six`` sanity test is now limited to plugins in collections. Previously any Python file in a collection was checked for ``six`` usage.
|
||||
- ansible-test - The openSUSE test container has been updated to openSUSE Leap 15.5.
|
||||
- ansible-test - Update pip to ``23.1.2`` and setuptools to ``67.7.2``.
|
||||
- ansible-test - Update the ``default`` containers.
|
||||
- ansible-test - Update the ``nios-test-container`` to version 2.0.0, which supports API version 2.9.
|
||||
- ansible-test - Update the logic used to detect when ``ansible-test`` is running from source.
|
||||
- ansible-test - Updated the CloudStack test container to version 1.6.1.
|
||||
- ansible-test - Updated the distro test containers to version 6.3.0 to include coverage 7.3.2 for Python 3.8+. The alpine3 container is now based on 3.18 instead of 3.17 and includes Python 3.11 instead of Python 3.10.
|
||||
- ansible-test - Use ``datetime.datetime.now`` with ``tz`` specified instead of ``datetime.datetime.utcnow``.
|
||||
- ansible-test - Use a context manager to perform cleanup at exit instead of using the built-in ``atexit`` module.
|
||||
- ansible-test - When invoking ``sleep`` in containers during container setup, the ``env`` command is used to avoid invoking the shell builtin, if present.
|
||||
- ansible-test - remove Alpine 3.17 from remotes
|
||||
- ansible-test — Python 3.8–3.12 will use ``coverage`` v7.3.2.
|
||||
- ansible-test — ``coverage`` v6.5.0 is to be used only under Python 3.7.
|
||||
- ansible-vault create: Now raises an error when opening the editor without tty. The flag --skip-tty-check restores previous behaviour.
|
||||
- ansible_user_module - tweaked macos user defaults to reflect expected defaults (https://github.com/ansible/ansible/issues/44316)
|
||||
- apt - return calculated diff while running apt clean operation.
|
||||
- blockinfile - add append_newline and prepend_newline options (https://github.com/ansible/ansible/issues/80835).
|
||||
- cli - Added short option '-J' for asking for vault password (https://github.com/ansible/ansible/issues/80523).
|
||||
- command - Add option ``expand_argument_vars`` to disable argument expansion and use literal values - https://github.com/ansible/ansible/issues/54162
|
||||
- config lookup new option show_origin to also return the origin of a configuration value.
|
||||
- display methods for warning and deprecation are now proxied to main process when issued from a fork. This allows for the deduplication of warnings and deprecations to work globally.
|
||||
- dnf5 - enable environment groups installation testing in CI as its support was added.
|
||||
- dnf5 - enable now implemented ``cacheonly`` functionality
|
||||
- executor now skips persistent connection when it detects an action that does not require a connection.
|
||||
- find module - Add ability to filter based on modes
|
||||
- gather_facts now will use gather_timeout setting to limit parallel execution of modules that do not themselves use gather_timeout.
|
||||
- group - remove extraneous warning shown when user does not exist (https://github.com/ansible/ansible/issues/77049).
|
||||
- include_vars - os.walk now follows symbolic links when traversing directories (https://github.com/ansible/ansible/pull/80460)
|
||||
- module compression is now sourced directly via config, bypassing play_context possibly stale values.
|
||||
- reboot - show last error message in verbose logs (https://github.com/ansible/ansible/issues/81574).
|
||||
- service_facts now returns more info for rcctl managed systesm (OpenBSD).
|
||||
- tasks - the ``retries`` keyword can be specified without ``until`` in which case the task is retried until it succeeds but at most ``retries`` times (https://github.com/ansible/ansible/issues/20802)
|
||||
- user - add new option ``password_expire_warn`` (supported on Linux only) to set the number of days of warning before a password change is required (https://github.com/ansible/ansible/issues/79882).
|
||||
- yum_repository - Align module documentation with parameters
|
||||
|
||||
Breaking Changes / Porting Guide
|
||||
--------------------------------
|
||||
|
||||
- Any plugin using the config system and the `cli` entry to use the `timeout` from the command line, will see the value change if the use had configured it in any of the lower precedence methods. If relying on this behaviour to consume the global/generic timeout from the DEFAULT_TIMEOUT constant, please consult the documentation on plugin configuration to add the overlaping entries.
|
||||
- ansible-test - Test plugins that rely on containers no longer support reusing running containers. The previous behavior was an undocumented, untested feature.
|
||||
- service module will not permanently configure variables/flags for openbsd when doing enable/disable operation anymore, this module was never meant to do this type of work, just to manage the service state itself. A rcctl_config or similar module should be created and used instead.
|
||||
|
||||
Deprecated Features
|
||||
-------------------
|
||||
|
||||
- Deprecated ini config option ``collections_paths``, use the singular form ``collections_path`` instead
|
||||
- Deprecated the env var ``ANSIBLE_COLLECTIONS_PATHS``, use the singular form ``ANSIBLE_COLLECTIONS_PATH`` instead
|
||||
- Old style vars plugins which use the entrypoints `get_host_vars` or `get_group_vars` are deprecated. The plugin should be updated to inherit from `BaseVarsPlugin` and define a `get_vars` method as the entrypoint.
|
||||
- Support for Windows Server 2012 and 2012 R2 has been removed as the support end of life from Microsoft is October 10th 2023. These versions of Windows will no longer be tested in this Ansible release and it cannot be guaranteed that they will continue to work going forward.
|
||||
- ``STRING_CONVERSION_ACTION`` config option is deprecated as it is no longer used in the Ansible Core code base.
|
||||
- the 'smart' option for setting a connection plugin is being removed as it's main purpose (choosing between ssh and paramiko) is now irrelevant.
|
||||
- vault and unfault filters - the undocumented ``vaultid`` parameter is deprecated and will be removed in ansible-core 2.20. Use ``vault_id`` instead.
|
||||
- yum_repository - deprecated parameter 'keepcache' (https://github.com/ansible/ansible/issues/78693).
|
||||
|
||||
Removed Features (previously deprecated)
|
||||
----------------------------------------
|
||||
|
||||
- ActionBase - remove deprecated ``_remote_checksum`` method
|
||||
- PlayIterator - remove deprecated ``cache_block_tasks`` and ``get_original_task`` methods
|
||||
- Remove deprecated ``FileLock`` class
|
||||
- Removed Python 3.9 as a supported version on the controller. Python 3.10 or newer is required.
|
||||
- Removed ``include`` which has been deprecated in Ansible 2.12. Use ``include_tasks`` or ``import_tasks`` instead.
|
||||
- ``Templar`` - remove deprecated ``shared_loader_obj`` parameter of ``__init__``
|
||||
- ``fetch_url`` - remove auto disabling ``decompress`` when gzip is not available
|
||||
- ``get_action_args_with_defaults`` - remove deprecated ``redirected_names`` method parameter
|
||||
- ansible-test - Removed support for the remote Windows targets 2012 and 2012-R2
|
||||
- inventory_cache - remove deprecated ``default.fact_caching_prefix`` ini configuration option, use ``defaults.fact_caching_prefix`` instead.
|
||||
- module_utils/basic.py - Removed Python 3.5 as a supported remote version. Python 2.7 or Python 3.6+ is now required.
|
||||
- stat - removed unused `get_md5` parameter.
|
||||
|
||||
Security Fixes
|
||||
--------------
|
||||
|
||||
- ansible-galaxy - Prevent roles from using symlinks to overwrite files outside of the installation directory (CVE-2023-5115)
|
||||
|
||||
Bugfixes
|
||||
--------
|
||||
|
||||
- Allow for searching handler subdir for included task via include_role (https://github.com/ansible/ansible/issues/81722)
|
||||
- AnsibleModule.run_command - Only use selectors when needed, and rely on Python stdlib subprocess for the simple task of collecting stdout/stderr when prompt matching is not required.
|
||||
- Cache host_group_vars after instantiating it once and limit the amount of repetitive work it needs to do every time it runs.
|
||||
- Call PluginLoader.all() once for vars plugins, and load vars plugins that run automatically or are enabled specifically by name subsequently.
|
||||
- Display - Defensively configure writing to stdout and stderr with a custom encoding error handler that will replace invalid characters while providing a deprecation warning that non-utf8 text will result in an error in a future version.
|
||||
- Exclude internal options from man pages and docs.
|
||||
- Fix ``ansible-config init`` man page option indentation.
|
||||
- Fix ``ast`` deprecation warnings for ``Str`` and ``value.s`` when using Python 3.12.
|
||||
- Fix ``run_once`` being incorrectly interpreted on handlers (https://github.com/ansible/ansible/issues/81666)
|
||||
- Fix exceptions caused by various inputs when performing arg splitting or parsing key/value pairs. Resolves issue https://github.com/ansible/ansible/issues/46379 and issue https://github.com/ansible/ansible/issues/61497
|
||||
- Fix incorrect parsing of multi-line Jinja2 blocks when performing arg splitting or parsing key/value pairs.
|
||||
- Fix post-validating looped task fields so the strategy uses the correct values after task execution.
|
||||
- Fixed `pip` module failure in case of usage quotes for `virtualenv_command` option for the venv command. (https://github.com/ansible/ansible/issues/76372)
|
||||
- From issue https://github.com/ansible/ansible/issues/80880, when notifying a handler from another handler, handler notifications must be registered immediately as the flush_handler call is not recursive.
|
||||
- Import ``FILE_ATTRIBUTES`` from ``ansible.module_utils.common.file`` in ``ansible.module_utils.basic`` instead of defining it twice.
|
||||
- Inventory scripts parser not treat exception when getting hostsvar (https://github.com/ansible/ansible/issues/81103)
|
||||
- On Python 3 use datetime methods ``fromtimestamp`` and ``now`` with UTC timezone instead of ``utcfromtimestamp`` and ``utcnow``, which are deprecated in Python 3.12.
|
||||
- PluginLoader - fix Jinja plugin performance issues (https://github.com/ansible/ansible/issues/79652)
|
||||
- PowerShell - Remove some code which is no longer valid for dotnet 5+
|
||||
- Prevent running same handler multiple times when included via ``include_role`` (https://github.com/ansible/ansible/issues/73643)
|
||||
- Prompting - add a short sleep between polling for user input to reduce CPU consumption (https://github.com/ansible/ansible/issues/81516).
|
||||
- Properly disable ``jinja2_native`` in the template module when jinja2 override is used in the template (https://github.com/ansible/ansible/issues/80605)
|
||||
- Properly template tags in parent blocks (https://github.com/ansible/ansible/issues/81053)
|
||||
- Remove unreachable parser error for removed ``static`` parameter of ``include_role``
|
||||
- Replace uses of ``configparser.ConfigParser.readfp()`` which was removed in Python 3.12 with ``configparser.ConfigParser.read_file()`` (https://github.com/ansible/ansible/issues/81656)
|
||||
- Set filters ``intersect``, ``difference``, ``symmetric_difference`` and ``union`` now always return a ``list``, never a ``set``. Previously, a ``set`` would be returned if the inputs were a hashable type such as ``str``, instead of a collection, such as a ``list`` or ``tuple``.
|
||||
- Set filters ``intersect``, ``difference``, ``symmetric_difference`` and ``union`` now use set operations when the given items are hashable. Previously, list operations were performed unless the inputs were a hashable type such as ``str``, instead of a collection, such as a ``list`` or ``tuple``.
|
||||
- Switch result queue from a ``multiprocessing.queues.Queue` to ``multiprocessing.queues.SimpleQueue``, primarily to allow properly handling pickling errors, to prevent an infinite hang waiting for task results
|
||||
- The ``ansible-config init`` command now has a documentation description.
|
||||
- The ``ansible-galaxy collection download`` command now has a documentation description.
|
||||
- The ``ansible-galaxy collection install`` command documentation is now visible (previously hidden by a decorator).
|
||||
- The ``ansible-galaxy collection verify`` command now has a documentation description.
|
||||
- The ``ansible-galaxy role install`` command documentation is now visible (previously hidden by a decorator).
|
||||
- The ``ansible-inventory`` command command now has a documentation description (previously used as the epilog).
|
||||
- The ``hostname`` module now also updates both current and permanent hostname on OpenBSD. Before it only updated the permanent hostname (https://github.com/ansible/ansible/issues/80520).
|
||||
- Update module_utils.urls unit test to work with cryptography >= 41.0.0.
|
||||
- When generating man pages, use ``func`` to find the command function instead of looking it up by the command name.
|
||||
- ``StrategyBase._process_pending_results`` - create a ``Templar`` on demand for templating ``changed_when``/``failed_when``.
|
||||
- ``ansible-galaxy`` now considers all collection paths when identifying which collection requirements are already installed. Use the ``COLLECTIONS_PATHS`` and ``COLLECTIONS_SCAN_SYS_PATHS`` config options to modify these. Previously only the install path was considered when resolving the candidates. The install path will remain the only one potentially modified. (https://github.com/ansible/ansible/issues/79767, https://github.com/ansible/ansible/issues/81163)
|
||||
- ``ansible.module_utils.service`` - ensure binary data transmission in ``daemonize()``
|
||||
- ``ansible.module_utils.service`` - fix inter-process communication in ``daemonize()``
|
||||
- ``import_role`` reverts to previous behavior of exporting vars at compile time.
|
||||
- ``pkg_mgr`` - fix the default dnf version detection
|
||||
- ansiballz - Prevent issue where the time on the control host could change part way through building the ansiballz file, potentially causing a pre-1980 date to be used during ansiballz unpacking leading to a zip file error (https://github.com/ansible/ansible/issues/80089)
|
||||
- ansible terminal color settings were incorrectly limited to 16 options via 'choices', removing so all 256 can be accessed.
|
||||
- ansible-console - fix filtering by collection names when a collection search path was set (https://github.com/ansible/ansible/pull/81450).
|
||||
- ansible-galaxy - Enabled the ``data`` tarfile filter during role installation for Python versions that support it. A probing mechanism is used to avoid Python versions with a broken implementation.
|
||||
- ansible-galaxy - Fix issue installing collections containing directories with more than 100 characters on python versions before 3.10.6
|
||||
- ansible-galaxy - Fix variable type error when installing subdir collections (https://github.com/ansible/ansible/issues/80943)
|
||||
- ansible-galaxy - Provide a better error message when using a requirements file with an invalid format - https://github.com/ansible/ansible/issues/81901
|
||||
- ansible-galaxy - fix installing collections from directories that have a trailing path separator (https://github.com/ansible/ansible/issues/77803).
|
||||
- ansible-galaxy - fix installing signed collections (https://github.com/ansible/ansible/issues/80648).
|
||||
- ansible-galaxy - reduce API calls to servers by fetching signatures only for final candidates.
|
||||
- ansible-galaxy - started allowing the use of pre-releases for collections that do not have any stable versions published. (https://github.com/ansible/ansible/pull/81606)
|
||||
- ansible-galaxy - started allowing the use of pre-releases for dependencies on any level of the dependency tree that specifically demand exact pre-release versions of collections and not version ranges. (https://github.com/ansible/ansible/pull/81606)
|
||||
- ansible-galaxy collection verify - fix verifying signed collections when the keyring is not configured.
|
||||
- ansible-galaxy info - fix reporting no role found when lookup_role_by_name returns None.
|
||||
- ansible-inventory - index available_hosts for major performance boost when dumping large inventories
|
||||
- ansible-test - Add a ``pylint`` plugin to work around a known issue on Python 3.12.
|
||||
- ansible-test - Add support for ``argcomplete`` version 3.
|
||||
- ansible-test - All containers created by ansible-test now include the current test session ID in their name. This avoids conflicts between concurrent ansible-test invocations using the same container host.
|
||||
- ansible-test - Always use ansible-test managed entry points for ansible-core CLI tools when not running from source. This fixes issues where CLI entry points created during install are not compatible with ansible-test.
|
||||
- ansible-test - Fix a traceback that occurs when attempting to test Ansible source using a different ansible-test. A clear error message is now given when this scenario occurs.
|
||||
- ansible-test - Fix handling of timeouts exceeding one day.
|
||||
- ansible-test - Fix parsing of cgroup entries which contain a ``:`` in the path (https://github.com/ansible/ansible/issues/81977).
|
||||
- ansible-test - Fix several possible tracebacks when using the ``-e`` option with sanity tests.
|
||||
- ansible-test - Fix various cases where the test timeout could expire without terminating the tests.
|
||||
- ansible-test - Include missing ``pylint`` requirements for Python 3.10.
|
||||
- ansible-test - Pre-build a PyYAML wheel before installing requirements to avoid a potential Cython build failure.
|
||||
- ansible-test - Remove redundant warning about missing programs before attempting to execute them.
|
||||
- ansible-test - The ``import`` sanity test now checks the collection loader for remote-only Python support when testing ansible-core.
|
||||
- ansible-test - Unit tests now report warnings generated during test runs. Previously only warnings generated during test collection were reported.
|
||||
- ansible-test - Update ``pylint`` to 2.17.2 to resolve several possible false positives.
|
||||
- ansible-test - Update ``pylint`` to 2.17.3 to resolve several possible false positives.
|
||||
- ansible-test - Update ``pylint`` to version 3.0.1.
|
||||
- ansible-test - Use ``raise ... from ...`` when raising exceptions from within an exception handler.
|
||||
- ansible-test - When bootstrapping remote FreeBSD instances, use the OS packaged ``setuptools`` instead of installing the latest version from PyPI.
|
||||
- ansible-test local change detection - use ``git merge-base <branch> HEAD`` instead of ``git merge-base --fork-point <branch>`` (https://github.com/ansible/ansible/pull/79734).
|
||||
- ansible-vault - fail when the destination file location is not writable before performing encryption (https://github.com/ansible/ansible/issues/81455).
|
||||
- apt - ignore fail_on_autoremove and allow_downgrade parameters when using aptitude (https://github.com/ansible/ansible/issues/77868).
|
||||
- blockinfile - avoid crash with Python 3 if creating the directory fails when ``create=true`` (https://github.com/ansible/ansible/pull/81662).
|
||||
- connection timeouts defined in ansible.cfg will now be properly used, the --timeout cli option was obscuring them by always being set.
|
||||
- copy - print correct destination filename when using `content` and `--diff` (https://github.com/ansible/ansible/issues/79749).
|
||||
- copy unit tests - Fixing "dir all perms" documentation and formatting for easier reading.
|
||||
- core will now also look at the connection plugin to force 'local' interpreter for networking path compatibility as just ansible_network_os could be misleading.
|
||||
- deb822_repository - use http-agent for receiving content (https://github.com/ansible/ansible/issues/80809).
|
||||
- debconf - idempotency in questions with type 'password' (https://github.com/ansible/ansible/issues/47676).
|
||||
- distribution facts - fix Source Mage family mapping
|
||||
- dnf - fix a failure when a package from URI was specified and ``update_only`` was set (https://github.com/ansible/ansible/issues/81376).
|
||||
- dnf5 - Update dnf5 module to handle API change for setting the download directory (https://github.com/ansible/ansible/issues/80887)
|
||||
- dnf5 - Use ``transaction.check_gpg_signatures`` API call to check package signatures AND possibly to recover from when keys are missing.
|
||||
- dnf5 - fix module and package names in the message following failed module respawn attempt
|
||||
- dnf5 - use the logs API to determine transaction problems
|
||||
- dpkg_selections - check if the package exists before performing the selection operation (https://github.com/ansible/ansible/issues/81404).
|
||||
- encrypt - deprecate passlib_or_crypt API (https://github.com/ansible/ansible/issues/55839).
|
||||
- fetch - Handle unreachable errors properly (https://github.com/ansible/ansible/issues/27816)
|
||||
- file modules - Make symbolic modes with X use the computed permission, not original file (https://github.com/ansible/ansible/issues/80128)
|
||||
- file modules - fix validating invalid symbolic modes.
|
||||
- first found lookup has been updated to use the normalized argument parsing (pythonic) matching the documented examples.
|
||||
- first found lookup, fixed an issue with subsequent items clobbering information from previous ones.
|
||||
- first_found lookup now gets 'untemplated' loop entries and handles templating itself as task_executor was removing even 'templatable' entries and breaking functionality. https://github.com/ansible/ansible/issues/70772
|
||||
- galaxy - check if the target for symlink exists (https://github.com/ansible/ansible/pull/81586).
|
||||
- galaxy - cross check the collection type and collection source (https://github.com/ansible/ansible/issues/79463).
|
||||
- gather_facts parallel option was doing the reverse of what was stated, now it does run modules in parallel when True and serially when False.
|
||||
- handlers - fix ``v2_playbook_on_notify`` callback not being called when notifying handlers
|
||||
- handlers - the ``listen`` keyword can affect only one handler with the same name, the last one defined as it is a case with the ``notify`` keyword (https://github.com/ansible/ansible/issues/81013)
|
||||
- include_role - expose variables from parent roles to role's handlers (https://github.com/ansible/ansible/issues/80459)
|
||||
- inventory_ini - handle SyntaxWarning while parsing ini file in inventory (https://github.com/ansible/ansible/issues/81457).
|
||||
- iptables - remove default rule creation when creating iptables chain to be more similar to the command line utility (https://github.com/ansible/ansible/issues/80256).
|
||||
- lib/ansible/utils/encrypt.py - remove unused private ``_LOCK`` (https://github.com/ansible/ansible/issues/81613)
|
||||
- lookup/url.py - Fix incorrect var/env/ini entry for `force_basic_auth`
|
||||
- man page build - Remove the dependency on the ``docs`` directory for building man pages.
|
||||
- man page build - Sub commands of ``ansible-galaxy role`` and ``ansible-galaxy collection`` are now documented.
|
||||
- module responses - Ensure that module responses are utf-8 adhereing to JSON RFC and expectations of the core code.
|
||||
- module/role argument spec - validate the type for options that are None when the option is required or has a non-None default (https://github.com/ansible/ansible/issues/79656).
|
||||
- modules/user.py - Add check for valid directory when creating new user homedir (allows /dev/null as skeleton) (https://github.com/ansible/ansible/issues/75063)
|
||||
- paramiko_ssh, psrp, and ssh connection plugins - ensure that all values for options that should be strings are actually converted to strings (https://github.com/ansible/ansible/pull/81029).
|
||||
- password_hash - fix salt format for ``crypt`` (only used if ``passlib`` is not installed) for the ``bcrypt`` algorithm.
|
||||
- pep517 build backend - Copy symlinks when copying the source tree. This avoids tracebacks in various scenarios, such as when a venv is present in the source tree.
|
||||
- pep517 build backend - Use the documented ``import_module`` import from ``importlib``.
|
||||
- pip module - Update module to prefer use of the python ``packaging`` and ``importlib.metadata`` modules due to ``pkg_resources`` being deprecated (https://github.com/ansible/ansible/issues/80488)
|
||||
- pkg_mgr.py - Fix `ansible_pkg_mgr` incorrect in TencentOS Server Linux
|
||||
- pkg_mgr.py - Fix `ansible_pkg_mgr` is unknown in Kylin Linux (https://github.com/ansible/ansible/issues/81332)
|
||||
- powershell modules - Only set an rc of 1 if the PowerShell pipeline signaled an error occurred AND there are error records present. Previously it would do so only if the error signal was present without checking the error count.
|
||||
- replace - handle exception when bad escape character is provided in replace (https://github.com/ansible/ansible/issues/79364).
|
||||
- role deduplication - don't deduplicate before a role has had a task run for that particular host (https://github.com/ansible/ansible/issues/81486).
|
||||
- service module, does not permanently configure flags flags on Openbsd when enabling/disabling a service.
|
||||
- service module, enable/disable is not a exclusive action in checkmode anymore.
|
||||
- setup gather_timeout - Fix timeout in get_mounts_facts for linux.
|
||||
- setup module (fact gathering) will now try to be smarter about different versions of facter emitting error when --puppet flag is used w/o puppet.
|
||||
- syntax check - Limit ``--syntax-check`` to ``ansible-playbook`` only, as that is the only CLI affected by this argument (https://github.com/ansible/ansible/issues/80506)
|
||||
- tarfile - handle data filter deprecation warning message for extract and extractall (https://github.com/ansible/ansible/issues/80832).
|
||||
- template - Fix for formatting issues when a template path contains valid jinja/strftime pattern (especially line break one) and using the template path in ansible_managed (https://github.com/ansible/ansible/pull/79129)
|
||||
- templating - In the template action and lookup, use local jinja2 environment overlay overrides instead of mutating the templars environment
|
||||
- templating - prevent setting arbitrary attributes on Jinja2 environments via Jinja2 overrides in templates
|
||||
- templating escape and single var optimization now use correct delimiters when custom ones are provided either via task or template header.
|
||||
- unarchive - fix unarchiving sources that are copied to the remote node using a relative temporory directory path (https://github.com/ansible/ansible/issues/80710).
|
||||
- uri - fix search for JSON type to include complex strings containing '+'
|
||||
- uri/urls - Add compat function to handle the ability to parse the filename from a Content-Disposition header (https://github.com/ansible/ansible/issues/81806)
|
||||
- urls.py - fixed cert_file and key_file parameters when running on Python 3.12 - https://github.com/ansible/ansible/issues/80490
|
||||
- user - set expiration value correctly when unable to retrieve the current value from the system (https://github.com/ansible/ansible/issues/71916)
|
||||
- validate-modules sanity test - replace semantic markup parsing and validating code with the code from `antsibull-docs-parser 0.2.0 <https://github.com/ansible-community/antsibull-docs-parser/releases/tag/0.2.0>`__ (https://github.com/ansible/ansible/pull/80406).
|
||||
- vars_prompt - internally convert the ``unsafe`` value to ``bool``
|
||||
- vault and unvault filters now properly take ``vault_id`` parameter.
|
||||
- win_fetch - Add support for using file with wildcards in file name. (https://github.com/ansible/ansible/issues/73128)
|
||||
- winrm - Better handle send input failures when communicating with hosts under load
|
||||
|
||||
Known Issues
|
||||
------------
|
||||
|
||||
- ansible-galaxy - dies in the middle of installing a role when that role contains Java inner classes (files with $ in the file name). This is by design, to exclude temporary or backup files. (https://github.com/ansible/ansible/pull/81553).
|
||||
- ansible-test - The ``pep8`` sanity test is unable to detect f-string spacing issues (E201, E202) on Python 3.10 and 3.11. They are correctly detected under Python 3.12. See (https://github.com/PyCQA/pycodestyle/issues/1190).
|
||||
@ -1,8 +0,0 @@
|
||||
Changelogs
|
||||
==========
|
||||
|
||||
As part of the release process a version-specific `CHANGELOG-vX.Y.rst` will be generated from fragments in
|
||||
the `fragments` directory.
|
||||
|
||||
On release branches once a release has been created, consult the branch's version-specific file for changes that have
|
||||
occurred in that branch. The `devel` branch does not have a generated changelog, only changelog fragments.
|
||||
@ -1,824 +0,0 @@
|
||||
ancestor: 2.15.0
|
||||
releases:
|
||||
2.16.0:
|
||||
changes:
|
||||
bugfixes:
|
||||
- ansible-test - Fix parsing of cgroup entries which contain a ``:`` in the
|
||||
path (https://github.com/ansible/ansible/issues/81977).
|
||||
release_summary: '| Release Date: 2023-11-06
|
||||
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
|
||||
'
|
||||
codename: All My Love
|
||||
fragments:
|
||||
- 2.16.0_summary.yaml
|
||||
- ansible-test-cgroup-split.yml
|
||||
release_date: '2023-11-06'
|
||||
2.16.0b1:
|
||||
changes:
|
||||
breaking_changes:
|
||||
- Any plugin using the config system and the `cli` entry to use the `timeout`
|
||||
from the command line, will see the value change if the use had configured
|
||||
it in any of the lower precedence methods. If relying on this behaviour to
|
||||
consume the global/generic timeout from the DEFAULT_TIMEOUT constant, please
|
||||
consult the documentation on plugin configuration to add the overlaping entries.
|
||||
- ansible-test - Test plugins that rely on containers no longer support reusing
|
||||
running containers. The previous behavior was an undocumented, untested feature.
|
||||
- service module will not permanently configure variables/flags for openbsd
|
||||
when doing enable/disable operation anymore, this module was never meant to
|
||||
do this type of work, just to manage the service state itself. A rcctl_config
|
||||
or similar module should be created and used instead.
|
||||
bugfixes:
|
||||
- Allow for searching handler subdir for included task via include_role (https://github.com/ansible/ansible/issues/81722)
|
||||
- AnsibleModule.run_command - Only use selectors when needed, and rely on Python
|
||||
stdlib subprocess for the simple task of collecting stdout/stderr when prompt
|
||||
matching is not required.
|
||||
- Display - Defensively configure writing to stdout and stderr with a custom
|
||||
encoding error handler that will replace invalid characters while providing
|
||||
a deprecation warning that non-utf8 text will result in an error in a future
|
||||
version.
|
||||
- Exclude internal options from man pages and docs.
|
||||
- Fix ``ansible-config init`` man page option indentation.
|
||||
- Fix ``ast`` deprecation warnings for ``Str`` and ``value.s`` when using Python
|
||||
3.12.
|
||||
- Fix exceptions caused by various inputs when performing arg splitting or parsing
|
||||
key/value pairs. Resolves issue https://github.com/ansible/ansible/issues/46379
|
||||
and issue https://github.com/ansible/ansible/issues/61497
|
||||
- Fix incorrect parsing of multi-line Jinja2 blocks when performing arg splitting
|
||||
or parsing key/value pairs.
|
||||
- Fix post-validating looped task fields so the strategy uses the correct values
|
||||
after task execution.
|
||||
- Fixed `pip` module failure in case of usage quotes for `virtualenv_command`
|
||||
option for the venv command. (https://github.com/ansible/ansible/issues/76372)
|
||||
- From issue https://github.com/ansible/ansible/issues/80880, when notifying
|
||||
a handler from another handler, handler notifications must be registered immediately
|
||||
as the flush_handler call is not recursive.
|
||||
- Import ``FILE_ATTRIBUTES`` from ``ansible.module_utils.common.file`` in ``ansible.module_utils.basic``
|
||||
instead of defining it twice.
|
||||
- Inventory scripts parser not treat exception when getting hostsvar (https://github.com/ansible/ansible/issues/81103)
|
||||
- On Python 3 use datetime methods ``fromtimestamp`` and ``now`` with UTC timezone
|
||||
instead of ``utcfromtimestamp`` and ``utcnow``, which are deprecated in Python
|
||||
3.12.
|
||||
- PluginLoader - fix Jinja plugin performance issues (https://github.com/ansible/ansible/issues/79652)
|
||||
- PowerShell - Remove some code which is no longer valid for dotnet 5+
|
||||
- Prevent running same handler multiple times when included via ``include_role``
|
||||
(https://github.com/ansible/ansible/issues/73643)
|
||||
- Prompting - add a short sleep between polling for user input to reduce CPU
|
||||
consumption (https://github.com/ansible/ansible/issues/81516).
|
||||
- Properly disable ``jinja2_native`` in the template module when jinja2 override
|
||||
is used in the template (https://github.com/ansible/ansible/issues/80605)
|
||||
- Remove unreachable parser error for removed ``static`` parameter of ``include_role``
|
||||
- Replace uses of ``configparser.ConfigParser.readfp()`` which was removed in
|
||||
Python 3.12 with ``configparser.ConfigParser.read_file()`` (https://github.com/ansible/ansible/issues/81656)
|
||||
- Set filters ``intersect``, ``difference``, ``symmetric_difference`` and ``union``
|
||||
now always return a ``list``, never a ``set``. Previously, a ``set`` would
|
||||
be returned if the inputs were a hashable type such as ``str``, instead of
|
||||
a collection, such as a ``list`` or ``tuple``.
|
||||
- Set filters ``intersect``, ``difference``, ``symmetric_difference`` and ``union``
|
||||
now use set operations when the given items are hashable. Previously, list
|
||||
operations were performed unless the inputs were a hashable type such as ``str``,
|
||||
instead of a collection, such as a ``list`` or ``tuple``.
|
||||
- Switch result queue from a ``multiprocessing.queues.Queue` to ``multiprocessing.queues.SimpleQueue``,
|
||||
primarily to allow properly handling pickling errors, to prevent an infinite
|
||||
hang waiting for task results
|
||||
- The ``ansible-config init`` command now has a documentation description.
|
||||
- The ``ansible-galaxy collection download`` command now has a documentation
|
||||
description.
|
||||
- The ``ansible-galaxy collection install`` command documentation is now visible
|
||||
(previously hidden by a decorator).
|
||||
- The ``ansible-galaxy collection verify`` command now has a documentation description.
|
||||
- The ``ansible-galaxy role install`` command documentation is now visible (previously
|
||||
hidden by a decorator).
|
||||
- The ``ansible-inventory`` command command now has a documentation description
|
||||
(previously used as the epilog).
|
||||
- The ``hostname`` module now also updates both current and permanent hostname
|
||||
on OpenBSD. Before it only updated the permanent hostname (https://github.com/ansible/ansible/issues/80520).
|
||||
- Update module_utils.urls unit test to work with cryptography >= 41.0.0.
|
||||
- When generating man pages, use ``func`` to find the command function instead
|
||||
of looking it up by the command name.
|
||||
- '``StrategyBase._process_pending_results`` - create a ``Templar`` on demand
|
||||
for templating ``changed_when``/``failed_when``.'
|
||||
- '``ansible-galaxy`` now considers all collection paths when identifying which
|
||||
collection requirements are already installed. Use the ``COLLECTIONS_PATHS``
|
||||
and ``COLLECTIONS_SCAN_SYS_PATHS`` config options to modify these. Previously
|
||||
only the install path was considered when resolving the candidates. The install
|
||||
path will remain the only one potentially modified. (https://github.com/ansible/ansible/issues/79767,
|
||||
https://github.com/ansible/ansible/issues/81163)'
|
||||
- '``ansible.module_utils.service`` - ensure binary data transmission in ``daemonize()``'
|
||||
- '``ansible.module_utils.service`` - fix inter-process communication in ``daemonize()``'
|
||||
- '``pkg_mgr`` - fix the default dnf version detection'
|
||||
- ansiballz - Prevent issue where the time on the control host could change
|
||||
part way through building the ansiballz file, potentially causing a pre-1980
|
||||
date to be used during ansiballz unpacking leading to a zip file error (https://github.com/ansible/ansible/issues/80089)
|
||||
- ansible terminal color settings were incorrectly limited to 16 options via
|
||||
'choices', removing so all 256 can be accessed.
|
||||
- ansible-console - fix filtering by collection names when a collection search
|
||||
path was set (https://github.com/ansible/ansible/pull/81450).
|
||||
- ansible-galaxy - Enabled the ``data`` tarfile filter during role installation
|
||||
for Python versions that support it. A probing mechanism is used to avoid
|
||||
Python versions with a broken implementation.
|
||||
- ansible-galaxy - Fix issue installing collections containing directories with
|
||||
more than 100 characters on python versions before 3.10.6
|
||||
- ansible-galaxy - Fix variable type error when installing subdir collections
|
||||
(https://github.com/ansible/ansible/issues/80943)
|
||||
- ansible-galaxy - fix installing collections from directories that have a trailing
|
||||
path separator (https://github.com/ansible/ansible/issues/77803).
|
||||
- ansible-galaxy - fix installing signed collections (https://github.com/ansible/ansible/issues/80648).
|
||||
- ansible-galaxy - reduce API calls to servers by fetching signatures only for
|
||||
final candidates.
|
||||
- ansible-galaxy - started allowing the use of pre-releases for collections
|
||||
that do not have any stable versions published. (https://github.com/ansible/ansible/pull/81606)
|
||||
- ansible-galaxy - started allowing the use of pre-releases for dependencies
|
||||
on any level of the dependency tree that specifically demand exact pre-release
|
||||
versions of collections and not version ranges. (https://github.com/ansible/ansible/pull/81606)
|
||||
- ansible-galaxy collection verify - fix verifying signed collections when the
|
||||
keyring is not configured.
|
||||
- ansible-test - Add support for ``argcomplete`` version 3.
|
||||
- ansible-test - All containers created by ansible-test now include the current
|
||||
test session ID in their name. This avoids conflicts between concurrent ansible-test
|
||||
invocations using the same container host.
|
||||
- ansible-test - Always use ansible-test managed entry points for ansible-core
|
||||
CLI tools when not running from source. This fixes issues where CLI entry
|
||||
points created during install are not compatible with ansible-test.
|
||||
- ansible-test - Fix a traceback that occurs when attempting to test Ansible
|
||||
source using a different ansible-test. A clear error message is now given
|
||||
when this scenario occurs.
|
||||
- ansible-test - Fix handling of timeouts exceeding one day.
|
||||
- ansible-test - Fix several possible tracebacks when using the ``-e`` option
|
||||
with sanity tests.
|
||||
- ansible-test - Fix various cases where the test timeout could expire without
|
||||
terminating the tests.
|
||||
- ansible-test - Pre-build a PyYAML wheel before installing requirements to
|
||||
avoid a potential Cython build failure.
|
||||
- ansible-test - Remove redundant warning about missing programs before attempting
|
||||
to execute them.
|
||||
- ansible-test - The ``import`` sanity test now checks the collection loader
|
||||
for remote-only Python support when testing ansible-core.
|
||||
- ansible-test - Unit tests now report warnings generated during test runs.
|
||||
Previously only warnings generated during test collection were reported.
|
||||
- ansible-test - Update ``pylint`` to 2.17.2 to resolve several possible false
|
||||
positives.
|
||||
- ansible-test - Update ``pylint`` to 2.17.3 to resolve several possible false
|
||||
positives.
|
||||
- ansible-test - Use ``raise ... from ...`` when raising exceptions from within
|
||||
an exception handler.
|
||||
- ansible-test - When bootstrapping remote FreeBSD instances, use the OS packaged
|
||||
``setuptools`` instead of installing the latest version from PyPI.
|
||||
- ansible-test local change detection - use ``git merge-base <branch> HEAD``
|
||||
instead of ``git merge-base --fork-point <branch>`` (https://github.com/ansible/ansible/pull/79734).
|
||||
- ansible-vault - fail when the destination file location is not writable before
|
||||
performing encryption (https://github.com/ansible/ansible/issues/81455).
|
||||
- apt - ignore fail_on_autoremove and allow_downgrade parameters when using
|
||||
aptitude (https://github.com/ansible/ansible/issues/77868).
|
||||
- blockinfile - avoid crash with Python 3 if creating the directory fails when
|
||||
``create=true`` (https://github.com/ansible/ansible/pull/81662).
|
||||
- connection timeouts defined in ansible.cfg will now be properly used, the
|
||||
--timeout cli option was obscuring them by always being set.
|
||||
- copy - print correct destination filename when using `content` and `--diff`
|
||||
(https://github.com/ansible/ansible/issues/79749).
|
||||
- copy unit tests - Fixing "dir all perms" documentation and formatting for
|
||||
easier reading.
|
||||
- core will now also look at the connection plugin to force 'local' interpreter
|
||||
for networking path compatibility as just ansible_network_os could be misleading.
|
||||
- deb822_repository - use http-agent for receiving content (https://github.com/ansible/ansible/issues/80809).
|
||||
- debconf - idempotency in questions with type 'password' (https://github.com/ansible/ansible/issues/47676).
|
||||
- distribution facts - fix Source Mage family mapping
|
||||
- dnf - fix a failure when a package from URI was specified and ``update_only``
|
||||
was set (https://github.com/ansible/ansible/issues/81376).
|
||||
- dnf5 - Update dnf5 module to handle API change for setting the download directory
|
||||
(https://github.com/ansible/ansible/issues/80887)
|
||||
- dnf5 - Use ``transaction.check_gpg_signatures`` API call to check package
|
||||
signatures AND possibly to recover from when keys are missing.
|
||||
- dnf5 - fix module and package names in the message following failed module
|
||||
respawn attempt
|
||||
- dnf5 - use the logs API to determine transaction problems
|
||||
- dpkg_selections - check if the package exists before performing the selection
|
||||
operation (https://github.com/ansible/ansible/issues/81404).
|
||||
- encrypt - deprecate passlib_or_crypt API (https://github.com/ansible/ansible/issues/55839).
|
||||
- fetch - Handle unreachable errors properly (https://github.com/ansible/ansible/issues/27816)
|
||||
- file modules - Make symbolic modes with X use the computed permission, not
|
||||
original file (https://github.com/ansible/ansible/issues/80128)
|
||||
- file modules - fix validating invalid symbolic modes.
|
||||
- first found lookup has been updated to use the normalized argument parsing
|
||||
(pythonic) matching the documented examples.
|
||||
- first found lookup, fixed an issue with subsequent items clobbering information
|
||||
from previous ones.
|
||||
- first_found lookup now gets 'untemplated' loop entries and handles templating
|
||||
itself as task_executor was removing even 'templatable' entries and breaking
|
||||
functionality. https://github.com/ansible/ansible/issues/70772
|
||||
- galaxy - check if the target for symlink exists (https://github.com/ansible/ansible/pull/81586).
|
||||
- galaxy - cross check the collection type and collection source (https://github.com/ansible/ansible/issues/79463).
|
||||
- gather_facts parallel option was doing the reverse of what was stated, now
|
||||
it does run modules in parallel when True and serially when False.
|
||||
- handlers - fix ``v2_playbook_on_notify`` callback not being called when notifying
|
||||
handlers
|
||||
- handlers - the ``listen`` keyword can affect only one handler with the same
|
||||
name, the last one defined as it is a case with the ``notify`` keyword (https://github.com/ansible/ansible/issues/81013)
|
||||
- include_role - expose variables from parent roles to role's handlers (https://github.com/ansible/ansible/issues/80459)
|
||||
- inventory_ini - handle SyntaxWarning while parsing ini file in inventory (https://github.com/ansible/ansible/issues/81457).
|
||||
- iptables - remove default rule creation when creating iptables chain to be
|
||||
more similar to the command line utility (https://github.com/ansible/ansible/issues/80256).
|
||||
- lib/ansible/utils/encrypt.py - remove unused private ``_LOCK`` (https://github.com/ansible/ansible/issues/81613)
|
||||
- lookup/url.py - Fix incorrect var/env/ini entry for `force_basic_auth`
|
||||
- man page build - Remove the dependency on the ``docs`` directory for building
|
||||
man pages.
|
||||
- man page build - Sub commands of ``ansible-galaxy role`` and ``ansible-galaxy
|
||||
collection`` are now documented.
|
||||
- module responses - Ensure that module responses are utf-8 adhereing to JSON
|
||||
RFC and expectations of the core code.
|
||||
- module/role argument spec - validate the type for options that are None when
|
||||
the option is required or has a non-None default (https://github.com/ansible/ansible/issues/79656).
|
||||
- modules/user.py - Add check for valid directory when creating new user homedir
|
||||
(allows /dev/null as skeleton) (https://github.com/ansible/ansible/issues/75063)
|
||||
- paramiko_ssh, psrp, and ssh connection plugins - ensure that all values for
|
||||
options that should be strings are actually converted to strings (https://github.com/ansible/ansible/pull/81029).
|
||||
- password_hash - fix salt format for ``crypt`` (only used if ``passlib`` is
|
||||
not installed) for the ``bcrypt`` algorithm.
|
||||
- pep517 build backend - Copy symlinks when copying the source tree. This avoids
|
||||
tracebacks in various scenarios, such as when a venv is present in the source
|
||||
tree.
|
||||
- pep517 build backend - Use the documented ``import_module`` import from ``importlib``.
|
||||
- pip module - Update module to prefer use of the python ``packaging`` and ``importlib.metadata``
|
||||
modules due to ``pkg_resources`` being deprecated (https://github.com/ansible/ansible/issues/80488)
|
||||
- pkg_mgr.py - Fix `ansible_pkg_mgr` incorrect in TencentOS Server Linux
|
||||
- pkg_mgr.py - Fix `ansible_pkg_mgr` is unknown in Kylin Linux (https://github.com/ansible/ansible/issues/81332)
|
||||
- powershell modules - Only set an rc of 1 if the PowerShell pipeline signaled
|
||||
an error occurred AND there are error records present. Previously it would
|
||||
do so only if the error signal was present without checking the error count.
|
||||
- replace - handle exception when bad escape character is provided in replace
|
||||
(https://github.com/ansible/ansible/issues/79364).
|
||||
- role deduplication - don't deduplicate before a role has had a task run for
|
||||
that particular host (https://github.com/ansible/ansible/issues/81486).
|
||||
- service module, does not permanently configure flags flags on Openbsd when
|
||||
enabling/disabling a service.
|
||||
- service module, enable/disable is not a exclusive action in checkmode anymore.
|
||||
- setup gather_timeout - Fix timeout in get_mounts_facts for linux.
|
||||
- setup module (fact gathering) will now try to be smarter about different versions
|
||||
of facter emitting error when --puppet flag is used w/o puppet.
|
||||
- syntax check - Limit ``--syntax-check`` to ``ansible-playbook`` only, as that
|
||||
is the only CLI affected by this argument (https://github.com/ansible/ansible/issues/80506)
|
||||
- tarfile - handle data filter deprecation warning message for extract and extractall
|
||||
(https://github.com/ansible/ansible/issues/80832).
|
||||
- template - Fix for formatting issues when a template path contains valid jinja/strftime
|
||||
pattern (especially line break one) and using the template path in ansible_managed
|
||||
(https://github.com/ansible/ansible/pull/79129)
|
||||
- templating - In the template action and lookup, use local jinja2 environment
|
||||
overlay overrides instead of mutating the templars environment
|
||||
- templating - prevent setting arbitrary attributes on Jinja2 environments via
|
||||
Jinja2 overrides in templates
|
||||
- templating escape and single var optimization now use correct delimiters when
|
||||
custom ones are provided either via task or template header.
|
||||
- unarchive - fix unarchiving sources that are copied to the remote node using
|
||||
a relative temporory directory path (https://github.com/ansible/ansible/issues/80710).
|
||||
- uri - fix search for JSON type to include complex strings containing '+'
|
||||
- urls.py - fixed cert_file and key_file parameters when running on Python 3.12
|
||||
- https://github.com/ansible/ansible/issues/80490
|
||||
- user - set expiration value correctly when unable to retrieve the current
|
||||
value from the system (https://github.com/ansible/ansible/issues/71916)
|
||||
- validate-modules sanity test - replace semantic markup parsing and validating
|
||||
code with the code from `antsibull-docs-parser 0.2.0 <https://github.com/ansible-community/antsibull-docs-parser/releases/tag/0.2.0>`__
|
||||
(https://github.com/ansible/ansible/pull/80406).
|
||||
- vars_prompt - internally convert the ``unsafe`` value to ``bool``
|
||||
- vault and unvault filters now properly take ``vault_id`` parameter.
|
||||
- win_fetch - Add support for using file with wildcards in file name. (https://github.com/ansible/ansible/issues/73128)
|
||||
deprecated_features:
|
||||
- Deprecated ini config option ``collections_paths``, use the singular form
|
||||
``collections_path`` instead
|
||||
- Deprecated the env var ``ANSIBLE_COLLECTIONS_PATHS``, use the singular form
|
||||
``ANSIBLE_COLLECTIONS_PATH`` instead
|
||||
- Support for Windows Server 2012 and 2012 R2 has been removed as the support
|
||||
end of life from Microsoft is October 10th 2023. These versions of Windows
|
||||
will no longer be tested in this Ansible release and it cannot be guaranteed
|
||||
that they will continue to work going forward.
|
||||
- '``STRING_CONVERSION_ACTION`` config option is deprecated as it is no longer
|
||||
used in the Ansible Core code base.'
|
||||
- the 'smart' option for setting a connection plugin is being removed as it's
|
||||
main purpose (choosing between ssh and paramiko) is now irrelevant.
|
||||
- vault and unfault filters - the undocumented ``vaultid`` parameter is deprecated
|
||||
and will be removed in ansible-core 2.20. Use ``vault_id`` instead.
|
||||
- yum_repository - deprecated parameter 'keepcache' (https://github.com/ansible/ansible/issues/78693).
|
||||
known_issues:
|
||||
- ansible-galaxy - dies in the middle of installing a role when that role contains
|
||||
Java inner classes (files with $ in the file name). This is by design, to
|
||||
exclude temporary or backup files. (https://github.com/ansible/ansible/pull/81553).
|
||||
- ansible-test - The ``pep8`` sanity test is unable to detect f-string spacing
|
||||
issues (E201, E202) on Python 3.10 and 3.11. They are correctly detected under
|
||||
Python 3.12. See (https://github.com/PyCQA/pycodestyle/issues/1190).
|
||||
minor_changes:
|
||||
- Add Python type hints to the Display class (https://github.com/ansible/ansible/issues/80841)
|
||||
- Add ``GALAXY_COLLECTIONS_PATH_WARNING`` option to disable the warning given
|
||||
by ``ansible-galaxy collection install`` when installing a collection to a
|
||||
path that isn't in the configured collection paths.
|
||||
- Add ``python3.12`` to the default ``INTERPRETER_PYTHON_FALLBACK`` list.
|
||||
- Add ``utcfromtimestamp`` and ``utcnow`` to ``ansible.module_utils.compat.datetime``
|
||||
to return fixed offset datetime objects.
|
||||
- Add a general ``GALAXY_SERVER_TIMEOUT`` config option for distribution servers
|
||||
(https://github.com/ansible/ansible/issues/79833).
|
||||
- Added Python type annotation to connection plugins
|
||||
- CLI argument parsing - Automatically prepend to the help of CLI arguments
|
||||
that support being specified multiple times. (https://github.com/ansible/ansible/issues/22396)
|
||||
- DEFAULT_TRANSPORT now defaults to 'ssh', the old 'smart' option is being deprecated
|
||||
as versions of OpenSSH without control persist are basically not present anymore.
|
||||
- Documentation for set filters ``intersect``, ``difference``, ``symmetric_difference``
|
||||
and ``union`` now states that the returned list items are in arbitrary order.
|
||||
- Record ``removal_date`` in runtime metadata as a string instead of a date.
|
||||
- Remove the ``CleansingNodeVisitor`` class and its usage due to the templating
|
||||
changes that made it superfluous. Also simplify the ``Conditional`` class.
|
||||
- Removed ``exclude`` and ``recursive-exclude`` commands for generated files
|
||||
from the ``MANIFEST.in`` file. These excludes were unnecessary since releases
|
||||
are expected to be built with a clean worktree.
|
||||
- Removed ``exclude`` commands for sanity test files from the ``MANIFEST.in``
|
||||
file. These tests were previously excluded because they did not pass when
|
||||
run from an sdist. However, sanity tests are not expected to pass from an
|
||||
sdist, so excluding some (but not all) of the failing tests makes little sense.
|
||||
- Removed redundant ``include`` commands from the ``MANIFEST.in`` file. These
|
||||
includes either duplicated default behavior or another command.
|
||||
- The ``ansible-core`` sdist no longer contains pre-generated man pages. Instead,
|
||||
a ``packaging/cli-doc/build.py`` script is included in the sdist. This script
|
||||
can generate man pages and standalone RST documentation for ``ansible-core``
|
||||
CLI programs.
|
||||
- The ``docs`` and ``examples`` directories are no longer included in the ``ansible-core``
|
||||
sdist. These directories have been moved to the https://github.com/ansible/ansible-documentation
|
||||
repository.
|
||||
- The minimum required ``setuptools`` version is now 66.1.0, as it is the oldest
|
||||
version to support Python 3.12.
|
||||
- Update ``ansible_service_mgr`` fact to include init system for SMGL OS family
|
||||
- Use ``ansible.module_utils.common.text.converters`` instead of ``ansible.module_utils._text``.
|
||||
- Use ``importlib.resources.abc.TraversableResources`` instead of deprecated
|
||||
``importlib.abc.TraversableResources`` where available (https:/github.com/ansible/ansible/pull/81082).
|
||||
- Use ``include`` where ``recursive-include`` is unnecessary in the ``MANIFEST.in``
|
||||
file.
|
||||
- Use ``package_data`` instead of ``include_package_data`` for ``setup.cfg``
|
||||
to avoid ``setuptools`` warnings.
|
||||
- Utilize gpg check provided internally by the ``transaction.run`` method as
|
||||
oppose to calling it manually.
|
||||
- '``Templar`` - do not add the ``dict`` constructor to ``globals`` as all required
|
||||
Jinja2 versions already do so'
|
||||
- ansible-doc - allow to filter listing of collections and metadata dump by
|
||||
more than one collection (https://github.com/ansible/ansible/pull/81450).
|
||||
- ansible-galaxy - Add a plural option to improve ignoring multiple signature
|
||||
error status codes when installing or verifying collections. A space-separated
|
||||
list of error codes can follow --ignore-signature-status-codes in addition
|
||||
to specifying --ignore-signature-status-code multiple times (for example,
|
||||
``--ignore-signature-status-codes NO_PUBKEY UNEXPECTED``).
|
||||
- ansible-galaxy - Remove internal configuration argument ``v3`` (https://github.com/ansible/ansible/pull/80721)
|
||||
- ansible-galaxy - add note to the collection dependency resolver error message
|
||||
about pre-releases if ``--pre`` was not provided (https://github.com/ansible/ansible/issues/80048).
|
||||
- ansible-galaxy - used to crash out with a "Errno 20 Not a directory" error
|
||||
when extracting files from a role when hitting a file with an illegal name
|
||||
(https://github.com/ansible/ansible/pull/81553). Now it gives a warning identifying
|
||||
the culprit file and the rule violation (e.g., ``my$class.jar`` has a ``$``
|
||||
in the name) before crashing out, giving the user a chance to remove the invalid
|
||||
file and try again. (https://github.com/ansible/ansible/pull/81555).
|
||||
- ansible-test - Add Alpine 3.18 to remotes
|
||||
- ansible-test - Add Fedora 38 container.
|
||||
- ansible-test - Add Fedora 38 remote.
|
||||
- ansible-test - Add FreeBSD 13.2 remote.
|
||||
- ansible-test - Add new pylint checker for new ``# deprecated:`` comments within
|
||||
code to trigger errors when time to remove code that has no user facing deprecation
|
||||
message. Only supported in ansible-core, not collections.
|
||||
- ansible-test - Add support for RHEL 8.8 remotes.
|
||||
- ansible-test - Add support for RHEL 9.2 remotes.
|
||||
- ansible-test - Add support for testing with Python 3.12.
|
||||
- ansible-test - Allow float values for the ``--timeout`` option to the ``env``
|
||||
command. This simplifies testing.
|
||||
- ansible-test - Enable ``thread`` code coverage in addition to the existing
|
||||
``multiprocessing`` coverage.
|
||||
- ansible-test - RHEL 8.8 provisioning can now be used with the ``--python 3.11``
|
||||
option.
|
||||
- ansible-test - RHEL 9.2 provisioning can now be used with the ``--python 3.11``
|
||||
option.
|
||||
- ansible-test - Refactored ``env`` command logic and timeout handling.
|
||||
- ansible-test - Remove Fedora 37 remote support.
|
||||
- ansible-test - Remove Fedora 37 test container.
|
||||
- ansible-test - Remove Python 3.8 and 3.9 from RHEL 8.8.
|
||||
- ansible-test - Remove obsolete embedded script for configuring WinRM on Windows
|
||||
remotes.
|
||||
- ansible-test - Removed Ubuntu 20.04 LTS image from the `--remote` option.
|
||||
- ansible-test - Removed `freebsd/12.4` remote.
|
||||
- ansible-test - Removed `freebsd/13.1` remote.
|
||||
- 'ansible-test - Removed test remotes: rhel/8.7, rhel/9.1'
|
||||
- ansible-test - Removed the deprecated ``--docker-no-pull`` option.
|
||||
- ansible-test - Removed the deprecated ``--no-pip-check`` option.
|
||||
- ansible-test - Removed the deprecated ``foreman`` test plugin.
|
||||
- ansible-test - Removed the deprecated ``govcsim`` support from the ``vcenter``
|
||||
test plugin.
|
||||
- ansible-test - Replace the ``pytest-forked`` pytest plugin with a custom plugin.
|
||||
- ansible-test - The ``no-get-exception`` sanity test is now limited to plugins
|
||||
in collections. Previously any Python file in a collection was checked for
|
||||
``get_exception`` usage.
|
||||
- ansible-test - The ``replace-urlopen`` sanity test is now limited to plugins
|
||||
in collections. Previously any Python file in a collection was checked for
|
||||
``urlopen`` usage.
|
||||
- ansible-test - The ``use-compat-six`` sanity test is now limited to plugins
|
||||
in collections. Previously any Python file in a collection was checked for
|
||||
``six`` usage.
|
||||
- ansible-test - The openSUSE test container has been updated to openSUSE Leap
|
||||
15.5.
|
||||
- ansible-test - Update pip to ``23.1.2`` and setuptools to ``67.7.2``.
|
||||
- ansible-test - Update the ``default`` containers.
|
||||
- ansible-test - Update the ``nios-test-container`` to version 2.0.0, which
|
||||
supports API version 2.9.
|
||||
- ansible-test - Update the logic used to detect when ``ansible-test`` is running
|
||||
from source.
|
||||
- ansible-test - Updated the CloudStack test container to version 1.6.1.
|
||||
- ansible-test - Updated the distro test containers to version 6.3.0 to include
|
||||
coverage 7.3.2 for Python 3.8+. The alpine3 container is now based on 3.18
|
||||
instead of 3.17 and includes Python 3.11 instead of Python 3.10.
|
||||
- ansible-test - Use ``datetime.datetime.now`` with ``tz`` specified instead
|
||||
of ``datetime.datetime.utcnow``.
|
||||
- ansible-test - Use a context manager to perform cleanup at exit instead of
|
||||
using the built-in ``atexit`` module.
|
||||
- ansible-test - remove Alpine 3.17 from remotes
|
||||
- "ansible-test \u2014 Python 3.8\u20133.12 will use ``coverage`` v7.3.2."
|
||||
- "ansible-test \u2014 ``coverage`` v6.5.0 is to be used only under Python 3.7."
|
||||
- 'ansible-vault create: Now raises an error when opening the editor without
|
||||
tty. The flag --skip-tty-check restores previous behaviour.'
|
||||
- ansible_user_module - tweaked macos user defaults to reflect expected defaults
|
||||
(https://github.com/ansible/ansible/issues/44316)
|
||||
- apt - return calculated diff while running apt clean operation.
|
||||
- blockinfile - add append_newline and prepend_newline options (https://github.com/ansible/ansible/issues/80835).
|
||||
- cli - Added short option '-J' for asking for vault password (https://github.com/ansible/ansible/issues/80523).
|
||||
- command - Add option ``expand_argument_vars`` to disable argument expansion
|
||||
and use literal values - https://github.com/ansible/ansible/issues/54162
|
||||
- config lookup new option show_origin to also return the origin of a configuration
|
||||
value.
|
||||
- display methods for warning and deprecation are now proxied to main process
|
||||
when issued from a fork. This allows for the deduplication of warnings and
|
||||
deprecations to work globally.
|
||||
- dnf5 - enable environment groups installation testing in CI as its support
|
||||
was added.
|
||||
- dnf5 - enable now implemented ``cacheonly`` functionality
|
||||
- executor now skips persistent connection when it detects an action that does
|
||||
not require a connection.
|
||||
- find module - Add ability to filter based on modes
|
||||
- gather_facts now will use gather_timeout setting to limit parallel execution
|
||||
of modules that do not themselves use gather_timeout.
|
||||
- group - remove extraneous warning shown when user does not exist (https://github.com/ansible/ansible/issues/77049).
|
||||
- include_vars - os.walk now follows symbolic links when traversing directories
|
||||
(https://github.com/ansible/ansible/pull/80460)
|
||||
- module compression is now sourced directly via config, bypassing play_context
|
||||
possibly stale values.
|
||||
- reboot - show last error message in verbose logs (https://github.com/ansible/ansible/issues/81574).
|
||||
- service_facts now returns more info for rcctl managed systesm (OpenBSD).
|
||||
- tasks - the ``retries`` keyword can be specified without ``until`` in which
|
||||
case the task is retried until it succeeds but at most ``retries`` times (https://github.com/ansible/ansible/issues/20802)
|
||||
- user - add new option ``password_expire_warn`` (supported on Linux only) to
|
||||
set the number of days of warning before a password change is required (https://github.com/ansible/ansible/issues/79882).
|
||||
- yum_repository - Align module documentation with parameters
|
||||
release_summary: '| Release Date: 2023-09-26
|
||||
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
|
||||
'
|
||||
removed_features:
|
||||
- ActionBase - remove deprecated ``_remote_checksum`` method
|
||||
- PlayIterator - remove deprecated ``cache_block_tasks`` and ``get_original_task``
|
||||
methods
|
||||
- Remove deprecated ``FileLock`` class
|
||||
- Removed Python 3.9 as a supported version on the controller. Python 3.10 or
|
||||
newer is required.
|
||||
- Removed ``include`` which has been deprecated in Ansible 2.12. Use ``include_tasks``
|
||||
or ``import_tasks`` instead.
|
||||
- '``Templar`` - remove deprecated ``shared_loader_obj`` parameter of ``__init__``'
|
||||
- '``fetch_url`` - remove auto disabling ``decompress`` when gzip is not available'
|
||||
- '``get_action_args_with_defaults`` - remove deprecated ``redirected_names``
|
||||
method parameter'
|
||||
- ansible-test - Removed support for the remote Windows targets 2012 and 2012-R2
|
||||
- inventory_cache - remove deprecated ``default.fact_caching_prefix`` ini configuration
|
||||
option, use ``defaults.fact_caching_prefix`` instead.
|
||||
- module_utils/basic.py - Removed Python 3.5 as a supported remote version.
|
||||
Python 2.7 or Python 3.6+ is now required.
|
||||
- stat - removed unused `get_md5` parameter.
|
||||
codename: All My Love
|
||||
fragments:
|
||||
- 2.16.0b1_summary.yaml
|
||||
- 20802-until-default.yml
|
||||
- 22396-indicate-which-args-are-multi.yml
|
||||
- 27816-fetch-unreachable.yml
|
||||
- 50603-tty-check.yaml
|
||||
- 71916-user-expires-int.yml
|
||||
- 73643-handlers-prevent-multiple-runs.yml
|
||||
- 74723-support-wildcard-win_fetch.yml
|
||||
- 75063-allow-dev-nul-as-skeleton-for-new-homedir.yml
|
||||
- 76372-fix-pip-virtualenv-command-parsing.yml
|
||||
- 78487-galaxy-collections-path-warnings.yml
|
||||
- 79129-ansible-managed-filename-format.yaml
|
||||
- 79364_replace.yml
|
||||
- 79677-fix-argspec-type-check.yml
|
||||
- 79734-ansible-test-change-detection.yml
|
||||
- 79844-fix-timeout-mounts-linux.yml
|
||||
- 79999-ansible-user-tweak-macos-defaults.yaml
|
||||
- 80089-prevent-module-build-date-issue.yml
|
||||
- 80128-symbolic-modes-X-use-computed.yml
|
||||
- 80257-iptables-chain-creation-does-not-populate-a-rule.yml
|
||||
- 80258-defensive-display-non-utf8.yml
|
||||
- 80334-reduce-ansible-galaxy-api-calls.yml
|
||||
- 80406-validate-modules-semantic-markup.yml
|
||||
- 80449-fix-symbolic-mode-error-msg.yml
|
||||
- 80459-handlers-nested-includes-vars.yml
|
||||
- 80460-add-symbolic-links-with-dir.yml
|
||||
- 80476-fix-loop-task-post-validation.yml
|
||||
- 80488-pip-pkg-resources.yml
|
||||
- 80506-syntax-check-playbook-only.yml
|
||||
- 80520-fix-current-hostname-openbsd.yml
|
||||
- 80523_-_adding_short_option_for_--ask-vault-pass.yml
|
||||
- 80605-template-overlay-native-jinja.yml
|
||||
- 80648-fix-ansible-galaxy-cache-signatures-bug.yml
|
||||
- 80721-ansible-galaxy.yml
|
||||
- 80738-abs-unarachive-src.yml
|
||||
- 80841-display-type-annotation.yml
|
||||
- 80880-register-handlers-immediately-if-iterating-handlers.yml
|
||||
- 80887-dnf5-api-change.yml
|
||||
- 80943-ansible-galaxy-collection-subdir-install.yml
|
||||
- 80968-replace-deprecated-ast-attr.yml
|
||||
- 80985-fix-smgl-family-mapping.yml
|
||||
- 81005-use-overlay-overrides.yml
|
||||
- 81013-handlers-listen-last-defined-only.yml
|
||||
- 81029-connection-types.yml
|
||||
- 81064-daemonize-fixes.yml
|
||||
- 81082-deprecated-importlib-abc.yml
|
||||
- 81083-add-blockinfile-append-and-prepend-new-line-options.yml
|
||||
- 81104-inventory-script-plugin-raise-execution-error.yml
|
||||
- 81319-cloudstack-test-container-bump-version.yml
|
||||
- 81332-fix-pkg-mgr-in-kylin.yml
|
||||
- 81450-list-filters.yml
|
||||
- 81494-remove-duplicated-file-attribute-constant.yml
|
||||
- 81555-add-warning-for-illegal-filenames-in-roles.yaml
|
||||
- 81584-daemonize-follow-up-fixes.yml
|
||||
- 81606-ansible-galaxy-collection-pre-releases.yml
|
||||
- 81613-remove-unusued-private-lock.yml
|
||||
- 81656-cf_readfp-deprecated.yml
|
||||
- 81662-blockinfile-exc.yml
|
||||
- 81722-handler-subdir-include_tasks.yml
|
||||
- CleansingNodeVisitor-removal.yml
|
||||
- a-g-col-install-directory-with-trailing-sep.yml
|
||||
- a-g-col-prevent-reinstalling-satisfied-req.yml
|
||||
- a_test_rmv_alpine_317.yml
|
||||
- add-missing-cli-docs.yml
|
||||
- ag-ignore-multiple-signature-statuses.yml
|
||||
- ansible-galaxy-server-timeout.yml
|
||||
- ansible-runtime-metadata-removal-date.yml
|
||||
- ansible-test-added-fedora-38.yml
|
||||
- ansible-test-argcomplete-3.yml
|
||||
- ansible-test-atexit.yml
|
||||
- ansible-test-coverage-update.yml
|
||||
- ansible-test-default-containers.yml
|
||||
- ansible-test-deprecated-cleanup.yml
|
||||
- ansible-test-distro-containers.yml
|
||||
- ansible-test-entry-points.yml
|
||||
- ansible-test-explain-traceback.yml
|
||||
- ansible-test-fedora-37.yml
|
||||
- ansible-test-freebsd-bootstrap-setuptools.yml
|
||||
- ansible-test-import-sanity-fix.yml
|
||||
- ansible-test-layout-detection.yml
|
||||
- ansible-test-long-timeout-fix.yml
|
||||
- ansible-test-minimum-setuptools.yml
|
||||
- ansible-test-nios-container.yml
|
||||
- ansible-test-pylint-update.yml
|
||||
- ansible-test-pytest-forked.yml
|
||||
- ansible-test-python-3.12.yml
|
||||
- ansible-test-pyyaml-build.yml
|
||||
- ansible-test-remove-old-rhel-remotes.yml
|
||||
- ansible-test-remove-ubuntu-2004.yml
|
||||
- ansible-test-rhel-9.2-python-3.11.yml
|
||||
- ansible-test-rhel-9.2.yml
|
||||
- ansible-test-sanity-scope.yml
|
||||
- ansible-test-source-detection.yml
|
||||
- ansible-test-thread-coverage.yml
|
||||
- ansible-test-timeout-fix.yml
|
||||
- ansible-test-unique-container-names.yml
|
||||
- ansible-test-use-raise-from.yml
|
||||
- ansible-test-utcnow.yml
|
||||
- ansible-test-winrm-config.yml
|
||||
- ansible-vault.yml
|
||||
- ansible_test_alpine_3.18.yml
|
||||
- apt_fail_on_autoremove.yml
|
||||
- aptclean_diff.yml
|
||||
- basestrategy-lazy-templar.yml
|
||||
- ci_freebsd_new.yml
|
||||
- collections_paths-deprecation.yml
|
||||
- colors.yml
|
||||
- command-expand-args.yml
|
||||
- config_origins_option.yml
|
||||
- connection-type-annotation.yml
|
||||
- copy_diff.yml
|
||||
- deb822_open_url.yml
|
||||
- debconf.yml
|
||||
- deprecated_string_conversion_action.yml
|
||||
- display_proxy.yml
|
||||
- dnf-update-only-latest.yml
|
||||
- dnf5-cacheonly.yml
|
||||
- dnf5-fix-interpreter-fail-msg.yml
|
||||
- dnf5-gpg-check-api.yml
|
||||
- dnf5-gpg-check-builtin.yml
|
||||
- dnf5-logs-api.yml
|
||||
- dnf5-test-env-groups.yml
|
||||
- dotnet-preparation.yml
|
||||
- dpkg_selections.yml
|
||||
- fbsd13_1_remove.yml
|
||||
- fetch_url-remove-auto-disable-decompress.yml
|
||||
- find-mode.yml
|
||||
- first_found_fixes.yml
|
||||
- first_found_template_fix.yml
|
||||
- fix-display-prompt-cpu-consumption.yml
|
||||
- fix-handlers-callback.yml
|
||||
- fix-pkg-mgr-in-TencentOS.yml
|
||||
- fix-setuptools-warnings.yml
|
||||
- fix-url-lookup-plugin-docs.yml
|
||||
- forced_local+fix+.yml
|
||||
- freebsd_12_4_removal.yml
|
||||
- galaxy_check_type.yml
|
||||
- galaxy_symlink.yml
|
||||
- gather_facts_fix_parallel.yml
|
||||
- get_action_args_with_defaults-remove-deprecated-arg.yml
|
||||
- group_warning.yml
|
||||
- inventory_cache-remove-deprecated-default-section.yml
|
||||
- inventory_ini.yml
|
||||
- jinja_plugin_cache_cleanup.yml
|
||||
- long-collection-paths-fix.yml
|
||||
- man-page-build-docs-dependency.yml
|
||||
- man-page-subcommands.yml
|
||||
- manifest-in-cleanup.yml
|
||||
- mc_from_config.yml
|
||||
- missing-doc-func.yml
|
||||
- no-arbitrary-j2-override.yml
|
||||
- omit-man-pages-from-sdist.yml
|
||||
- parsing-splitter-fixes.yml
|
||||
- passlib_or_crypt.yml
|
||||
- password_hash-fix-crypt-salt-bcrypt.yml
|
||||
- pep517-backend-import-fix.yml
|
||||
- pep517-backend-traceback-fix.yml
|
||||
- pep8-known-issue.yml
|
||||
- persist_skip.yml
|
||||
- pkg_mgr-default-dnf.yml
|
||||
- powershell-module-error-handling.yml
|
||||
- pre-release-hint-for-dep-resolution-error.yml
|
||||
- pylint-deprecated-comment-checker.yml
|
||||
- reboot.yml
|
||||
- remove-deprecated-actionbase-_remote_checksum.yml
|
||||
- remove-deprecated-datetime-methods.yml
|
||||
- remove-deprecated-filelock-class.yml
|
||||
- remove-docs-examples.yml
|
||||
- remove-include.yml
|
||||
- remove-play_iterator-deprecated-methods.yml
|
||||
- remove-python3.5.yml
|
||||
- remove-python3.9-controller-support.yml
|
||||
- remove-templar-shared_loader_obj-arg.yml
|
||||
- remove-unreachable-include_role-static-err.yml
|
||||
- remove_md5.yml
|
||||
- role-deduplication-condition.yml
|
||||
- run-command-selectors-prompt-only.yml
|
||||
- server2012-deprecation.yml
|
||||
- service_facts_rcctl.yml
|
||||
- service_facts_simpleinit_msb.yml
|
||||
- service_fix_obsd.yml
|
||||
- set-filters.yml
|
||||
- setup_facter_fix.yml
|
||||
- simple-result-queue.yml
|
||||
- smart_connection_bye.yml
|
||||
- suppressed-options.yml
|
||||
- tarfile_extract_warn.yml
|
||||
- templar-globals-dict.yml
|
||||
- templating_fixes.yml
|
||||
- text-converters.yml
|
||||
- timeout_config_fix.yml
|
||||
- update-maybe-json-uri.yml
|
||||
- urls-client-cert-py12.yml
|
||||
- urls-unit-test-latest-cryptography.yml
|
||||
- user-add-password-exp-warning.yml
|
||||
- v2.16.0-initial-commit.yaml
|
||||
- vault_unvault_id_fix.yml
|
||||
- yum-repository-docs-fixes.yml
|
||||
- yum_repository_keepcache.yml
|
||||
release_date: '2023-09-26'
|
||||
2.16.0b2:
|
||||
changes:
|
||||
bugfixes:
|
||||
- '``import_role`` reverts to previous behavior of exporting vars at compile
|
||||
time.'
|
||||
- ansible-galaxy info - fix reporting no role found when lookup_role_by_name
|
||||
returns None.
|
||||
- uri/urls - Add compat function to handle the ability to parse the filename
|
||||
from a Content-Disposition header (https://github.com/ansible/ansible/issues/81806)
|
||||
- winrm - Better handle send input failures when communicating with hosts under
|
||||
load
|
||||
minor_changes:
|
||||
- ansible-test - When invoking ``sleep`` in containers during container setup,
|
||||
the ``env`` command is used to avoid invoking the shell builtin, if present.
|
||||
release_summary: '| Release Date: 2023-10-03
|
||||
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
|
||||
'
|
||||
security_fixes:
|
||||
- ansible-galaxy - Prevent roles from using symlinks to overwrite files outside
|
||||
of the installation directory (CVE-2023-5115)
|
||||
codename: All My Love
|
||||
fragments:
|
||||
- 2.16.0b2_summary.yaml
|
||||
- 81806-py2-content-disposition.yml
|
||||
- ansible-test-container-sleep.yml
|
||||
- cve-2023-5115.yml
|
||||
- fix-ansible-galaxy-info-no-role-found.yml
|
||||
- import_role_goes_public.yml
|
||||
- winrm-send-input.yml
|
||||
release_date: '2023-10-03'
|
||||
2.16.0rc1:
|
||||
changes:
|
||||
bugfixes:
|
||||
- Cache host_group_vars after instantiating it once and limit the amount of
|
||||
repetitive work it needs to do every time it runs.
|
||||
- Call PluginLoader.all() once for vars plugins, and load vars plugins that
|
||||
run automatically or are enabled specifically by name subsequently.
|
||||
- Fix ``run_once`` being incorrectly interpreted on handlers (https://github.com/ansible/ansible/issues/81666)
|
||||
- Properly template tags in parent blocks (https://github.com/ansible/ansible/issues/81053)
|
||||
- ansible-galaxy - Provide a better error message when using a requirements
|
||||
file with an invalid format - https://github.com/ansible/ansible/issues/81901
|
||||
- ansible-inventory - index available_hosts for major performance boost when
|
||||
dumping large inventories
|
||||
- ansible-test - Add a ``pylint`` plugin to work around a known issue on Python
|
||||
3.12.
|
||||
- ansible-test - Include missing ``pylint`` requirements for Python 3.10.
|
||||
- ansible-test - Update ``pylint`` to version 3.0.1.
|
||||
deprecated_features:
|
||||
- Old style vars plugins which use the entrypoints `get_host_vars` or `get_group_vars`
|
||||
are deprecated. The plugin should be updated to inherit from `BaseVarsPlugin`
|
||||
and define a `get_vars` method as the entrypoint.
|
||||
minor_changes:
|
||||
- ansible-test - Make Python 3.12 the default version used in the ``base`` and
|
||||
``default`` containers.
|
||||
release_summary: '| Release Date: 2023-10-16
|
||||
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
|
||||
'
|
||||
codename: All My Love
|
||||
fragments:
|
||||
- 2.16.0rc1_summary.yaml
|
||||
- 79945-host_group_vars-improvements.yml
|
||||
- 81053-templated-tags-inheritance.yml
|
||||
- 81666-handlers-run_once.yml
|
||||
- 81901-galaxy-requirements-format.yml
|
||||
- ansible-test-pylint3-update.yml
|
||||
- ansible-test-python-3.12-compat.yml
|
||||
- ansible-test-python-default.yml
|
||||
- inv_available_hosts_to_frozenset.yml
|
||||
release_date: '2023-10-16'
|
||||
2.16.1:
|
||||
changes:
|
||||
release_summary: '| Release Date: 2023-12-04
|
||||
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
|
||||
'
|
||||
codename: All My Love
|
||||
fragments:
|
||||
- 2.16.1_summary.yaml
|
||||
release_date: '2023-12-04'
|
||||
2.16.1rc1:
|
||||
changes:
|
||||
breaking_changes:
|
||||
- assert - Nested templating may result in an inability for the conditional
|
||||
to be evaluated. See the porting guide for more information.
|
||||
bugfixes:
|
||||
- Fix issue where an ``include_tasks`` handler in a role was not able to locate
|
||||
a file in ``tasks/`` when ``tasks_from`` was used as a role entry point and
|
||||
``main.yml`` was not present (https://github.com/ansible/ansible/issues/82241)
|
||||
- Plugin loader does not dedupe nor cache filter/test plugins by file basename,
|
||||
but full path name.
|
||||
- Restoring the ability of filters/tests can have same file base name but different
|
||||
tests/filters defined inside.
|
||||
- ansible-pull now will expand relative paths for the ``-d|--directory`` option
|
||||
is now expanded before use.
|
||||
- ansible-pull will now correctly handle become and connection password file
|
||||
options for ansible-playbook.
|
||||
- flush_handlers - properly handle a handler failure in a nested block when
|
||||
``force_handlers`` is set (http://github.com/ansible/ansible/issues/81532)
|
||||
- module no_log will no longer affect top level booleans, for example ``no_log_module_parameter='a'``
|
||||
will no longer hide ``changed=False`` as a 'no log value' (matches 'a').
|
||||
- role params now have higher precedence than host facts again, matching documentation,
|
||||
this had unintentionally changed in 2.15.
|
||||
- wait_for should not handle 'non mmapable files' again.
|
||||
release_summary: '| Release Date: 2023-11-27
|
||||
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
|
||||
'
|
||||
security_fixes:
|
||||
- templating - Address issues where internal templating can cause unsafe variables
|
||||
to lose their unsafe designation (CVE-2023-5764)
|
||||
codename: All My Love
|
||||
fragments:
|
||||
- 2.16.1rc1_summary.yaml
|
||||
- 81532-fix-nested-flush_handlers.yml
|
||||
- 82241-handler-include-tasks-from.yml
|
||||
- cve-2023-5764.yml
|
||||
- j2_load_fix.yml
|
||||
- no_log_booly.yml
|
||||
- pull_file_secrets.yml
|
||||
- pull_unfrack_dest.yml
|
||||
- restore_role_param_precedence.yml
|
||||
- wait_for_mmap.yml
|
||||
release_date: '2023-11-27'
|
||||
@ -1,22 +0,0 @@
|
||||
---
|
||||
title: ansible-core
|
||||
release_tag_re: '(v(?:[\d.ab\-]|rc)+)'
|
||||
pre_release_tag_re: '(?P<pre_release>(?:[ab]|rc)+\d*)$'
|
||||
changes_file: changelog.yaml
|
||||
changes_format: combined
|
||||
keep_fragments: true
|
||||
always_refresh: true
|
||||
ignore_other_fragment_extensions: true
|
||||
mention_ancestor: false
|
||||
notesdir: fragments
|
||||
prelude_section_name: release_summary
|
||||
new_plugins_after_name: removed_features
|
||||
sections:
|
||||
- ['major_changes', 'Major Changes']
|
||||
- ['minor_changes', 'Minor Changes']
|
||||
- ['breaking_changes', 'Breaking Changes / Porting Guide']
|
||||
- ['deprecated_features', 'Deprecated Features']
|
||||
- ['removed_features', 'Removed Features (previously deprecated)']
|
||||
- ['security_fixes', 'Security Fixes']
|
||||
- ['bugfixes', 'Bugfixes']
|
||||
- ['known_issues', 'Known Issues']
|
||||
@ -1,3 +0,0 @@
|
||||
release_summary: |
|
||||
| Release Date: 2023-11-06
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
@ -1,3 +0,0 @@
|
||||
release_summary: |
|
||||
| Release Date: 2023-09-26
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
@ -1,3 +0,0 @@
|
||||
release_summary: |
|
||||
| Release Date: 2023-10-03
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
@ -1,3 +0,0 @@
|
||||
release_summary: |
|
||||
| Release Date: 2023-10-16
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
@ -1,3 +0,0 @@
|
||||
release_summary: |
|
||||
| Release Date: 2023-12-04
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
@ -1,3 +0,0 @@
|
||||
release_summary: |
|
||||
| Release Date: 2023-11-27
|
||||
| `Porting Guide <https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html>`__
|
||||
@ -1,2 +0,0 @@
|
||||
minor_changes:
|
||||
- tasks - the ``retries`` keyword can be specified without ``until`` in which case the task is retried until it succeeds but at most ``retries`` times (https://github.com/ansible/ansible/issues/20802)
|
||||
@ -1,3 +0,0 @@
|
||||
minor_changes:
|
||||
- CLI argument parsing - Automatically prepend to the help of CLI arguments that support being specified multiple times.
|
||||
(https://github.com/ansible/ansible/issues/22396)
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- fetch - Handle unreachable errors properly (https://github.com/ansible/ansible/issues/27816)
|
||||
@ -1,4 +0,0 @@
|
||||
---
|
||||
minor_changes:
|
||||
- "ansible-vault create: Now raises an error when opening the editor without
|
||||
tty. The flag --skip-tty-check restores previous behaviour."
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- user - set expiration value correctly when unable to retrieve the current value from the system (https://github.com/ansible/ansible/issues/71916)
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- Prevent running same handler multiple times when included via ``include_role`` (https://github.com/ansible/ansible/issues/73643)
|
||||
@ -1,3 +0,0 @@
|
||||
bugfixes:
|
||||
- win_fetch - Add support for using file with wildcards in file name.
|
||||
(https://github.com/ansible/ansible/issues/73128)
|
||||
@ -1,3 +0,0 @@
|
||||
bugfixes:
|
||||
- modules/user.py - Add check for valid directory when creating new user homedir (allows /dev/null as skeleton) (https://github.com/ansible/ansible/issues/75063)
|
||||
|
||||
@ -1,6 +0,0 @@
|
||||
---
|
||||
bugfixes:
|
||||
- >-
|
||||
Fixed `pip` module failure in case of usage quotes for
|
||||
`virtualenv_command` option for the venv command.
|
||||
(https://github.com/ansible/ansible/issues/76372)
|
||||
@ -1,6 +0,0 @@
|
||||
---
|
||||
minor_changes:
|
||||
- >-
|
||||
Add ``GALAXY_COLLECTIONS_PATH_WARNING`` option to disable the warning
|
||||
given by ``ansible-galaxy collection install`` when installing a collection
|
||||
to a path that isn't in the configured collection paths.
|
||||
@ -1,6 +0,0 @@
|
||||
---
|
||||
bugfixes:
|
||||
- template - Fix for formatting issues when a template path contains
|
||||
valid jinja/strftime pattern (especially line break one) and
|
||||
using the template path in ansible_managed
|
||||
(https://github.com/ansible/ansible/pull/79129)
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- replace - handle exception when bad escape character is provided in replace (https://github.com/ansible/ansible/issues/79364).
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- module/role argument spec - validate the type for options that are None when the option is required or has a non-None default (https://github.com/ansible/ansible/issues/79656).
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- "ansible-test local change detection - use ``git merge-base <branch> HEAD`` instead of ``git merge-base --fork-point <branch>`` (https://github.com/ansible/ansible/pull/79734)."
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- setup gather_timeout - Fix timeout in get_mounts_facts for linux.
|
||||
@ -1,5 +0,0 @@
|
||||
bugfixes:
|
||||
- Cache host_group_vars after instantiating it once and limit the amount of repetitive work it needs to do every time it runs.
|
||||
- Call PluginLoader.all() once for vars plugins, and load vars plugins that run automatically or are enabled specifically by name subsequently.
|
||||
deprecated_features:
|
||||
- Old style vars plugins which use the entrypoints `get_host_vars` or `get_group_vars` are deprecated. The plugin should be updated to inherit from `BaseVarsPlugin` and define a `get_vars` method as the entrypoint.
|
||||
@ -1,2 +0,0 @@
|
||||
minor_changes:
|
||||
- 'ansible_user_module - tweaked macos user defaults to reflect expected defaults (https://github.com/ansible/ansible/issues/44316)'
|
||||
@ -1,5 +0,0 @@
|
||||
bugfixes:
|
||||
- ansiballz - Prevent issue where the time on the control host could
|
||||
change part way through building the ansiballz file, potentially causing
|
||||
a pre-1980 date to be used during ansiballz unpacking leading to a zip
|
||||
file error (https://github.com/ansible/ansible/issues/80089)
|
||||
@ -1,3 +0,0 @@
|
||||
bugfixes:
|
||||
- file modules - Make symbolic modes with X use the computed permission, not original file (https://github.com/ansible/ansible/issues/80128)
|
||||
- copy unit tests - Fixing "dir all perms" documentation and formatting for easier reading.
|
||||
@ -1,2 +0,0 @@
|
||||
bugfixes:
|
||||
- iptables - remove default rule creation when creating iptables chain to be more similar to the command line utility (https://github.com/ansible/ansible/issues/80256).
|
||||
@ -1,4 +0,0 @@
|
||||
bugfixes:
|
||||
- Display - Defensively configure writing to stdout and stderr with a custom encoding error handler that will replace invalid characters
|
||||
while providing a deprecation warning that non-utf8 text will result in an error in a future version.
|
||||
- module responses - Ensure that module responses are utf-8 adhereing to JSON RFC and expectations of the core code.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user