├── .github ├── CODEOWNERS ├── dependabot.yml └── workflows │ ├── ci.yml │ └── prepare-action │ └── action.yml ├── .github_changelog_generator ├── .gitignore ├── .yamllint ├── CHANGELOG.md ├── CHANGELOG.md.license ├── CITATION.cff ├── HISTORY.md ├── HISTORY.md.license ├── LICENSE.md ├── LICENSES └── Apache-2.0.txt ├── Pipfile ├── Pipfile.lock ├── Pipfile.lock.license ├── README.md ├── VERSION ├── defaults └── main.yml ├── files └── .gitkeep ├── handlers └── main.yml ├── meta └── main.yml ├── molecule └── default │ ├── converge.yml │ ├── molecule.yml │ ├── prepare.yml │ └── verify.yml ├── renovate.json ├── renovate.json.license ├── tasks └── main.yml ├── templates ├── .gitkeep ├── keepalived.conf.j2 └── keepalived.service.j2 └── vars └── main.yml /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2023 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | * @hifis-net/hifis-software-technology 7 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2022 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | version: 2 7 | updates: 8 | 9 | - package-ecosystem: "github-actions" 10 | directory: "/" 11 | schedule: 12 | # Check for updates to GitHub Actions every weekday 13 | interval: "daily" 14 | 15 | - package-ecosystem: "pip" 16 | directory: "/" 17 | schedule: 18 | # Check for updates to pip packages every weekday 19 | interval: "daily" 20 | ignore: 21 | - dependency-name: "python" 22 | update-types: ["version-update:semver-major"] 23 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2022 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | name: CI 8 | on: 9 | pull_request: 10 | push: 11 | branches: 12 | - "main" 13 | tags: 14 | - "v*.*.*" 15 | schedule: 16 | - cron: '0 1 * * *' 17 | 18 | env: 19 | PY_COLORS: 1 20 | ANSIBLE_FORCE_COLOR: 1 21 | 22 | jobs: 23 | 24 | lint: 25 | name: Lint 26 | runs-on: ubuntu-22.04 27 | steps: 28 | - name: Check out the codebase. 29 | uses: actions/checkout@v4 30 | 31 | - name: Prepare the job environment. 32 | uses: ./.github/workflows/prepare-action 33 | 34 | - name: Lint code. 35 | run: | 36 | pipenv run yamllint --strict --format colored . 37 | pipenv run ansible-lint -v --force-color --offline --exclude=.pipenv/ 38 | 39 | license_compliance: 40 | name: Check license compliance with reuse. 41 | runs-on: ubuntu-22.04 42 | steps: 43 | - name: Check out the codebase. 44 | uses: actions/checkout@v4 45 | 46 | - name: Prepare the job environment. 47 | uses: ./.github/workflows/prepare-action 48 | 49 | - name: Lint code. 50 | run: pipenv run reuse lint 51 | 52 | test: 53 | name: Run Molecule tests. 54 | runs-on: ubuntu-22.04 55 | strategy: 56 | fail-fast: false 57 | matrix: 58 | image: 59 | - ghcr.io/hifis-net/ubuntu-systemd:20.04 60 | - ghcr.io/hifis-net/ubuntu-systemd:22.04 61 | 62 | steps: 63 | - name: Check out the codebase. 64 | uses: actions/checkout@v4 65 | 66 | - name: Prepare the job environment. 67 | uses: ./.github/workflows/prepare-action 68 | 69 | - name: Install modern podman 70 | run: | 71 | sudo mkdir -p /etc/apt/keyrings 72 | curl -fsSL https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_$(lsb_release -rs)/Release.key \ 73 | | gpg --dearmor \ 74 | | sudo tee /etc/apt/keyrings/devel_kubic_libcontainers_unstable.gpg > /dev/null 75 | echo \ 76 | "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/devel_kubic_libcontainers_unstable.gpg]\ 77 | https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_$(lsb_release -rs)/ /" \ 78 | | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:unstable.list > /dev/null 79 | sudo apt-get update -qq 80 | sudo apt-get -qq -y install podman 81 | shell: bash 82 | 83 | - name: Run Molecule tests. 84 | run: pipenv run molecule test 85 | env: 86 | MOLECULE_IMAGE: ${{ matrix.image }} 87 | 88 | release: 89 | name: Release new version on Ansible Galaxy 90 | runs-on: ubuntu-22.04 91 | if: startsWith(github.ref, 'refs/tags/v') 92 | needs: [lint, license_compliance, test] 93 | steps: 94 | - name: checkout 95 | uses: actions/checkout@v4 96 | - name: galaxy 97 | uses: robertdebock/galaxy-action@1.2.1 98 | with: 99 | galaxy_api_key: ${{ secrets.galaxy_api_key }} 100 | git_branch: "main" 101 | -------------------------------------------------------------------------------- /.github/workflows/prepare-action/action.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2022 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | name: Install dependencies and prepare the environment. 8 | description: Install the necessary dependencies for jobs. 9 | runs: 10 | using: composite 11 | steps: 12 | - name: Install pipenv. 13 | run: pipx install pipenv 14 | shell: bash 15 | 16 | - name: Set up Python 3. 17 | uses: actions/setup-python@v3 18 | id: setup-python 19 | with: 20 | python-version: '3.11' 21 | cache: 'pipenv' 22 | 23 | - name: Install dependencies via pipenv. 24 | run: pipenv install --dev 25 | shell: bash 26 | -------------------------------------------------------------------------------- /.github_changelog_generator: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2023 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | user=hifis-net 7 | project=ansible-role-keepalived 8 | since-tag=v1.1.1 9 | base=HISTORY.md 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | .travis.yml 7 | .idea/ 8 | 9 | # Pipenv directory 10 | .pipenv/ 11 | -------------------------------------------------------------------------------- /.yamllint: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | # Based on ansible-lint config 8 | extends: default 9 | 10 | ignore: | 11 | .pipenv/ 12 | 13 | rules: 14 | braces: 15 | max-spaces-inside: 1 16 | level: error 17 | brackets: 18 | max-spaces-inside: 1 19 | level: error 20 | colons: 21 | max-spaces-after: -1 22 | level: error 23 | commas: 24 | max-spaces-after: -1 25 | level: error 26 | comments: disable 27 | comments-indentation: disable 28 | document-start: disable 29 | empty-lines: 30 | max: 3 31 | level: error 32 | hyphens: 33 | level: error 34 | indentation: enable 35 | key-duplicates: enable 36 | line-length: disable 37 | new-line-at-end-of-file: disable 38 | new-lines: 39 | type: unix 40 | trailing-spaces: disable 41 | truthy: disable 42 | 43 | ... 44 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [v1.2.0](https://github.com/hifis-net/ansible-role-keepalived/tree/v1.2.0) (2023-12-13) 4 | 5 | [Full Changelog](https://github.com/hifis-net/ansible-role-keepalived/compare/v1.1.1...v1.2.0) 6 | 7 | **Implemented enhancements:** 8 | 9 | - Switch to molecule-podman instead of molecule-docker [\#27](https://github.com/hifis-net/ansible-role-keepalived/issues/27) 10 | - Add badges to README [\#6](https://github.com/hifis-net/ansible-role-keepalived/issues/6) 11 | 12 | **Fixed bugs:** 13 | 14 | - Specify which paths to lint with ansible-lint in the molecule lint stage [\#45](https://github.com/hifis-net/ansible-role-keepalived/issues/45) 15 | 16 | **Closed issues:** 17 | 18 | - Add GitHub Changelog generator config [\#77](https://github.com/hifis-net/ansible-role-keepalived/issues/77) 19 | - Add CODEOWNERS file [\#75](https://github.com/hifis-net/ansible-role-keepalived/issues/75) 20 | - Add CITATION.cff [\#74](https://github.com/hifis-net/ansible-role-keepalived/issues/74) 21 | - Add support for Ubuntu 22.04 [\#26](https://github.com/hifis-net/ansible-role-keepalived/issues/26) 22 | 23 | **Merged pull requests:** 24 | 25 | - Bump ansible from 9.0.1 to 9.1.0 [\#82](https://github.com/hifis-net/ansible-role-keepalived/pull/82) ([dependabot[bot]](https://github.com/apps/dependabot)) 26 | - chore: bump keepalived version from 2.2.7 to 2.2.8 [\#81](https://github.com/hifis-net/ansible-role-keepalived/pull/81) ([Normo](https://github.com/Normo)) 27 | - Bump ansible from 8.5.0 to 9.0.1 [\#80](https://github.com/hifis-net/ansible-role-keepalived/pull/80) ([dependabot[bot]](https://github.com/apps/dependabot)) 28 | - chore: add github changelog generator config [\#79](https://github.com/hifis-net/ansible-role-keepalived/pull/79) ([Normo](https://github.com/Normo)) 29 | - Add CODEOWNERS file [\#78](https://github.com/hifis-net/ansible-role-keepalived/pull/78) ([Normo](https://github.com/Normo)) 30 | - Add CITATION.cff [\#76](https://github.com/hifis-net/ansible-role-keepalived/pull/76) ([Normo](https://github.com/Normo)) 31 | - ci: make ci workflow working again [\#73](https://github.com/hifis-net/ansible-role-keepalived/pull/73) ([Normo](https://github.com/Normo)) 32 | - Bump ansible-lint from 6.8.4 to 6.8.6 [\#50](https://github.com/hifis-net/ansible-role-keepalived/pull/50) ([dependabot[bot]](https://github.com/apps/dependabot)) 33 | - Bump ansible-lint from 6.8.3 to 6.8.4 [\#48](https://github.com/hifis-net/ansible-role-keepalived/pull/48) ([dependabot[bot]](https://github.com/apps/dependabot)) 34 | - Bump ansible-lint from 6.8.2 to 6.8.3 [\#47](https://github.com/hifis-net/ansible-role-keepalived/pull/47) ([dependabot[bot]](https://github.com/apps/dependabot)) 35 | - Bump molecule from 4.0.2 to 4.0.3 [\#46](https://github.com/hifis-net/ansible-role-keepalived/pull/46) ([dependabot[bot]](https://github.com/apps/dependabot)) 36 | - Bump molecule from 4.0.1 to 4.0.2 [\#44](https://github.com/hifis-net/ansible-role-keepalived/pull/44) ([dependabot[bot]](https://github.com/apps/dependabot)) 37 | - Bump ansible-lint from 6.4.0 to 6.8.2 [\#43](https://github.com/hifis-net/ansible-role-keepalived/pull/43) ([dependabot[bot]](https://github.com/apps/dependabot)) 38 | - Bump ansible from 6.2.0 to 6.5.0 [\#42](https://github.com/hifis-net/ansible-role-keepalived/pull/42) ([dependabot[bot]](https://github.com/apps/dependabot)) 39 | - Bump molecule-podman from 2.0.2 to 2.0.3 [\#39](https://github.com/hifis-net/ansible-role-keepalived/pull/39) ([dependabot[bot]](https://github.com/apps/dependabot)) 40 | - Bump yamllint from 1.27.1 to 1.28.0 [\#34](https://github.com/hifis-net/ansible-role-keepalived/pull/34) ([dependabot[bot]](https://github.com/apps/dependabot)) 41 | - Add support for Ubuntu 22.04 [\#29](https://github.com/hifis-net/ansible-role-keepalived/pull/29) ([tobiashuste](https://github.com/tobiashuste)) 42 | - Use molecule-podman instead of molecule-docker [\#28](https://github.com/hifis-net/ansible-role-keepalived/pull/28) ([tobiashuste](https://github.com/tobiashuste)) 43 | - Bump ansible from 5.7.1 to 6.2.0 [\#25](https://github.com/hifis-net/ansible-role-keepalived/pull/25) ([dependabot[bot]](https://github.com/apps/dependabot)) 44 | - Bump ansible-lint from 6.0.2 to 6.4.0 [\#24](https://github.com/hifis-net/ansible-role-keepalived/pull/24) ([dependabot[bot]](https://github.com/apps/dependabot)) 45 | - Bump molecule from 3.6.1 to 4.0.1 [\#23](https://github.com/hifis-net/ansible-role-keepalived/pull/23) ([dependabot[bot]](https://github.com/apps/dependabot)) 46 | - Bump yamllint from 1.26.3 to 1.27.1 [\#21](https://github.com/hifis-net/ansible-role-keepalived/pull/21) ([dependabot[bot]](https://github.com/apps/dependabot)) 47 | - Bump robertdebock/galaxy-action from 1.2.0 to 1.2.1 [\#15](https://github.com/hifis-net/ansible-role-keepalived/pull/15) ([dependabot[bot]](https://github.com/apps/dependabot)) 48 | - Bump reuse from 0.14.0 to 1.0.0 [\#14](https://github.com/hifis-net/ansible-role-keepalived/pull/14) ([dependabot[bot]](https://github.com/apps/dependabot)) 49 | - Bump ansible from 5.6.0 to 5.7.1 [\#9](https://github.com/hifis-net/ansible-role-keepalived/pull/9) ([dependabot[bot]](https://github.com/apps/dependabot)) 50 | - Add badges to README [\#7](https://github.com/hifis-net/ansible-role-keepalived/pull/7) ([tobiashuste](https://github.com/tobiashuste)) 51 | - Bump ansible-lint from 5.4.0 to 6.0.2 [\#5](https://github.com/hifis-net/ansible-role-keepalived/pull/5) ([dependabot[bot]](https://github.com/apps/dependabot)) 52 | - Bump ansible from 5.4.0 to 5.6.0 [\#3](https://github.com/hifis-net/ansible-role-keepalived/pull/3) ([dependabot[bot]](https://github.com/apps/dependabot)) 53 | - Implement CI pipeline via GitHub Actions [\#1](https://github.com/hifis-net/ansible-role-keepalived/pull/1) ([tobiashuste](https://github.com/tobiashuste)) 54 | 55 | ### Fixed 56 | 57 | - Fix failing CI pipeline 58 | ([!57](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/57) 59 | by [tobiashuste](https://gitlab.com/tobiashuste)). 60 | 61 | ### Changed 62 | 63 | - Install Keepalived 2.2.7 by default 64 | ([!58](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/58) 65 | by [christian.hueser.hzdr](https://gitlab.com/christian.hueser.hzdr)). 66 | 67 | ## [1.1.1](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v1.1.1) - 2021-07-08 68 | 69 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v1.1.0...v1.1.1) 70 | 71 | ### Fixed 72 | 73 | - Fix failing built of Keepalived from source with module make in initial dry-runs 74 | ([!55](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/55) 75 | by [christian.hueser.hzdr](https://gitlab.com/christian.hueser.hzdr)). 76 | 77 | ## [1.1.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v1.1.0) - 2021-06-28 78 | 79 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v1.0.0...v1.1.0) 80 | 81 | ### Added 82 | 83 | - Automate Ansible Galaxy role import 84 | ([!50](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/50) 85 | by [Normo](https://gitlab.com/Normo)). 86 | 87 | ### Changed 88 | 89 | - Bump keepalived from 2.2.1 to 2.2.2 90 | ([!53](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/53) 91 | by [Normo](https://gitlab.com/Normo)). 92 | - Use FQDN for Ansible modules 93 | ([!52](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/52) 94 | by [Normo](https://gitlab.com/Normo)). 95 | - Make a dry-run part of molecule default scenario 96 | ([!49](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/49) 97 | by [Normo](https://gitlab.com/Normo)). 98 | 99 | ## [1.0.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v1.0.0) - 2021-01-26 100 | 101 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.5.0...v1.0.0) 102 | 103 | ### Added 104 | 105 | - Add keepalived config verification task 106 | ([!42](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/42) 107 | by [Normo](https://gitlab.com/Normo)). 108 | 109 | ### Changed 110 | 111 | - Resolve "Refactor file path variables" 112 | ([!35](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/35) 113 | by [Normo](https://gitlab.com/Normo)). 114 | - Set keepalived 2.2.1 as default version 115 | ([!37](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/37) 116 | by [Normo](https://gitlab.com/Normo)). 117 | - Remove keepalived user and group 118 | ([!39](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/39) 119 | by [Normo](https://gitlab.com/Normo)). 120 | - Update role meta information 121 | ([!38](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/38) 122 | by [Normo](https://gitlab.com/Normo)). 123 | - Rename default branch to 'main' 124 | ([!41](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/41) 125 | by [Normo](https://gitlab.com/Normo)). 126 | - Update virtual env packages 127 | ([!43](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/43) 128 | by [Normo](https://gitlab.com/Normo)). 129 | - Add variable to configure `max_auto_priority` 130 | ([!44](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/44) 131 | by [Normo](https://gitlab.com/Normo)). 132 | 133 | ## [0.5.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.5.0) - 2021-01-21 134 | 135 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.4.0...v0.5.0) 136 | 137 | ### Upgrade notes 138 | 139 | The keepalived executable has been moved from the build directory 140 | `/usr/local/src/keepalived-x.y.z/sbin/keepalived` to 141 | `/usr/local/sbin/keepalived`. Due to this fact, the build directory of the 142 | previous version is not removed during an upgrade. This needs to be done 143 | manually. 144 | 145 | ### Changed 146 | 147 | - Put sysconfig file into config directory 148 | ([!12](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/12) 149 | by [christian.hueser.hzdr](https://gitlab.com/christian.hueser.hzdr)) 150 | - Simplify systemd config reload 151 | ([!30](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/30) 152 | by [Normo](https://gitlab.com/Normo)). 153 | - Use a temporary directory as build directory 154 | ([!34](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/34) 155 | by [Normo](https://gitlab.com/Normo)). 156 | 157 | ### Fixed 158 | 159 | - Resolve "Upgrading Keepalived executable does not work as expected due to 160 | wrong path variables" 161 | ([!32](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/32) 162 | by [christian.hueser.hzdr](https://gitlab.com/christian.hueser.hzdr)). 163 | 164 | ## [0.4.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.4.0) - 2020-11-11 165 | 166 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.3.0...v0.4.0) 167 | 168 | ### Added 169 | 170 | - Enable check-mode 171 | ([!27](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/27) 172 | by [Normo](https://gitlab.com/Normo)). 173 | 174 | ## [0.3.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.3.0) - 2020-09-25 175 | 176 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.2.1...v0.3.0) 177 | 178 | ### Changed 179 | 180 | - Enable keepalived process tracking 181 | ([!19](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/19) 182 | by [tobiashuste](https://gitlab.com/tobiashuste)). 183 | - Make CI jobs interruptible to support auto-cancellation 184 | ([!21](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/21) 185 | by [tobiashuste](https://gitlab.com/tobiashuste)). 186 | - Cache pipenv dependencies in .gitlab-ci.yml 187 | ([!22](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/22) 188 | by [tobiashuste](https://gitlab.com/tobiashuste)) 189 | 190 | ### Fixed 191 | 192 | - Fix runtime directory not being available after reboot 193 | ([!20](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/20) 194 | by [tobiashuste](https://gitlab.com/tobiashuste)). 195 | 196 | ## [0.2.1](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.2.1) - 2020-08-20 197 | 198 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.2.0...v0.2.1) 199 | 200 | ### Fixed 201 | 202 | - Fix mandatory variables check for `keepalived_virtual_ipaddress_configs` 203 | ([!17](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/17) 204 | by [tobiashuste](https://gitlab.com/tobiashuste)). 205 | 206 | ## [0.2.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.2.0) - 2020-08-18 207 | 208 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.1.0...v0.2.0) 209 | 210 | ### Added 211 | 212 | - Optionally allow to specify multiple virtual IP addresses 213 | ([!16](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/16) 214 | by [tobiashuste](https://gitlab.com/tobiashuste)). 215 | 216 | ## [0.1.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.1.0) - 2020-08-14 217 | 218 | ### Added 219 | 220 | Initial release of the Ansible Keepalived Role. 221 | 222 | 223 | \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* 224 | -------------------------------------------------------------------------------- /CHANGELOG.md.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2023 Helmholtz Centre for Environmental Research (UFZ) 2 | SPDX-FileCopyrightText: 2023 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | 4 | SPDX-License-Identifier: Apache-2.0 5 | -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2023 Helmholtz-Zentrum Dresden - Rossendorf (HZDR) 3 | 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | cff-version: '1.2.0' 7 | title: 'hifis.keepalived Ansible role' 8 | message: >- 9 | "If you use this Ansible role, please cite it as 10 | below." 11 | abstract: 'Ansible role to set up Keepalived.' 12 | type: 'software' 13 | authors: 14 | - given-names: 'Norman' 15 | family-names: 'Ziegner' 16 | email: 'norman.ziegner@ufz.de' 17 | affiliation: >- 18 | Helmholtz Centre for Environmental Research 19 | GmbH - UFZ 20 | orcid: 'https://orcid.org/0000-0001-7579-216X' 21 | - given-names: 'Tobias' 22 | family-names: 'Huste' 23 | email: 't.huste@hzdr.de' 24 | affiliation: >- 25 | Helmholtz-Zentrum Dresden-Rossendorf e. V. 26 | (HZDR) 27 | orcid: 'https://orcid.org/0000-0002-5590-7473' 28 | - given-names: 'Christian' 29 | family-names: 'Hüser' 30 | email: 'c.hueser@hzdr.de' 31 | affiliation: >- 32 | Helmholtz-Zentrum Dresden-Rossendorf e. V. 33 | (HZDR) 34 | orcid: 'https://orcid.org/0000-0002-5028-6663' 35 | repository-code: 'https://github.com/hifis-net/ansible-role-keepalived' 36 | repository-artifact: 'https://galaxy.ansible.com/hifis/keepalived' 37 | version: 'v1.2.0' 38 | date-released: '2023-12-13' 39 | -------------------------------------------------------------------------------- /HISTORY.md: -------------------------------------------------------------------------------- 1 | ### Fixed 2 | 3 | - Fix failing CI pipeline 4 | ([!57](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/57) 5 | by [tobiashuste](https://gitlab.com/tobiashuste)). 6 | 7 | ### Changed 8 | 9 | - Install Keepalived 2.2.7 by default 10 | ([!58](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/58) 11 | by [christian.hueser.hzdr](https://gitlab.com/christian.hueser.hzdr)). 12 | 13 | ## [1.1.1](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v1.1.1) - 2021-07-08 14 | 15 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v1.1.0...v1.1.1) 16 | 17 | ### Fixed 18 | 19 | - Fix failing built of Keepalived from source with module make in initial dry-runs 20 | ([!55](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/55) 21 | by [christian.hueser.hzdr](https://gitlab.com/christian.hueser.hzdr)). 22 | 23 | ## [1.1.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v1.1.0) - 2021-06-28 24 | 25 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v1.0.0...v1.1.0) 26 | 27 | ### Added 28 | 29 | - Automate Ansible Galaxy role import 30 | ([!50](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/50) 31 | by [Normo](https://gitlab.com/Normo)). 32 | 33 | ### Changed 34 | 35 | - Bump keepalived from 2.2.1 to 2.2.2 36 | ([!53](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/53) 37 | by [Normo](https://gitlab.com/Normo)). 38 | - Use FQDN for Ansible modules 39 | ([!52](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/52) 40 | by [Normo](https://gitlab.com/Normo)). 41 | - Make a dry-run part of molecule default scenario 42 | ([!49](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/49) 43 | by [Normo](https://gitlab.com/Normo)). 44 | 45 | ## [1.0.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v1.0.0) - 2021-01-26 46 | 47 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.5.0...v1.0.0) 48 | 49 | ### Added 50 | 51 | - Add keepalived config verification task 52 | ([!42](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/42) 53 | by [Normo](https://gitlab.com/Normo)). 54 | 55 | ### Changed 56 | 57 | - Resolve "Refactor file path variables" 58 | ([!35](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/35) 59 | by [Normo](https://gitlab.com/Normo)). 60 | - Set keepalived 2.2.1 as default version 61 | ([!37](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/37) 62 | by [Normo](https://gitlab.com/Normo)). 63 | - Remove keepalived user and group 64 | ([!39](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/39) 65 | by [Normo](https://gitlab.com/Normo)). 66 | - Update role meta information 67 | ([!38](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/38) 68 | by [Normo](https://gitlab.com/Normo)). 69 | - Rename default branch to 'main' 70 | ([!41](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/41) 71 | by [Normo](https://gitlab.com/Normo)). 72 | - Update virtual env packages 73 | ([!43](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/43) 74 | by [Normo](https://gitlab.com/Normo)). 75 | - Add variable to configure `max_auto_priority` 76 | ([!44](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/44) 77 | by [Normo](https://gitlab.com/Normo)). 78 | 79 | ## [0.5.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.5.0) - 2021-01-21 80 | 81 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.4.0...v0.5.0) 82 | 83 | ### Upgrade notes 84 | 85 | The keepalived executable has been moved from the build directory 86 | `/usr/local/src/keepalived-x.y.z/sbin/keepalived` to 87 | `/usr/local/sbin/keepalived`. Due to this fact, the build directory of the 88 | previous version is not removed during an upgrade. This needs to be done 89 | manually. 90 | 91 | ### Changed 92 | 93 | - Put sysconfig file into config directory 94 | ([!12](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/12) 95 | by [christian.hueser.hzdr](https://gitlab.com/christian.hueser.hzdr)) 96 | - Simplify systemd config reload 97 | ([!30](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/30) 98 | by [Normo](https://gitlab.com/Normo)). 99 | - Use a temporary directory as build directory 100 | ([!34](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/34) 101 | by [Normo](https://gitlab.com/Normo)). 102 | 103 | ### Fixed 104 | 105 | - Resolve "Upgrading Keepalived executable does not work as expected due to 106 | wrong path variables" 107 | ([!32](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/32) 108 | by [christian.hueser.hzdr](https://gitlab.com/christian.hueser.hzdr)). 109 | 110 | ## [0.4.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.4.0) - 2020-11-11 111 | 112 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.3.0...v0.4.0) 113 | 114 | ### Added 115 | 116 | - Enable check-mode 117 | ([!27](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/27) 118 | by [Normo](https://gitlab.com/Normo)). 119 | 120 | ## [0.3.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.3.0) - 2020-09-25 121 | 122 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.2.1...v0.3.0) 123 | 124 | ### Changed 125 | 126 | - Enable keepalived process tracking 127 | ([!19](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/19) 128 | by [tobiashuste](https://gitlab.com/tobiashuste)). 129 | - Make CI jobs interruptible to support auto-cancellation 130 | ([!21](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/21) 131 | by [tobiashuste](https://gitlab.com/tobiashuste)). 132 | - Cache pipenv dependencies in .gitlab-ci.yml 133 | ([!22](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/22) 134 | by [tobiashuste](https://gitlab.com/tobiashuste)) 135 | 136 | ### Fixed 137 | 138 | - Fix runtime directory not being available after reboot 139 | ([!20](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/20) 140 | by [tobiashuste](https://gitlab.com/tobiashuste)). 141 | 142 | ## [0.2.1](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.2.1) - 2020-08-20 143 | 144 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.2.0...v0.2.1) 145 | 146 | ### Fixed 147 | 148 | - Fix mandatory variables check for `keepalived_virtual_ipaddress_configs` 149 | ([!17](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/17) 150 | by [tobiashuste](https://gitlab.com/tobiashuste)). 151 | 152 | ## [0.2.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.2.0) - 2020-08-18 153 | 154 | [List of commits](https://gitlab.com/hifis/ansible/keepalived-role/-/compare/v0.1.0...v0.2.0) 155 | 156 | ### Added 157 | 158 | - Optionally allow to specify multiple virtual IP addresses 159 | ([!16](https://gitlab.com/hifis/ansible/keepalived-role/-/merge_requests/16) 160 | by [tobiashuste](https://gitlab.com/tobiashuste)). 161 | 162 | ## [0.1.0](https://gitlab.com/hifis/ansible/keepalived-role/-/releases/v0.1.0) - 2020-08-14 163 | 164 | ### Added 165 | 166 | Initial release of the Ansible Keepalived Role. 167 | -------------------------------------------------------------------------------- /HISTORY.md.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2023 Helmholtz Centre for Environmental Research (UFZ) 2 | SPDX-FileCopyrightText: 2023 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | 4 | SPDX-License-Identifier: Apache-2.0 5 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # License Hint 2 | 3 | Copyright © 2020 Helmholtz Centre for Environmental Research (UFZ) 4 | Copyright © 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 5 | 6 | This work is licensed under the [Apache-2.0](LICENSES/Apache-2.0.txt) license. 7 | 8 | Please see the individual files for more accurate information. 9 | 10 | > **Hint:** We provided the copyright and license information in accordance to the [REUSE Specification 3.0](https://reuse.software/spec/). 11 | -------------------------------------------------------------------------------- /LICENSES/Apache-2.0.txt: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | [[source]] 7 | name = "pypi" 8 | url = "https://pypi.org/simple" 9 | verify_ssl = true 10 | 11 | [dev-packages] 12 | yamllint = "~=1.35.1" 13 | ansible-lint = "~=24.2.0" 14 | molecule = "~=24.2.0" 15 | molecule-plugins = {extras = ["podman"], version = "~=23.5.3"} 16 | reuse = "~=3.0.1" 17 | 18 | [packages] 19 | ansible = "~=9.2.0" 20 | 21 | [requires] 22 | python_version = "3.11" 23 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "8aff77810bf153f507676b3974f2b26014b83e8799a8710daaaafad2dcb1ba7a" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.11" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "ansible": { 20 | "hashes": [ 21 | "sha256:39b19c252800aeed531413a626ccd07473b79615a3cea77568a1624c1aefaf7c", 22 | "sha256:a207a4a00a45e5cd178a7f94ca42afe26f23c9d27be49901ea8c45d18a07b7c6" 23 | ], 24 | "index": "pypi", 25 | "markers": "python_version >= '3.10'", 26 | "version": "==9.2.0" 27 | }, 28 | "ansible-core": { 29 | "hashes": [ 30 | "sha256:50c9f33a5b2ee645470a77f4bf99cf35d1ffdefef60388910020b0c58534bec1", 31 | "sha256:76a8765a8586064ef073a299562e308fa2c180a75b5f7569bbd0f61d4171cdb3" 32 | ], 33 | "markers": "python_version >= '3.10'", 34 | "version": "==2.16.3" 35 | }, 36 | "cffi": { 37 | "hashes": [ 38 | "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", 39 | "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", 40 | "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", 41 | "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", 42 | "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", 43 | "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", 44 | "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", 45 | "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", 46 | "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", 47 | "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", 48 | "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", 49 | "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", 50 | "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", 51 | "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", 52 | "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", 53 | "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", 54 | "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", 55 | "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", 56 | "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", 57 | "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", 58 | "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", 59 | "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", 60 | "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", 61 | "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", 62 | "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", 63 | "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", 64 | "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", 65 | "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", 66 | "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", 67 | "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", 68 | "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", 69 | "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", 70 | "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", 71 | "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", 72 | "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", 73 | "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", 74 | "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", 75 | "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", 76 | "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", 77 | "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", 78 | "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", 79 | "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", 80 | "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", 81 | "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", 82 | "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", 83 | "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", 84 | "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", 85 | "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", 86 | "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", 87 | "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", 88 | "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", 89 | "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" 90 | ], 91 | "markers": "platform_python_implementation != 'PyPy'", 92 | "version": "==1.16.0" 93 | }, 94 | "cryptography": { 95 | "hashes": [ 96 | "sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380", 97 | "sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589", 98 | "sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea", 99 | "sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65", 100 | "sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a", 101 | "sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3", 102 | "sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008", 103 | "sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1", 104 | "sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2", 105 | "sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635", 106 | "sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2", 107 | "sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90", 108 | "sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee", 109 | "sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a", 110 | "sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242", 111 | "sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12", 112 | "sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2", 113 | "sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d", 114 | "sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be", 115 | "sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee", 116 | "sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6", 117 | "sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529", 118 | "sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929", 119 | "sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1", 120 | "sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6", 121 | "sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a", 122 | "sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446", 123 | "sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9", 124 | "sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888", 125 | "sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4", 126 | "sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33", 127 | "sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f" 128 | ], 129 | "markers": "python_version >= '3.7'", 130 | "version": "==42.0.2" 131 | }, 132 | "jinja2": { 133 | "hashes": [ 134 | "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", 135 | "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" 136 | ], 137 | "markers": "python_version >= '3.7'", 138 | "version": "==3.1.3" 139 | }, 140 | "markupsafe": { 141 | "hashes": [ 142 | "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69", 143 | "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0", 144 | "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d", 145 | "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec", 146 | "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5", 147 | "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411", 148 | "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3", 149 | "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74", 150 | "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0", 151 | "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949", 152 | "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d", 153 | "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279", 154 | "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f", 155 | "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6", 156 | "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc", 157 | "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e", 158 | "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954", 159 | "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656", 160 | "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc", 161 | "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518", 162 | "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56", 163 | "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc", 164 | "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa", 165 | "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565", 166 | "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4", 167 | "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb", 168 | "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250", 169 | "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4", 170 | "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959", 171 | "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc", 172 | "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474", 173 | "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863", 174 | "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8", 175 | "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f", 176 | "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2", 177 | "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e", 178 | "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e", 179 | "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb", 180 | "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f", 181 | "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a", 182 | "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26", 183 | "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d", 184 | "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2", 185 | "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131", 186 | "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789", 187 | "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6", 188 | "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a", 189 | "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858", 190 | "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e", 191 | "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb", 192 | "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e", 193 | "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84", 194 | "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7", 195 | "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea", 196 | "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b", 197 | "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6", 198 | "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475", 199 | "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74", 200 | "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a", 201 | "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00" 202 | ], 203 | "markers": "python_version >= '3.7'", 204 | "version": "==2.1.4" 205 | }, 206 | "packaging": { 207 | "hashes": [ 208 | "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", 209 | "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" 210 | ], 211 | "markers": "python_version >= '3.7'", 212 | "version": "==23.2" 213 | }, 214 | "pycparser": { 215 | "hashes": [ 216 | "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", 217 | "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" 218 | ], 219 | "version": "==2.21" 220 | }, 221 | "pyyaml": { 222 | "hashes": [ 223 | "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", 224 | "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", 225 | "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", 226 | "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", 227 | "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", 228 | "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", 229 | "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", 230 | "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", 231 | "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", 232 | "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", 233 | "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", 234 | "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", 235 | "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", 236 | "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", 237 | "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", 238 | "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", 239 | "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", 240 | "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", 241 | "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", 242 | "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", 243 | "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", 244 | "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", 245 | "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", 246 | "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", 247 | "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", 248 | "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", 249 | "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", 250 | "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", 251 | "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", 252 | "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", 253 | "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", 254 | "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", 255 | "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", 256 | "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", 257 | "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", 258 | "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", 259 | "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", 260 | "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", 261 | "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", 262 | "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", 263 | "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", 264 | "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", 265 | "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", 266 | "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", 267 | "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", 268 | "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", 269 | "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", 270 | "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", 271 | "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", 272 | "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", 273 | "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" 274 | ], 275 | "markers": "python_version >= '3.6'", 276 | "version": "==6.0.1" 277 | }, 278 | "resolvelib": { 279 | "hashes": [ 280 | "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309", 281 | "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf" 282 | ], 283 | "version": "==1.0.1" 284 | } 285 | }, 286 | "develop": { 287 | "ansible-compat": { 288 | "hashes": [ 289 | "sha256:74a91807808a39af48ab6595811b9340d1458db26b138362f48bf39292190705", 290 | "sha256:b3e9f9d7c3a1ce6222de444e9dc6fece7eba70ac64f2a0befdc4e2d542018b4a" 291 | ], 292 | "markers": "python_version >= '3.9'", 293 | "version": "==4.1.11" 294 | }, 295 | "ansible-core": { 296 | "hashes": [ 297 | "sha256:50c9f33a5b2ee645470a77f4bf99cf35d1ffdefef60388910020b0c58534bec1", 298 | "sha256:76a8765a8586064ef073a299562e308fa2c180a75b5f7569bbd0f61d4171cdb3" 299 | ], 300 | "markers": "python_version >= '3.10'", 301 | "version": "==2.16.3" 302 | }, 303 | "ansible-lint": { 304 | "hashes": [ 305 | "sha256:6bc5d6273f33711ec6d370dfe5fdbe97a64b4c36c2a7a19a249401326eb03616", 306 | "sha256:755f369c6baf601b09c4931a4e6bd0df3d79c54eb519f093e5db6ab52ad03e0c" 307 | ], 308 | "index": "pypi", 309 | "markers": "python_version >= '3.10'", 310 | "version": "==24.2.0" 311 | }, 312 | "attrs": { 313 | "hashes": [ 314 | "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", 315 | "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" 316 | ], 317 | "markers": "python_version >= '3.7'", 318 | "version": "==23.2.0" 319 | }, 320 | "binaryornot": { 321 | "hashes": [ 322 | "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", 323 | "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" 324 | ], 325 | "version": "==0.4.4" 326 | }, 327 | "black": { 328 | "hashes": [ 329 | "sha256:0269dfdea12442022e88043d2910429bed717b2d04523867a85dacce535916b8", 330 | "sha256:07204d078e25327aad9ed2c64790d681238686bce254c910de640c7cc4fc3aa6", 331 | "sha256:08b34e85170d368c37ca7bf81cf67ac863c9d1963b2c1780c39102187ec8dd62", 332 | "sha256:1a95915c98d6e32ca43809d46d932e2abc5f1f7d582ffbe65a5b4d1588af7445", 333 | "sha256:2588021038bd5ada078de606f2a804cadd0a3cc6a79cb3e9bb3a8bf581325a4c", 334 | "sha256:2fa6a0e965779c8f2afb286f9ef798df770ba2b6cee063c650b96adec22c056a", 335 | "sha256:34afe9da5056aa123b8bfda1664bfe6fb4e9c6f311d8e4a6eb089da9a9173bf9", 336 | "sha256:3897ae5a21ca132efa219c029cce5e6bfc9c3d34ed7e892113d199c0b1b444a2", 337 | "sha256:40657e1b78212d582a0edecafef133cf1dd02e6677f539b669db4746150d38f6", 338 | "sha256:48b5760dcbfe5cf97fd4fba23946681f3a81514c6ab8a45b50da67ac8fbc6c7b", 339 | "sha256:5242ecd9e990aeb995b6d03dc3b2d112d4a78f2083e5a8e86d566340ae80fec4", 340 | "sha256:5cdc2e2195212208fbcae579b931407c1fa9997584f0a415421748aeafff1168", 341 | "sha256:5d7b06ea8816cbd4becfe5f70accae953c53c0e53aa98730ceccb0395520ee5d", 342 | "sha256:7258c27115c1e3b5de9ac6c4f9957e3ee2c02c0b39222a24dc7aa03ba0e986f5", 343 | "sha256:854c06fb86fd854140f37fb24dbf10621f5dab9e3b0c29a690ba595e3d543024", 344 | "sha256:a21725862d0e855ae05da1dd25e3825ed712eaaccef6b03017fe0853a01aa45e", 345 | "sha256:a83fe522d9698d8f9a101b860b1ee154c1d25f8a82ceb807d319f085b2627c5b", 346 | "sha256:b3d64db762eae4a5ce04b6e3dd745dcca0fb9560eb931a5be97472e38652a161", 347 | "sha256:e298d588744efda02379521a19639ebcd314fba7a49be22136204d7ed1782717", 348 | "sha256:e2c8dfa14677f90d976f68e0c923947ae68fa3961d61ee30976c388adc0b02c8", 349 | "sha256:ecba2a15dfb2d97105be74bbfe5128bc5e9fa8477d8c46766505c1dda5883aac", 350 | "sha256:fc1ec9aa6f4d98d022101e015261c056ddebe3da6a8ccfc2c792cbe0349d48b7" 351 | ], 352 | "markers": "python_version >= '3.8'", 353 | "version": "==24.1.1" 354 | }, 355 | "boolean.py": { 356 | "hashes": [ 357 | "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4", 358 | "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd" 359 | ], 360 | "version": "==4.0" 361 | }, 362 | "bracex": { 363 | "hashes": [ 364 | "sha256:a27eaf1df42cf561fed58b7a8f3fdf129d1ea16a81e1fadd1d17989bc6384beb", 365 | "sha256:efdc71eff95eaff5e0f8cfebe7d01adf2c8637c8c92edaf63ef348c241a82418" 366 | ], 367 | "markers": "python_version >= '3.8'", 368 | "version": "==2.4" 369 | }, 370 | "certifi": { 371 | "hashes": [ 372 | "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", 373 | "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" 374 | ], 375 | "markers": "python_version >= '3.6'", 376 | "version": "==2023.11.17" 377 | }, 378 | "cffi": { 379 | "hashes": [ 380 | "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", 381 | "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", 382 | "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", 383 | "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", 384 | "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", 385 | "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", 386 | "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", 387 | "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", 388 | "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", 389 | "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", 390 | "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", 391 | "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", 392 | "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", 393 | "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", 394 | "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", 395 | "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", 396 | "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", 397 | "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", 398 | "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", 399 | "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", 400 | "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", 401 | "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", 402 | "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", 403 | "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", 404 | "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", 405 | "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", 406 | "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", 407 | "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", 408 | "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", 409 | "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", 410 | "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", 411 | "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", 412 | "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", 413 | "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", 414 | "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", 415 | "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", 416 | "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", 417 | "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", 418 | "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", 419 | "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", 420 | "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", 421 | "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", 422 | "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", 423 | "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", 424 | "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", 425 | "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", 426 | "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", 427 | "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", 428 | "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", 429 | "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", 430 | "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", 431 | "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" 432 | ], 433 | "markers": "platform_python_implementation != 'PyPy'", 434 | "version": "==1.16.0" 435 | }, 436 | "chardet": { 437 | "hashes": [ 438 | "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", 439 | "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" 440 | ], 441 | "markers": "python_version >= '3.7'", 442 | "version": "==5.2.0" 443 | }, 444 | "charset-normalizer": { 445 | "hashes": [ 446 | "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", 447 | "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", 448 | "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", 449 | "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", 450 | "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", 451 | "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", 452 | "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", 453 | "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", 454 | "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", 455 | "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", 456 | "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", 457 | "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", 458 | "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", 459 | "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", 460 | "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", 461 | "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", 462 | "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", 463 | "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", 464 | "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", 465 | "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", 466 | "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", 467 | "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", 468 | "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", 469 | "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", 470 | "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", 471 | "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", 472 | "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", 473 | "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", 474 | "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", 475 | "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", 476 | "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", 477 | "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", 478 | "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", 479 | "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", 480 | "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", 481 | "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", 482 | "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", 483 | "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", 484 | "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", 485 | "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", 486 | "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", 487 | "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", 488 | "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", 489 | "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", 490 | "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", 491 | "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", 492 | "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", 493 | "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", 494 | "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", 495 | "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", 496 | "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", 497 | "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", 498 | "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", 499 | "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", 500 | "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", 501 | "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", 502 | "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", 503 | "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", 504 | "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", 505 | "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", 506 | "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", 507 | "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", 508 | "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", 509 | "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", 510 | "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", 511 | "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", 512 | "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", 513 | "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", 514 | "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", 515 | "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", 516 | "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", 517 | "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", 518 | "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", 519 | "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", 520 | "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", 521 | "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", 522 | "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", 523 | "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", 524 | "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", 525 | "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", 526 | "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", 527 | "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", 528 | "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", 529 | "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", 530 | "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", 531 | "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", 532 | "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", 533 | "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", 534 | "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", 535 | "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" 536 | ], 537 | "markers": "python_full_version >= '3.7.0'", 538 | "version": "==3.3.2" 539 | }, 540 | "click": { 541 | "hashes": [ 542 | "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", 543 | "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" 544 | ], 545 | "markers": "python_version >= '3.7'", 546 | "version": "==8.1.7" 547 | }, 548 | "click-help-colors": { 549 | "hashes": [ 550 | "sha256:b33c5803eeaeb084393b1ab5899dc5476c7196b87a18713045afe76f840b42db", 551 | "sha256:f4cabe52cf550299b8888f4f2ee4c5f359ac27e33bcfe4d61db47785a5cc936c" 552 | ], 553 | "version": "==0.9.4" 554 | }, 555 | "cryptography": { 556 | "hashes": [ 557 | "sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380", 558 | "sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589", 559 | "sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea", 560 | "sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65", 561 | "sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a", 562 | "sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3", 563 | "sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008", 564 | "sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1", 565 | "sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2", 566 | "sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635", 567 | "sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2", 568 | "sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90", 569 | "sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee", 570 | "sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a", 571 | "sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242", 572 | "sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12", 573 | "sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2", 574 | "sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d", 575 | "sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be", 576 | "sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee", 577 | "sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6", 578 | "sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529", 579 | "sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929", 580 | "sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1", 581 | "sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6", 582 | "sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a", 583 | "sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446", 584 | "sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9", 585 | "sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888", 586 | "sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4", 587 | "sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33", 588 | "sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f" 589 | ], 590 | "markers": "python_version >= '3.7'", 591 | "version": "==42.0.2" 592 | }, 593 | "enrich": { 594 | "hashes": [ 595 | "sha256:0a2ab0d2931dff8947012602d1234d2a3ee002d9a355b5d70be6bf5466008893", 596 | "sha256:f29b2c8c124b4dbd7c975ab5c3568f6c7a47938ea3b7d2106c8a3bd346545e4f" 597 | ], 598 | "markers": "python_version >= '3.6'", 599 | "version": "==1.2.7" 600 | }, 601 | "filelock": { 602 | "hashes": [ 603 | "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e", 604 | "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c" 605 | ], 606 | "markers": "python_version >= '3.8'", 607 | "version": "==3.13.1" 608 | }, 609 | "idna": { 610 | "hashes": [ 611 | "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", 612 | "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" 613 | ], 614 | "markers": "python_version >= '3.5'", 615 | "version": "==3.6" 616 | }, 617 | "jinja2": { 618 | "hashes": [ 619 | "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", 620 | "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" 621 | ], 622 | "markers": "python_version >= '3.7'", 623 | "version": "==3.1.3" 624 | }, 625 | "jsonschema": { 626 | "hashes": [ 627 | "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f", 628 | "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5" 629 | ], 630 | "markers": "python_version >= '3.8'", 631 | "version": "==4.21.1" 632 | }, 633 | "jsonschema-specifications": { 634 | "hashes": [ 635 | "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc", 636 | "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c" 637 | ], 638 | "markers": "python_version >= '3.8'", 639 | "version": "==2023.12.1" 640 | }, 641 | "license-expression": { 642 | "hashes": [ 643 | "sha256:1a7dc2bb2d09cdc983d072e4f9adc787e107e09def84cbb3919baaaf4f8e6fa1", 644 | "sha256:599928edd995c43fc335e0af342076144dc71cb858afa1ed9c1c30c4e81794f5" 645 | ], 646 | "markers": "python_version >= '3.7'", 647 | "version": "==30.2.0" 648 | }, 649 | "markdown-it-py": { 650 | "hashes": [ 651 | "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", 652 | "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" 653 | ], 654 | "markers": "python_version >= '3.8'", 655 | "version": "==3.0.0" 656 | }, 657 | "markupsafe": { 658 | "hashes": [ 659 | "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", 660 | "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", 661 | "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", 662 | "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", 663 | "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", 664 | "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", 665 | "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", 666 | "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", 667 | "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", 668 | "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", 669 | "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", 670 | "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", 671 | "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", 672 | "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", 673 | "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", 674 | "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", 675 | "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", 676 | "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", 677 | "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", 678 | "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", 679 | "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", 680 | "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", 681 | "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", 682 | "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", 683 | "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", 684 | "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", 685 | "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", 686 | "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", 687 | "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", 688 | "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", 689 | "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", 690 | "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", 691 | "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", 692 | "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", 693 | "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", 694 | "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", 695 | "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", 696 | "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", 697 | "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", 698 | "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", 699 | "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", 700 | "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", 701 | "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", 702 | "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", 703 | "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", 704 | "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", 705 | "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", 706 | "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", 707 | "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", 708 | "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", 709 | "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", 710 | "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", 711 | "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", 712 | "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", 713 | "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", 714 | "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", 715 | "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", 716 | "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", 717 | "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", 718 | "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" 719 | ], 720 | "markers": "python_version >= '3.7'", 721 | "version": "==2.1.5" 722 | }, 723 | "mdurl": { 724 | "hashes": [ 725 | "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", 726 | "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" 727 | ], 728 | "markers": "python_version >= '3.7'", 729 | "version": "==0.1.2" 730 | }, 731 | "molecule": { 732 | "hashes": [ 733 | "sha256:47c982a7d05db7846da77fe7159deb946f26cafb2e388fc71812be0089a41776", 734 | "sha256:eac7d9bf12d2bf5254e13a46a40357615c32e7003409f305c3940e93b65d7bea" 735 | ], 736 | "index": "pypi", 737 | "markers": "python_version >= '3.10'", 738 | "version": "==24.2.0" 739 | }, 740 | "molecule-plugins": { 741 | "extras": [ 742 | "podman" 743 | ], 744 | "hashes": [ 745 | "sha256:87f8ac8d5e9fe1cbdfb784d92b1fd08e7cb11bf02a9391bb34dcb93fadf7a3fc", 746 | "sha256:a2b1437d532d736e3fbc6db7a69ec533e2334b2115ff9245a0b2772ed9738d23" 747 | ], 748 | "index": "pypi", 749 | "markers": "python_version >= '3.9'", 750 | "version": "==23.5.3" 751 | }, 752 | "mypy-extensions": { 753 | "hashes": [ 754 | "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", 755 | "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" 756 | ], 757 | "markers": "python_version >= '3.5'", 758 | "version": "==1.0.0" 759 | }, 760 | "packaging": { 761 | "hashes": [ 762 | "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", 763 | "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" 764 | ], 765 | "markers": "python_version >= '3.7'", 766 | "version": "==23.2" 767 | }, 768 | "pathspec": { 769 | "hashes": [ 770 | "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", 771 | "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" 772 | ], 773 | "markers": "python_version >= '3.8'", 774 | "version": "==0.12.1" 775 | }, 776 | "platformdirs": { 777 | "hashes": [ 778 | "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", 779 | "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" 780 | ], 781 | "markers": "python_version >= '3.8'", 782 | "version": "==4.2.0" 783 | }, 784 | "pluggy": { 785 | "hashes": [ 786 | "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", 787 | "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" 788 | ], 789 | "markers": "python_version >= '3.8'", 790 | "version": "==1.4.0" 791 | }, 792 | "pycparser": { 793 | "hashes": [ 794 | "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", 795 | "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" 796 | ], 797 | "version": "==2.21" 798 | }, 799 | "pygments": { 800 | "hashes": [ 801 | "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", 802 | "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" 803 | ], 804 | "markers": "python_version >= '3.7'", 805 | "version": "==2.17.2" 806 | }, 807 | "python-debian": { 808 | "hashes": [ 809 | "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f", 810 | "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c", 811 | "sha256:bb943755de23ae448102f334ae74417085a7fe1c6d673d8e5608e67d13c9109f" 812 | ], 813 | "markers": "python_version >= '3.5'", 814 | "version": "==0.1.49" 815 | }, 816 | "pyyaml": { 817 | "hashes": [ 818 | "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", 819 | "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", 820 | "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", 821 | "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", 822 | "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", 823 | "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", 824 | "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", 825 | "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", 826 | "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", 827 | "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", 828 | "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", 829 | "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", 830 | "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", 831 | "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", 832 | "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", 833 | "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", 834 | "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", 835 | "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", 836 | "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", 837 | "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", 838 | "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", 839 | "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", 840 | "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", 841 | "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", 842 | "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", 843 | "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", 844 | "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", 845 | "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", 846 | "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", 847 | "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", 848 | "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", 849 | "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", 850 | "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", 851 | "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", 852 | "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", 853 | "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", 854 | "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", 855 | "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", 856 | "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", 857 | "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", 858 | "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", 859 | "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", 860 | "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", 861 | "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", 862 | "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", 863 | "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", 864 | "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", 865 | "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", 866 | "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", 867 | "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", 868 | "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" 869 | ], 870 | "markers": "python_version >= '3.6'", 871 | "version": "==6.0.1" 872 | }, 873 | "referencing": { 874 | "hashes": [ 875 | "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5", 876 | "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7" 877 | ], 878 | "markers": "python_version >= '3.8'", 879 | "version": "==0.33.0" 880 | }, 881 | "requests": { 882 | "hashes": [ 883 | "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", 884 | "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" 885 | ], 886 | "markers": "python_version >= '3.7'", 887 | "version": "==2.31.0" 888 | }, 889 | "resolvelib": { 890 | "hashes": [ 891 | "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309", 892 | "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf" 893 | ], 894 | "version": "==1.0.1" 895 | }, 896 | "reuse": { 897 | "hashes": [ 898 | "sha256:2f13d9f31268e566e715fffe97299a002376477fada7ccd3d05a1458310cbf98", 899 | "sha256:590ce429ad964c515ed5e18b1f755d9b6cf027943d940d472d107e64ede70a6f" 900 | ], 901 | "index": "pypi", 902 | "markers": "python_version >= '3.8' and python_version < '4.0'", 903 | "version": "==3.0.1" 904 | }, 905 | "rich": { 906 | "hashes": [ 907 | "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa", 908 | "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235" 909 | ], 910 | "markers": "python_full_version >= '3.7.0'", 911 | "version": "==13.7.0" 912 | }, 913 | "rpds-py": { 914 | "hashes": [ 915 | "sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147", 916 | "sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7", 917 | "sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2", 918 | "sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68", 919 | "sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1", 920 | "sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382", 921 | "sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d", 922 | "sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921", 923 | "sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38", 924 | "sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4", 925 | "sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a", 926 | "sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d", 927 | "sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518", 928 | "sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e", 929 | "sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d", 930 | "sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf", 931 | "sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5", 932 | "sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba", 933 | "sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6", 934 | "sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59", 935 | "sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253", 936 | "sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6", 937 | "sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f", 938 | "sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3", 939 | "sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea", 940 | "sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1", 941 | "sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76", 942 | "sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93", 943 | "sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad", 944 | "sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad", 945 | "sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc", 946 | "sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049", 947 | "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d", 948 | "sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90", 949 | "sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d", 950 | "sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd", 951 | "sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25", 952 | "sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2", 953 | "sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f", 954 | "sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6", 955 | "sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4", 956 | "sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c", 957 | "sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8", 958 | "sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d", 959 | "sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b", 960 | "sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19", 961 | "sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453", 962 | "sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9", 963 | "sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde", 964 | "sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296", 965 | "sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58", 966 | "sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec", 967 | "sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99", 968 | "sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a", 969 | "sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb", 970 | "sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383", 971 | "sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d", 972 | "sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896", 973 | "sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc", 974 | "sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6", 975 | "sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b", 976 | "sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7", 977 | "sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22", 978 | "sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf", 979 | "sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394", 980 | "sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0", 981 | "sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57", 982 | "sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74", 983 | "sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83", 984 | "sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29", 985 | "sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9", 986 | "sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f", 987 | "sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745", 988 | "sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb", 989 | "sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811", 990 | "sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55", 991 | "sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342", 992 | "sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23", 993 | "sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82", 994 | "sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041", 995 | "sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb", 996 | "sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066", 997 | "sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55", 998 | "sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6", 999 | "sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a", 1000 | "sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140", 1001 | "sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b", 1002 | "sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9", 1003 | "sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256", 1004 | "sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c", 1005 | "sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772", 1006 | "sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4", 1007 | "sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae", 1008 | "sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920", 1009 | "sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a", 1010 | "sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b", 1011 | "sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361", 1012 | "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8", 1013 | "sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a" 1014 | ], 1015 | "markers": "python_version >= '3.8'", 1016 | "version": "==0.17.1" 1017 | }, 1018 | "ruamel.yaml": { 1019 | "hashes": [ 1020 | "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636", 1021 | "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b" 1022 | ], 1023 | "markers": "python_version >= '3.7'", 1024 | "version": "==0.18.6" 1025 | }, 1026 | "ruamel.yaml.clib": { 1027 | "hashes": [ 1028 | "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", 1029 | "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", 1030 | "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", 1031 | "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", 1032 | "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", 1033 | "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", 1034 | "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", 1035 | "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", 1036 | "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", 1037 | "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", 1038 | "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", 1039 | "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", 1040 | "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", 1041 | "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", 1042 | "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", 1043 | "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", 1044 | "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", 1045 | "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", 1046 | "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", 1047 | "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", 1048 | "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", 1049 | "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", 1050 | "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", 1051 | "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", 1052 | "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", 1053 | "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", 1054 | "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", 1055 | "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", 1056 | "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", 1057 | "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", 1058 | "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", 1059 | "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", 1060 | "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", 1061 | "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", 1062 | "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", 1063 | "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", 1064 | "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", 1065 | "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", 1066 | "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", 1067 | "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", 1068 | "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", 1069 | "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", 1070 | "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", 1071 | "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", 1072 | "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", 1073 | "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", 1074 | "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", 1075 | "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", 1076 | "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", 1077 | "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" 1078 | ], 1079 | "markers": "python_version < '3.13' and platform_python_implementation == 'CPython'", 1080 | "version": "==0.2.8" 1081 | }, 1082 | "subprocess-tee": { 1083 | "hashes": [ 1084 | "sha256:b3c124993f8b88d1eb1c2fde0bc2069787eac720ba88771cba17e8c93324825d", 1085 | "sha256:eca56973a1c1237093c2055b2731bcaab784683b83f22c76f26e4c5763402e28" 1086 | ], 1087 | "markers": "python_version >= '3.8'", 1088 | "version": "==0.4.1" 1089 | }, 1090 | "tomli": { 1091 | "hashes": [ 1092 | "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", 1093 | "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" 1094 | ], 1095 | "markers": "python_version < '3.11'", 1096 | "version": "==2.0.1" 1097 | }, 1098 | "typing-extensions": { 1099 | "hashes": [ 1100 | "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", 1101 | "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" 1102 | ], 1103 | "markers": "python_version < '3.11'", 1104 | "version": "==4.8.0" 1105 | }, 1106 | "urllib3": { 1107 | "hashes": [ 1108 | "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", 1109 | "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54" 1110 | ], 1111 | "markers": "python_version >= '3.8'", 1112 | "version": "==2.1.0" 1113 | }, 1114 | "wcmatch": { 1115 | "hashes": [ 1116 | "sha256:14554e409b142edeefab901dc68ad570b30a72a8ab9a79106c5d5e9a6d241bd5", 1117 | "sha256:86c17572d0f75cbf3bcb1a18f3bf2f9e72b39a9c08c9b4a74e991e1882a8efb3" 1118 | ], 1119 | "markers": "python_version >= '3.8'", 1120 | "version": "==8.5" 1121 | }, 1122 | "yamllint": { 1123 | "hashes": [ 1124 | "sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3", 1125 | "sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd" 1126 | ], 1127 | "index": "pypi", 1128 | "markers": "python_version >= '3.8'", 1129 | "version": "==1.35.1" 1130 | } 1131 | } 1132 | } 1133 | -------------------------------------------------------------------------------- /Pipfile.lock.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | 4 | SPDX-License-Identifier: Apache-2.0 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 7 | 8 | # Keepalived Role 9 | 10 | :warning: **This project is archived!** :warning: 11 | 12 | This role has been migrated to our `hifis.toolkit` collection: 13 | 14 | - 15 | - 16 | 17 | [![CI Status](https://github.com/hifis-net/ansible-role-keepalived/actions/workflows/ci.yml/badge.svg)](https://github.com/hifis-net/ansible-role-keepalived/actions/workflows/ci.yml) 18 | [![Ansible Role: hifis.keepalived](https://img.shields.io/badge/role-hifis.keepalived-blue)](https://galaxy.ansible.com/ui/standalone/roles/hifis/keepalived/) 19 | [![Ansible Role Downloads](https://img.shields.io/ansible/role/d/hifis/keepalived)](https://galaxy.ansible.com/ui/standalone/roles/hifis/keepalived/) 20 | [![Apache-2.0 Licensed](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/hifis-net/ansible-role-keepalived/blob/main/LICENSES/Apache-2.0.txt) 21 | [![Latest release](https://img.shields.io/github/v/release/hifis-net/ansible-role-keepalived)](https://github.com/hifis-net/ansible-role-keepalived/releases) 22 | 23 | Ansible role to set up Keepalived in a high availability and scalability context. 24 | 25 | Currently [supported platforms](meta/main.yml) are: 26 | 27 | - Ubuntu 22.04 LTS 28 | - Ubuntu 20.04 LTS 29 | 30 | ## Requirements 31 | 32 | None. 33 | 34 | ## Role Variables 35 | 36 | ### Required variables which are not set by default 37 | 38 | #### Keepalived instance unicast peer IP addresses 39 | 40 | Set the unicast peer IP addresses of the Keepalived instance: 41 | 42 | ```yaml 43 | keepalived_unicast_peers: 44 | - '192.168.33.15' 45 | - '192.168.33.16' 46 | ``` 47 | 48 | #### Keepalived instance virtual IP address 49 | 50 | Set the virtual IP address of the Keepalived instance: 51 | 52 | ```yaml 53 | keepalived_virtual_ip_address: '192.168.33.100' 54 | ``` 55 | 56 | #### Optional: List of virtual IP address configs 57 | 58 | If you need to configure multiple virtual IP addresses you can define this 59 | optional variable. This takes precedence over `keepalived_virtual_ip_address`. 60 | 61 | ```yaml 62 | keepalived_virtual_ipaddress_configs: 63 | - "10.0.10.15 dev eth0" 64 | - "10.0.11.15 dev eht1" 65 | ``` 66 | 67 | ### All other Default Variables 68 | 69 | #### Keepalived version 70 | 71 | Variable to pin the Keepalived version to a certain value: 72 | 73 | ```yaml 74 | keepalived_version: '2.2.8' 75 | ``` 76 | 77 | #### List of dependencies of Keepalived 78 | 79 | List of Keepalived dependencies to be installed: 80 | 81 | ```yaml 82 | keepalived_dependencies: 83 | - 'build-essential' 84 | - 'curl' 85 | - 'gcc' 86 | - 'libssl-dev' 87 | - 'libnl-3-dev' 88 | - 'libnl-genl-3-dev' 89 | - 'libsnmp-dev' 90 | ``` 91 | 92 | #### Keepalived executable path 93 | 94 | Path to the Keepalived executable: 95 | 96 | ```yaml 97 | keepalived_executable_path: '/usr/local/sbin/keepalived' 98 | ``` 99 | 100 | #### Keepalived Download URL 101 | 102 | URL from which Keepalived can be downloaded: 103 | 104 | ```yaml 105 | keepalived_download_url: 'https://www.keepalived.org/software/keepalived-{{ keepalived_version }}.tar.gz' 106 | ``` 107 | 108 | #### Keepalived configuration file template name 109 | 110 | Name of the template file for Keepalived configuration file 111 | 112 | ```yaml 113 | keepalived_conf_template: 'keepalived.conf.j2' 114 | ``` 115 | 116 | #### Keepalived configuration directory 117 | 118 | Directory which contains Keepalived configuration files: 119 | 120 | ```yaml 121 | keepalived_conf_dir: '/etc/keepalived' 122 | ``` 123 | 124 | #### Keepalived configuration file path 125 | 126 | Path to Keepalived configuration file: 127 | 128 | ```yaml 129 | keepalived_conf_file_path: '/etc/keepalived/keepalived.conf' 130 | ``` 131 | 132 | #### Keepalived sysconfig file path 133 | 134 | Path to Keepalived sysconfig file: 135 | 136 | ```yaml 137 | keepalived_sysconfig_file_path: "/etc/keepalived/keepalived.sysconfig" 138 | ``` 139 | 140 | #### Systemd service template file name 141 | 142 | Name of the template file for Systemd service: 143 | 144 | ```yaml 145 | keepalived_service_template: 'keepalived.service.j2' 146 | ``` 147 | 148 | #### Keepalived service file path 149 | 150 | Path to Keepalived service file: 151 | 152 | ```yaml 153 | keepalived_service_file_path: '/etc/systemd/system/keepalived.service' 154 | ``` 155 | 156 | #### Keepalived PID file path 157 | 158 | Path to the Keepalived PID file: 159 | 160 | ```yaml 161 | keepalived_pid_file_path: "/run/keepalived/keepalived.pid" 162 | ``` 163 | 164 | #### Configure notification email address 165 | 166 | Configure recipient of notification emails: 167 | 168 | ```yaml 169 | keepalived_notification_email: 'name@localhost' 170 | ``` 171 | 172 | #### Configure notification sender 173 | 174 | Configure sender of notification emails: 175 | 176 | ```yaml 177 | keepalived_notification_email_from: 'keepalived@localhost' 178 | ``` 179 | 180 | #### Configure SMTP Server 181 | 182 | Configure IP address or FQDN of SMTP server: 183 | 184 | ```yaml 185 | keepalived_smtp_server: '127.0.0.1' 186 | ``` 187 | 188 | #### Keepalived instance state MASTER or BACKUP 189 | 190 | Set the state of the Keepalived instance to MASTER or BACKUP: 191 | 192 | ```yaml 193 | keepalived_state: 'BACKUP' 194 | ``` 195 | 196 | #### Keepalived instance priority 197 | 198 | Set the priority of the Keepalived instance: 199 | 200 | ```yaml 201 | keepalived_priority: '99' 202 | ``` 203 | 204 | #### Keepalived maximum increased automatic priority 205 | 206 | Maximum priority to which Keepalived can automatically increase (must be in 207 | range [0, 99] or -1 to disable): 208 | ```yaml 209 | keepalived_max_auto_priority: '99' 210 | ``` 211 | 212 | #### Keepalived instance router ID 213 | 214 | Set unique name of the Keepalived router: 215 | 216 | ```yaml 217 | keepalived_router_id: 'KEEPALIVED_2' 218 | ``` 219 | 220 | #### Keepalived instance weight 221 | 222 | Adjust the priority by this weight: 223 | 224 | ```yaml 225 | keepalived_weight: '0' 226 | ``` 227 | 228 | #### Keepalived instance unicast source IP address 229 | 230 | Set the unicast source IP address of the Keepalived instance: 231 | 232 | ```yaml 233 | keepalived_unicast_src_ip: '{{ ansible_default_ipv4.address }}' 234 | ``` 235 | 236 | #### Keepalived instance network interface 237 | 238 | Set network interface to which the floating IP address is associated: 239 | 240 | ```yaml 241 | keepalived_interface: "{{ ansible_default_ipv4.interface }}" 242 | ``` 243 | 244 | #### Keepalived instance virtual IP address and network interface 245 | 246 | Set the virtual IP address and network interface of the Keepalived instance: 247 | 248 | ```yaml 249 | keepalived_virtual_ipaddress_config: "{{ keepalived_virtual_ip_address }} dev {{ keepalived_interface }}" 250 | ``` 251 | 252 | #### Keepalived instance authentication password 253 | 254 | Set the authentication password of the Keepalived instance: 255 | 256 | ```yaml 257 | keepalived_auth_pass: 'changeme' 258 | ``` 259 | 260 | #### Enable script security 261 | 262 | Flag to enable script security to prevent script to run by root user 263 | if any part of the path is writable by a non-root user: 264 | 265 | ```yaml 266 | keepalived_set_script_security_flag: true 267 | ``` 268 | 269 | #### User for executing Keepalived script 270 | 271 | Specify username to run Keepalived script under: 272 | 273 | ```yaml 274 | keepalived_script_user: 'haproxy' 275 | ``` 276 | 277 | #### Group for executing Keepalived script 278 | 279 | Specify groupname to run Keepalived script under: 280 | 281 | ```yaml 282 | keepalived_script_group: 'haproxy' 283 | ``` 284 | 285 | #### Flag to activate process tracking 286 | 287 | Activate process tracking in keepalived config: 288 | 289 | ```yaml 290 | keepalived_enable_process_tracking: true 291 | ``` 292 | 293 | #### Define which process shall be tracked 294 | 295 | ```yaml 296 | keepalived_track_process: 'haproxy' 297 | ``` 298 | 299 | #### Flag to activate a script to be executed 300 | 301 | Activate script that is executed by Keepalived: 302 | 303 | ```yaml 304 | keepalived_activate_script: false 305 | ``` 306 | 307 | #### Name of the script to be executed 308 | 309 | Specify the script name to be executed by Keepalived: 310 | 311 | ```yaml 312 | keepalived_script_name: 'chk_haproxy_process' 313 | ``` 314 | 315 | #### Command of the script to be executed 316 | 317 | Specify the command to be executed by Keepalived: 318 | 319 | ```yaml 320 | keepalived_script_command: '/usr/bin/killall -0 haproxy' 321 | ``` 322 | 323 | ## Dependencies 324 | 325 | None. 326 | 327 | Note: This role is intended for use with, but not limited to, the 328 | [hifis.haproxy](https://gitlab.com/hifis/ansible/haproxy-role) role. 329 | 330 | ## Example Playbook 331 | 332 | 333 | ```yaml 334 | - hosts: loadbalancers 335 | roles: 336 | - role: hifis.keepalived 337 | vars: 338 | keepalived_virtual_ip_address: '192.168.33.100' 339 | keepalived_unicast_peers: 340 | - '192.168.33.15' 341 | - '192.168.33.16' 342 | ``` 343 | 344 | ## License 345 | 346 | [Apache-2.0](LICENSES/Apache-2.0.txt) 347 | 348 | ## Author Information 349 | 350 | [HIFIS Software Services Team](https://software.hifis.net) 351 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | 1.2.0 7 | -------------------------------------------------------------------------------- /defaults/main.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | # Keepalived version 8 | keepalived_version: '2.2.8' 9 | # URL from which Keepalived can be downloaded 10 | keepalived_download_url: "https://www.keepalived.org/software/keepalived-{{ keepalived_version }}.tar.gz" 11 | # List of dependencies of Keepalived 12 | keepalived_dependencies: 13 | - 'build-essential' 14 | - 'curl' 15 | - 'gcc' 16 | - 'libssl-dev' 17 | - 'libnl-3-dev' 18 | - 'libnl-genl-3-dev' 19 | - 'libsnmp-dev' 20 | 21 | # Path to Keepalived executable 22 | keepalived_executable_path: "/usr/local/sbin/keepalived" 23 | 24 | # Name of the template file for Keepalived configuration file 25 | keepalived_conf_template: 'keepalived.conf.j2' 26 | 27 | # Folder for configuration files 28 | keepalived_conf_dir: '/etc/keepalived' 29 | 30 | # Path to Keepalived configuration file 31 | keepalived_conf_file_path: "{{ keepalived_conf_dir }}/keepalived.conf" 32 | 33 | # Path to Keepalived sysconfig file 34 | keepalived_sysconfig_file_path: "{{ keepalived_conf_dir }}/keepalived.sysconfig" 35 | 36 | # Name of the template file for Systemd service 37 | keepalived_service_template: 'keepalived.service.j2' 38 | 39 | # Path to Keepalived service file 40 | keepalived_service_file_path: "/etc/systemd/system/keepalived.service" 41 | 42 | # Directory for Keepalived PID file 43 | keepalived_pid_file_path: "/run/keepalived/keepalived.pid" 44 | 45 | 46 | # Configure notification email address 47 | keepalived_notification_email: 'name@localhost' 48 | # Configure notification sender 49 | keepalived_notification_email_from: 'keepalived@localhost' 50 | # Configure SMTP Server 51 | keepalived_smtp_server: '127.0.0.1' 52 | # Keepalived instance authentication password 53 | keepalived_auth_pass: 'changeme' 54 | # Keepalived instance virtual router ID 55 | keepalived_virtual_router_id: '51' 56 | # Keepalived instance priority 57 | keepalived_priority: "{{ '100' if keepalived_state == 'MASTER' else '99' }}" 58 | # Keepalived instance state MASTER or BACKUP 59 | keepalived_state: 'MASTER' 60 | # Keepalived instance network interface 61 | keepalived_interface: "{{ ansible_default_ipv4.interface }}" 62 | # Keepalived instance virtual IP address and network interface 63 | keepalived_virtual_ipaddress_config: "{{ keepalived_virtual_ip_address }} dev {{ keepalived_interface }}" 64 | # Keepalived instance unicast source IP address 65 | keepalived_unicast_src_ip: '{{ ansible_default_ipv4.address }}' 66 | 67 | # Enable process tracking 68 | keepalived_enable_process_tracking: true 69 | # Define which process shall be tracked 70 | keepalived_track_process: 'haproxy' 71 | 72 | # Flag to activate a script to be executed 73 | keepalived_activate_script: false 74 | # User for executing Keepalived script 75 | keepalived_script_user: 'haproxy' 76 | # Group for executing Keepalived script 77 | keepalived_script_group: 'haproxy' 78 | # Name of the script to be executed 79 | keepalived_script_name: 'chk_haproxy_process' 80 | # Command of the script to be executed 81 | keepalived_script_command: '/usr/bin/killall -0 haproxy' 82 | # Enable script security 83 | keepalived_set_script_security_flag: true 84 | 85 | ... 86 | -------------------------------------------------------------------------------- /files/.gitkeep: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | -------------------------------------------------------------------------------- /handlers/main.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | - name: Restart Keepalived 8 | become: yes 9 | ansible.builtin.service: 10 | name: keepalived 11 | state: restarted 12 | daemon_reload: yes 13 | when: not initial_dry_run 14 | 15 | - name: Reload Keepalived 16 | become: yes 17 | ansible.builtin.service: 18 | name: keepalived 19 | state: reloaded 20 | daemon_reload: yes 21 | when: not initial_dry_run 22 | 23 | ... 24 | -------------------------------------------------------------------------------- /meta/main.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | galaxy_info: 8 | role_name: keepalived 9 | namespace: hifis 10 | author: HIFIS Software Team 11 | description: A role to set up Keepalived in a high availability and scalability context. 12 | company: Helmholtz Association 13 | 14 | issue_tracker_url: https://gitlab.com/hifis/ansible/keepalived-role/-/issues 15 | 16 | license: Apache-2.0 17 | min_ansible_version: "2.10" 18 | 19 | platforms: 20 | - name: Ubuntu 21 | versions: 22 | - focal 23 | - jammy 24 | 25 | galaxy_tags: 26 | - keepalived 27 | - vrrp 28 | - networking 29 | 30 | dependencies: [] 31 | 32 | ... 33 | -------------------------------------------------------------------------------- /molecule/default/converge.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | # Play to create and provision instance. 8 | - name: Converge 9 | hosts: all 10 | tasks: 11 | - name: "Include keepalived_role" 12 | ansible.builtin.include_role: 13 | name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" 14 | vars: 15 | keepalived_unicast_peers: 16 | - '172.17.0.3' 17 | - '172.17.0.4' 18 | keepalived_virtual_ip_address: "172.17.0.20" 19 | 20 | 21 | ... 22 | -------------------------------------------------------------------------------- /molecule/default/molecule.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | dependency: 8 | name: galaxy 9 | driver: 10 | name: podman 11 | platforms: 12 | - name: instancekeepalived 13 | image: ${MOLECULE_IMAGE:-ghcr.io/hifis-net/ubuntu-systemd:22.04} 14 | pre_build_image: true 15 | privileged: true 16 | systemd: always 17 | tty: true 18 | override_command: false 19 | provisioner: 20 | name: ansible 21 | config_options: 22 | defaults: 23 | stdout_callback: "yaml" 24 | playbooks: 25 | prepare: prepare.yml 26 | check: converge.yml 27 | converge: converge.yml 28 | verify: verify.yml 29 | verifier: 30 | name: ansible 31 | scenario: 32 | name: default 33 | test_sequence: 34 | - destroy 35 | - dependency 36 | - syntax 37 | - create 38 | - prepare 39 | - check 40 | - converge 41 | - idempotence 42 | - check 43 | - side_effect 44 | - verify 45 | - destroy 46 | 47 | ... 48 | -------------------------------------------------------------------------------- /molecule/default/prepare.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | # Play to install dependencies. 8 | - name: Prepare 9 | hosts: all 10 | tasks: 11 | - name: Install dependencies 12 | ansible.builtin.apt: 13 | name: 14 | - sudo # for `become` privilege escalation 15 | - iproute2 # for gathering network facts 16 | - psmisc # provides `killall` command 17 | state: present 18 | update_cache: yes 19 | 20 | ... 21 | -------------------------------------------------------------------------------- /molecule/default/verify.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | - name: Verify Keepalived 8 | hosts: all 9 | tasks: 10 | - name: Populate service facts. 11 | ansible.builtin.service_facts: 12 | register: services_state 13 | 14 | - name: Check that Keepalived is running on instance. 15 | ansible.builtin.assert: 16 | that: 17 | - services_state.ansible_facts.services['keepalived.service'].state is search("running") 18 | fail_msg: "Keepalived need to be running on instance." 19 | success_msg: "Keepalived is running on instance." 20 | 21 | ... 22 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /renovate.json.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | 4 | SPDX-License-Identifier: Apache-2.0 5 | -------------------------------------------------------------------------------- /tasks/main.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | - name: Deprecation notice. 8 | ansible.builtin.debug: 9 | msg: "DEPRECATION NOTICE: This role has been migrated to the hifis.toolkit collection (https://github.com/hifis-net/ansible-collection-toolkit)." 10 | 11 | - name: Check that all mandatory variables are defined. 12 | ansible.builtin.assert: 13 | that: 14 | - keepalived_unicast_peers is defined 15 | - keepalived_virtual_ip_address is defined or keepalived_virtual_ipaddress_configs is defined 16 | fail_msg: "Some mandatory variables are not set." 17 | success_msg: "All mandatory variables are set." 18 | 19 | - name: Install dependencies for Keepalived. 20 | become: yes 21 | ansible.builtin.package: 22 | name: "{{ keepalived_dependencies }}" 23 | state: present 24 | update_cache: yes 25 | 26 | - name: Create Keepalived Configuration Directory. 27 | become: yes 28 | ansible.builtin.file: 29 | path: "{{ keepalived_conf_dir }}" 30 | state: directory 31 | owner: root 32 | group: root 33 | mode: '0755' 34 | 35 | - name: Check whether Keepalived binary is installed. 36 | ansible.builtin.stat: 37 | path: "{{ keepalived_executable_path }}" 38 | register: keepalived_installed 39 | 40 | - name: Determine if this is an initial dry-run 41 | ansible.builtin.set_fact: 42 | initial_dry_run: "{{ ansible_check_mode and not keepalived_installed.stat.exists }}" 43 | 44 | - name: Get Keepalived version. 45 | ansible.builtin.command: 46 | cmd: "{{ keepalived_executable_path }} --version" 47 | register: keepalived_version_installed 48 | when: keepalived_installed.stat.exists 49 | changed_when: false 50 | check_mode: no 51 | 52 | - name: Put value of installed version into an Ansible fact. 53 | ansible.builtin.set_fact: 54 | installed_keepalived_version: "{{ keepalived_version_installed.stderr | regex_search('^Keepalived v(\\d+\\.\\d+\\.\\d+)', '\\1') | first }}" 55 | when: keepalived_installed.stat.exists 56 | 57 | - name: Output version strings of installed and to be installed Keepalived. 58 | ansible.builtin.debug: 59 | msg: "Installed version: {{ installed_keepalived_version }}, version to be installed: {{ keepalived_version }}." 60 | when: installed_keepalived_version is defined 61 | 62 | - name: Check if both version strings are equal. 63 | ansible.builtin.set_fact: 64 | is_keepalived_version_equal: "{{ installed_keepalived_version is version(keepalived_version, operator='==', strict=True) }}" 65 | when: keepalived_installed.stat.exists 66 | 67 | - name: Continue with installing Keepalived if Keepalived is not already installed or versions are not equal. 68 | when: not keepalived_installed.stat.exists or not is_keepalived_version_equal 69 | block: 70 | 71 | - name: Create temporary Keepalived build directory. 72 | become: yes 73 | ansible.builtin.tempfile: 74 | state: directory 75 | prefix: "keepalived-{{ keepalived_version }}_" 76 | register: tempdir 77 | check_mode: no 78 | 79 | - name: Store temporary build directory path 80 | ansible.builtin.set_fact: 81 | keepalived_build_dir: "{{ tempdir.path }}" 82 | 83 | - name: Download and extract keepalived archive. 84 | become: yes 85 | ansible.builtin.unarchive: 86 | src: "{{ keepalived_download_url }}" 87 | dest: "{{ keepalived_build_dir }}" 88 | remote_src: yes 89 | extra_opts: 90 | - "--strip-components=1" 91 | owner: root 92 | group: root 93 | mode: '0755' 94 | 95 | - name: Configure Keepalived to be build. 96 | become: yes 97 | ansible.builtin.command: "./configure" 98 | args: 99 | chdir: "{{ keepalived_build_dir }}" 100 | changed_when: true 101 | 102 | - name: Build Keepalived from source. 103 | become: yes 104 | community.general.make: 105 | chdir: "{{ keepalived_build_dir }}" 106 | when: not initial_dry_run 107 | 108 | - name: Install Keepalived binaries. 109 | become: yes 110 | community.general.make: 111 | chdir: "{{ keepalived_build_dir }}" 112 | target: install 113 | notify: Restart Keepalived 114 | when: not initial_dry_run 115 | 116 | - name: Copy Keepalived sysconfig file 117 | become: yes 118 | ansible.builtin.copy: 119 | src: "{{ keepalived_build_dir }}/keepalived/etc/sysconfig/keepalived" 120 | dest: "{{ keepalived_sysconfig_file_path }}" 121 | owner: root 122 | group: root 123 | mode: '0644' 124 | remote_src: yes 125 | when: not ansible_check_mode 126 | always: 127 | - name: Remove temporary build directory 128 | become: yes 129 | ansible.builtin.file: 130 | path: "{{ keepalived_build_dir }}" 131 | state: absent 132 | check_mode: no 133 | 134 | - name: Create Configuration File. 135 | become: yes 136 | ansible.builtin.template: 137 | src: "{{ keepalived_conf_template }}" 138 | dest: "{{ keepalived_conf_file_path }}" 139 | owner: root 140 | group: root 141 | mode: '0644' 142 | notify: Reload Keepalived 143 | 144 | - name: Verify Keepalived configuration. 145 | become: yes 146 | ansible.builtin.command: 147 | cmd: "{{ keepalived_executable_path | quote }} --config-test {{ keepalived_conf_file_path | quote }}" 148 | register: config_check 149 | changed_when: config_check.rc != 0 150 | 151 | - name: Create Keepalived Service Unit File. 152 | ansible.builtin.template: 153 | src: "{{ keepalived_service_template }}" 154 | dest: "{{ keepalived_service_file_path }}" 155 | owner: root 156 | group: root 157 | mode: '0644' 158 | notify: Restart Keepalived 159 | 160 | - name: Start Keepalived Systemd Service. 161 | become: yes 162 | ansible.builtin.service: 163 | name: keepalived 164 | state: started 165 | enabled: yes 166 | daemon_reload: yes 167 | when: not initial_dry_run 168 | 169 | ... 170 | -------------------------------------------------------------------------------- /templates/.gitkeep: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | -------------------------------------------------------------------------------- /templates/keepalived.conf.j2: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | global_defs { 7 | {% if keepalived_activate_script %} 8 | script_user {{ keepalived_script_user }} {{ keepalived_script_group }} 9 | {% endif %} 10 | {% if keepalived_set_script_security_flag %} 11 | enable_script_security 12 | {% endif %} 13 | notification_email { 14 | {{ keepalived_notification_email }} 15 | } 16 | notification_email_from {{ keepalived_notification_email_from }} 17 | smtp_server {{ keepalived_smtp_server }} 18 | smtp_connect_timeout 30 19 | {% if keepalived_router_id is defined %} 20 | router_id {{ keepalived_router_id }} 21 | {% endif %} 22 | {% if keepalived_max_auto_priority is defined %} 23 | max_auto_priority {{ keepalived_max_auto_priority }} 24 | {% endif %} 25 | } 26 | 27 | {% if keepalived_enable_process_tracking %} 28 | vrrp_track_process {{ keepalived_track_process }} { 29 | process {{ keepalived_track_process }} 30 | {% if keepalived_weight is defined %} 31 | weight {{ keepalived_weight }} 32 | {% endif %} 33 | quorum 1 34 | delay 2 35 | } 36 | {% endif %} 37 | 38 | {% if keepalived_activate_script %} 39 | vrrp_script {{ keepalived_script_name }} { 40 | script "{{ keepalived_script_command }}" 41 | interval 2 42 | {% if keepalived_weight is defined %} 43 | weight {{ keepalived_weight }} 44 | {% endif %} 45 | } 46 | {% endif %} 47 | 48 | vrrp_instance VI_1 { 49 | 50 | interface {{ keepalived_interface }} 51 | state {{ keepalived_state }} 52 | priority {{ keepalived_priority }} 53 | 54 | virtual_router_id {{ keepalived_virtual_router_id }} 55 | unicast_src_ip {{ keepalived_unicast_src_ip }} 56 | unicast_peer { 57 | {% for keepalived_unicast_peer in keepalived_unicast_peers %} 58 | {{ keepalived_unicast_peer }} 59 | {% endfor %} 60 | } 61 | 62 | virtual_ipaddress { 63 | {% if keepalived_virtual_ipaddress_configs is defined %} 64 | {% for config in keepalived_virtual_ipaddress_configs %} 65 | {{ config }} 66 | {% endfor %} 67 | {% else %} 68 | {{ keepalived_virtual_ipaddress_config }} 69 | {% endif %} 70 | } 71 | 72 | authentication { 73 | auth_type PASS 74 | auth_pass {{ keepalived_auth_pass }} 75 | } 76 | 77 | {% if keepalived_enable_process_tracking %} 78 | track_process { 79 | {{ keepalived_track_process }} 80 | } 81 | {% endif %} 82 | 83 | {% if keepalived_activate_script %} 84 | track_script { 85 | {{ keepalived_script_name }} 86 | } 87 | {% endif %} 88 | 89 | smtp_alert 90 | 91 | } 92 | -------------------------------------------------------------------------------- /templates/keepalived.service.j2: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | [Unit] 7 | Description=LVS and VRRP High Availability Monitor 8 | After=network-online.target syslog.target 9 | Wants=network-online.target 10 | 11 | [Service] 12 | Type=forking 13 | RuntimeDirectory=keepalived 14 | PIDFile={{ keepalived_pid_file_path }} 15 | KillMode=process 16 | EnvironmentFile=-{{ keepalived_sysconfig_file_path }} 17 | ExecStart={{ keepalived_executable_path }} -p {{ keepalived_pid_file_path }} $KEEPALIVED_OPTIONS 18 | ExecReload=/bin/kill -HUP $MAINPID 19 | 20 | [Install] 21 | WantedBy=multi-user.target 22 | -------------------------------------------------------------------------------- /vars/main.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Helmholtz Centre for Environmental Research (UFZ) 2 | # SPDX-FileCopyrightText: 2020 Helmholtz-Zentrum Dresden-Rossendorf (HZDR) 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | 6 | --- 7 | # vars file for keepalived_role --------------------------------------------------------------------------------