diff options
Diffstat (limited to 'ansible_collections/grafana')
104 files changed, 4455 insertions, 260 deletions
diff --git a/ansible_collections/grafana/grafana/.github/workflows/loki-molecule.yml b/ansible_collections/grafana/grafana/.github/workflows/loki-molecule.yml new file mode 100644 index 000000000..8d8da57ff --- /dev/null +++ b/ansible_collections/grafana/grafana/.github/workflows/loki-molecule.yml @@ -0,0 +1,44 @@ +--- +name: Loki Molecule + +on: + push: + branches: + - main + pull_request: + branches: + - main + +defaults: + run: + working-directory: roles/loki + +jobs: + molecule: + name: Molecule + runs-on: ubuntu-latest + strategy: + matrix: + distro: + - rockylinux9 + - ubuntu2204 + - debian12 + + steps: + - name: Check out the codebase. + uses: actions/checkout@v4 + + - name: Set up Python 3. + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install test dependencies. + run: pip3 install ansible molecule molecule-plugins[docker] docker + + - name: Run Molecule tests. + run: molecule test + env: + PY_COLORS: '1' + ANSIBLE_FORCE_COLOR: '1' + MOLECULE_DISTRO: ${{ matrix.distro }} diff --git a/ansible_collections/grafana/grafana/.github/workflows/mimir-molecule.yml b/ansible_collections/grafana/grafana/.github/workflows/mimir-molecule.yml new file mode 100644 index 000000000..b9d1a083d --- /dev/null +++ b/ansible_collections/grafana/grafana/.github/workflows/mimir-molecule.yml @@ -0,0 +1,51 @@ +--- +name: Mimir Molecule + +on: + push: + branches: + - main + pull_request: + branches: + - main + +defaults: + run: + working-directory: roles/mimir + +jobs: + molecule: + name: Molecule + runs-on: ubuntu-latest + strategy: + matrix: + distro: + - rockylinux9 + - rockylinux8 + - ubuntu2204 + - debian12 + + steps: + - name: Check out the codebase. + uses: actions/checkout@v4 + + - name: Set up Python 3. + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install test dependencies. + run: pip3 install molecule molecule-plugins[docker] docker pytest-testinfra jmespath selinux passlib + + - name: create docker network + run: docker network create molecule + + - name: Start s3 backend + run: docker run -d -p 9000:9000 -p 9001:9001 --name minio-mimir --network molecule -e "MINIO_ROOT_USER=testtest" -e "MINIO_ROOT_PASSWORD=testtest" -e "MINIO_DEFAULT_BUCKETS=mimir" bitnami/minio:latest + + - name: Run Molecule tests. + run: molecule test + env: + PY_COLORS: '1' + ANSIBLE_FORCE_COLOR: '1' + MOLECULE_DISTRO: ${{ matrix.distro }} diff --git a/ansible_collections/grafana/grafana/.github/workflows/promtail-molecule.yml b/ansible_collections/grafana/grafana/.github/workflows/promtail-molecule.yml new file mode 100644 index 000000000..e8168b454 --- /dev/null +++ b/ansible_collections/grafana/grafana/.github/workflows/promtail-molecule.yml @@ -0,0 +1,44 @@ +--- +name: Promtail Molecule + +on: + push: + branches: + - main + pull_request: + branches: + - main + +defaults: + run: + working-directory: roles/promtail + +jobs: + molecule: + name: Molecule + runs-on: ubuntu-latest + strategy: + matrix: + distro: + - rockylinux9 + - ubuntu2204 + - debian12 + + steps: + - name: Check out the codebase. + uses: actions/checkout@v4 + + - name: Set up Python 3. + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install test dependencies. + run: pip3 install ansible molecule molecule-plugins[docker] docker + + - name: Run Molecule tests. + run: molecule test + env: + PY_COLORS: '1' + ANSIBLE_FORCE_COLOR: '1' + MOLECULE_DISTRO: ${{ matrix.distro }} diff --git a/ansible_collections/grafana/grafana/.gitignore b/ansible_collections/grafana/grafana/.gitignore index fb34ac8df..9d1b5557d 100644 --- a/ansible_collections/grafana/grafana/.gitignore +++ b/ansible_collections/grafana/grafana/.gitignore @@ -5,6 +5,7 @@ .idea hosts *.log +yala # MacOS # --------------------------------------------------- diff --git a/ansible_collections/grafana/grafana/CHANGELOG.rst b/ansible_collections/grafana/grafana/CHANGELOG.rst index eabc0c278..e1d9762c8 100644 --- a/ansible_collections/grafana/grafana/CHANGELOG.rst +++ b/ansible_collections/grafana/grafana/CHANGELOG.rst @@ -4,6 +4,69 @@ Grafana.Grafana Release Notes .. contents:: Topics +v5.2.0 +====== + +Major Changes +------------- + +- Bump ansible-lint from 24.2.2 to 24.2.3 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/195 +- Add promtail role by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/197 +- Add a new config part to configure KeyCloak based auth by @he0s in https://github.com/grafana/grafana-ansible-collection/pull/191 + +v5.1.0 +====== + +Major Changes +------------- + +- fix: Uninstall Step for Loki and Mimir by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/193 + +v5.0.0 +====== + +Major Changes +------------- + +- Add Grafana Mimir role by @GVengelen in https://github.com/grafana/grafana-ansible-collection/pull/183 +- Add Grafana Loki role by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/188 + +v4.0.0 +====== + +Major Changes +------------- + +- Add an Ansible role for Grafana Alloy by @ishanjainn in https://github.com/grafana/grafana-ansible-collection/pull/169 + +Minor Changes +------------- + +- Bump ansible-lint from 24.2.0 to 24.2.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/164 +- Update description to match module by @brmurphy in https://github.com/grafana/grafana-ansible-collection/pull/179 +- Clarify grafana-server configuration in README by @VGerris in https://github.com/grafana/grafana-ansible-collection/pull/177 +- Bump ansible-lint from 24.2.0 to 24.2.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/168 +- Bump black from 24.1.1 to 24.3.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/165 +- fix: Apply correct uid + gid for imported dashboards by @hypery2k in https://github.com/grafana/grafana-ansible-collection/pull/167 + +v3.0.0 +====== + +Major Changes +------------- + +- Add an Ansible role for OpenTelemetry Collector by @ishanjainn in https://github.com/grafana/grafana-ansible-collection/pull/138 + +Minor Changes +------------- + +- Bump pylint from 3.0.3 to 3.1.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/158 +- Bump pylint from 3.0.3 to 3.1.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/161 +- Bump the pip group across 1 directories with 1 update by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/156 +- Bump yamllint from 1.33.0 to 1.35.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/155 +- Bump yamllint from 1.33.0 to 1.35.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/159 +- ExecStartPre and EnvironmentFile settings to system unit file by @fabiiw05 in https://github.com/grafana/grafana-ansible-collection/pull/157 +- datasources url parameter fix by @dergudzon in https://github.com/grafana/grafana-ansible-collection/pull/162 v2.2.5 ====== diff --git a/ansible_collections/grafana/grafana/CODEOWNERS b/ansible_collections/grafana/grafana/CODEOWNERS index 654eb1a6d..9be7737ac 100644 --- a/ansible_collections/grafana/grafana/CODEOWNERS +++ b/ansible_collections/grafana/grafana/CODEOWNERS @@ -1,3 +1,8 @@ -./ @ishanjainn -/roles/grafana @gardar @ishanjainn -/roles/grafana_agent @ishanjainn @v-zhuravlev +./ @ishanjainn +/roles/grafana @gardar @ishanjainn +/roles/grafana_agent @ishanjainn @v-zhuravlev @gardar +/roles/alloy @ishanjainn @v-zhuravlev @gardar +/roles/opentelemetry_collector @ishanjainn +/roles/loki @voidquark @ishanjainn +/roles/mimir @GVengelen @gardar @ishanjainn +/roles/promtail @voidquark @ishanjainn diff --git a/ansible_collections/grafana/grafana/FILES.json b/ansible_collections/grafana/grafana/FILES.json index caf8f3754..6e5f1ad3b 100644 --- a/ansible_collections/grafana/grafana/FILES.json +++ b/ansible_collections/grafana/grafana/FILES.json @@ -123,7 +123,7 @@ "name": "requirements.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "04fac92121706aa4e4940bb95d9fc7f508b729dadcd46afe13f54ec59a32e6c8", + "chksum_sha256": "a135d423a3b683d3448f933e0ac4981cb9b53413fe13962dcef9d3cc15af5c4a", "format": 1 }, { @@ -193,7 +193,7 @@ "name": "plugins/modules/cloud_plugin.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "34d3f84453ad0517b14a96720e2f644f5b3aaf7f8b094b83cc1bdf96e6715c50", + "chksum_sha256": "4e0a0050d5a9fb36a6d01678885786c1e15256bb31c95454d8c416823e616329", "format": 1 }, { @@ -214,7 +214,7 @@ "name": "CODEOWNERS", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "bb2590977547e3e484039e55ec54510f37ecfaaa116e84d0389745c40411b53c", + "chksum_sha256": "986e044c4d35ce128fa8a09215bf790e75dd25f30f65651e198dd03e1543a6f6", "format": 1 }, { @@ -491,6 +491,601 @@ "format": 1 }, { + "name": "roles/loki", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/loki/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/loki/vars/RedHat.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "571483e0efd8184068b5d00a99204389e56f71238ff854a09bdf15da8aa4e5eb", + "format": 1 + }, + { + "name": "roles/loki/vars/Debian.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9eb9c367012b2fbd64ea3143bec602b78874bd0af144986acfd16499e712bc2c", + "format": 1 + }, + { + "name": "roles/loki/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/loki/tasks/uninstall.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e2aa7831cf7a87e7e90da0f2917a9996da8709a9c72e78cee9aa5ba06745fed0", + "format": 1 + }, + { + "name": "roles/loki/tasks/deploy.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "89b7e39628bd3c0f4837b49f5537f122dd9b3dcb818e2b706611d4c08b1564db", + "format": 1 + }, + { + "name": "roles/loki/tasks/setup-Debian.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b9d4bc07b290530bf5e61ac0abb65480f6dd276d3495517515aa6f71d1d81797", + "format": 1 + }, + { + "name": "roles/loki/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "70ab2022eef36d69f436156bc4e3dcd99e8ac512840f82206e2c80e3d6789740", + "format": 1 + }, + { + "name": "roles/loki/tasks/setup-RedHat.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1fade302a0c20ed1a816a7138263f0f63188b4f57f8a7dc25f68e883649d59c9", + "format": 1 + }, + { + "name": "roles/loki/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/loki/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a9533d3d849adf6bb82558951ee09fed8c9476b12a18a75943e759a5dc8eb073", + "format": 1 + }, + { + "name": "roles/loki/README.md", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e96e01c9b79dd357ccee0e2afd72696795be591efc5c0a73990c2708e98956dd", + "format": 1 + }, + { + "name": "roles/loki/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/loki/defaults/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a291bd5f052e09b2af3d529f289bcfd5e9dd642bf1d79f7ea4f46711ecf09395", + "format": 1 + }, + { + "name": "roles/loki/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/loki/templates/rules.yml.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "524a654736d43d183f035daa7868594f428775a1aad7790fd970406ed44a7b64", + "format": 1 + }, + { + "name": "roles/loki/templates/config.yml.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "924a8ba896ae407b88cca46e193cd0a70b3ce1c6226782d4a96dafa8c07395f5", + "format": 1 + }, + { + "name": "roles/loki/molecule", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/loki/molecule/default", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/loki/molecule/default/molecule.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f2fb19d8e5973db9cd226780c4ecf9ae5947286626de40224c1228a6463b1114", + "format": 1 + }, + { + "name": "roles/loki/molecule/default/converge.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b95320fa1dc8f93e4033f5d71f9334aef2148629837022bac6364e3e27078cdb", + "format": 1 + }, + { + "name": "roles/loki/handlers", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/loki/handlers/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2e53e9a9e23870436798981a928f54258315a5be3de89b2fa15aa2ce29c379bb", + "format": 1 + }, + { + "name": "roles/opentelemetry_collector", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/tasks/configure.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "619bbe9568d9bfe491cc6cbd81482ae470f7a22d2b4360b14f1bf6d47184fa19", + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/tasks/service.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2bec7253fcd6133706e90c0a51197464d6f51f1a22db977f327bdf9b0d3c18cc", + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/tasks/install.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b7495233c70957ab9c9e55964545eac9825ef298b25391daeb72e2559992998a", + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bfcb34af928fe8e68f24db9957bc22baf9979b2c4402de34b93a19f8b06397e0", + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "de3d17460f2f7473558ee9747f18246f51a1603699c4925e51401c625ab59307", + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/README.md", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4dc3f6680b1ebe07bb9fa20ae4327746f3768e010078789d1aab807a72869510", + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/defaults/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d9dd74d1bb76f5536908d543ef9dfac40ab6afe33f6cfaa30b656b4f69b44d6f", + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/templates/otel_collector.service.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bb0d68adc92d851b3c6b5173b5c7896a83a4d005ff87b21aace45397378b39d2", + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/templates/otel_collector_config.yml.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "25bfc9deadd0a49a3fa1ce78f299ddc78219b60ca1be90693ed5a211c7f16ef3", + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/handlers", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/opentelemetry_collector/handlers/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3273a098e9e8605c20fe645e533c2a4f4609227340e601914e7119958652c6dd", + "format": 1 + }, + { + "name": "roles/mimir", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/vars/.gitkeep", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "roles/mimir/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/tasks/uninstall.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "5c5973ac49f202c081a633ccac9cec1cc183811ce49b9a36bbb78c7c9ba25566", + "format": 1 + }, + { + "name": "roles/mimir/tasks/deploy.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2f3ff4d136fdd91b02d9112b916b9d11289c9d0522657bb88b1df133dd3b5c09", + "format": 1 + }, + { + "name": "roles/mimir/tasks/setup-Debian.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eff282795fb43bda8db141d0ff6e9bf35e90ed703d51ba913cc445043cffe962", + "format": 1 + }, + { + "name": "roles/mimir/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "51bbda2ef2ae0c26150564b47eb70a6d26f6ec9d3dd3cb6f20d423bc6bc86663", + "format": 1 + }, + { + "name": "roles/mimir/tasks/setup-Redhat.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "03fcced9ddeccdffe4ddb3ed2f9d48fb857aa7b7273d5992fb8369a3c5213171", + "format": 1 + }, + { + "name": "roles/mimir/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "222aacd94d53179d52908ed830973bf2629f4a6e0e1d1ee49f159162dfee6fdd", + "format": 1 + }, + { + "name": "roles/mimir/README.md", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "396d5124b5915a5c3990e9fab2e1e5f0d931b5f4d9eac52579826ea18e1c38b7", + "format": 1 + }, + { + "name": "roles/mimir/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/defaults/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "92d2fb56874a19ffa7b52547f253231f9cc5ec90e2302ab5d4f6363b37119311", + "format": 1 + }, + { + "name": "roles/mimir/files", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/files/.gitkeep", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "roles/mimir/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/templates/.gitkeep", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "format": 1 + }, + { + "name": "roles/mimir/templates/config.yml.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "dff106fed815d12d0b30ba1a086b7e3bbe99dd5d8a5390a65cd8b5b75b07a8b1", + "format": 1 + }, + { + "name": "roles/mimir/molecule", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/molecule/test-requirements.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "bd70637dd6307a21c6084e83828c1ae13ac7818001bb9cffef2f8c0ea4e18b7b", + "format": 1 + }, + { + "name": "roles/mimir/molecule/default", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/molecule/default/molecule.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "87e569bbddb1f1f702c5dc3fc9e580e48aa7a0eb262e8027cdf130da01bf13d9", + "format": 1 + }, + { + "name": "roles/mimir/molecule/default/tests", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/molecule/default/tests/test_default.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2b956a72585ad5b7caa162e3078db1af7ee33d266cd9890f87057875ea9746f1", + "format": 1 + }, + { + "name": "roles/mimir/molecule/default/converge.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "08280357d62d228a056fcf031d2dca1675c2a38aa090567838c5d812f572854c", + "format": 1 + }, + { + "name": "roles/mimir/handlers", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/mimir/handlers/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a49c94f2932683da280c81f687145642fdaa4681e073ed9dbca4630ce5d3e70f", + "format": 1 + }, + { + "name": "roles/alloy", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/alloy/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/alloy/tasks/configure.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8533c2217f66b233533a970cd94cee4ac72411d550c35a1f1b6f963833140e03", + "format": 1 + }, + { + "name": "roles/alloy/tasks/service.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "af0b984475cef3f6663cafac98b32af8cfa87c1f23e13acb7e82b6fe76db9f30", + "format": 1 + }, + { + "name": "roles/alloy/tasks/install.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c8f6ba8e76b7e087814d29ebb8765cf49f528474ebcbe7be01d31de6f148ec6d", + "format": 1 + }, + { + "name": "roles/alloy/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "211284ee8181596f4cb399acf1e5acc5f323bc773efd0d07341f215da2eb7cb5", + "format": 1 + }, + { + "name": "roles/alloy/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/alloy/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "eb51ee424adea159dc179cfd8610c228699a156e6ea54349035b9ce6b241bb78", + "format": 1 + }, + { + "name": "roles/alloy/README.md", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e9551cd53274a9c69b560c33e0fe479dc3b16cae553e239929cd9f1894496520", + "format": 1 + }, + { + "name": "roles/alloy/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/alloy/defaults/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a90e9320a16c18619799abbc8d360d2647d64641952e0906fc6bf966daa90b37", + "format": 1 + }, + { + "name": "roles/alloy/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/alloy/templates/config.alloy.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8a08f43b75d655defb0d08884e978804c50847036b6b4bbffb60ed6aed713e15", + "format": 1 + }, + { + "name": "roles/alloy/templates/environment.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d8956bc6bdf490ae8c45ee43d2d8e683c1c9fcfcf815ca73656e6471ad964174", + "format": 1 + }, + { + "name": "roles/alloy/templates/alloy.service.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "430a7824bf2157fcf6f3a6c8881004f042c5470cedc840f68befcbfdd5ad023a", + "format": 1 + }, + { + "name": "roles/alloy/handlers", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/alloy/handlers/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "de56a3f9f68af4296a59391d0171bcdc448511fdf2a6d626c0fa50d3294f0395", + "format": 1 + }, + { "name": "roles/grafana_agent", "ftype": "dir", "chksum_type": null, @@ -641,7 +1236,7 @@ "name": "roles/grafana_agent/README.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f39efa315d0c1af1d87514936636e71ad15156effd4b14a4ed78bf37d2e514b8", + "chksum_sha256": "db482b9928a877cd5622797a030a67f964f1dc3bc9a6d56291e16523c0260f90", "format": 1 }, { @@ -655,7 +1250,7 @@ "name": "roles/grafana_agent/defaults/main.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ce5ef24967abddc425039e9fb4ff9bc49bdfaba4c9c046738d27a63675c6f3ad", + "chksum_sha256": "8ae44ab181bd1825f041ec8d4048e21708d142965068ecb883793b5b696549ff", "format": 1 }, { @@ -683,7 +1278,7 @@ "name": "roles/grafana_agent/templates/grafana-agent.service.j2", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "239c89d903d7df2d931969e783e84ee17184edf659d170c5cba727d907d9cfca", + "chksum_sha256": "13e5dc455a1311ef9f11fb8aeeb2c2c7d990935a51cd267c7d532ddaa6a7c10a", "format": 1 }, { @@ -701,6 +1296,188 @@ "format": 1 }, { + "name": "roles/promtail", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/promtail/vars", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/promtail/vars/RedHat.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "db5d56985245d8ea6ccb5a9764db98fb9691534c093fdbb48a8f408d27c482e8", + "format": 1 + }, + { + "name": "roles/promtail/vars/Debian.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "683d64b1d28f4f665a1409d9a10aa448e79f93569e4546f402596b8f5074bb9a", + "format": 1 + }, + { + "name": "roles/promtail/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/promtail/tasks/uninstall.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "10ee65ba2bc07067ad2dab3cd4d2ca1c61a683f2bea5d443083c8bb864c31f09", + "format": 1 + }, + { + "name": "roles/promtail/tasks/deploy.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0623db97f5a4b50a0c5e478380bcca4d9094aa9fe96fdfc8d1685f8948c7a2a5", + "format": 1 + }, + { + "name": "roles/promtail/tasks/setup-Debian.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c7e439a199b159b97cd8ea220a69ad225fcb1e9f5745a53b7dc9cc33b016b113", + "format": 1 + }, + { + "name": "roles/promtail/tasks/acl_configuration.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9c6917d51e9f3b5483a3d0395f286f80921952e07fc618141d4fd7c5862fb810", + "format": 1 + }, + { + "name": "roles/promtail/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b9255ea59f9f95d8397c3460c144b431c13fb2015a405ced7839adc207386ec1", + "format": 1 + }, + { + "name": "roles/promtail/tasks/setup-RedHat.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c3085dc8e0679de7c6e59b4213f8658f5f6ca2df15009497ff7fdc93a709a661", + "format": 1 + }, + { + "name": "roles/promtail/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/promtail/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f554dff3877cb2ff20aa904cd7673960b2a6020542545990d40be2e50d9119a6", + "format": 1 + }, + { + "name": "roles/promtail/README.md", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d0bbd073c5c3f4c07bc3d91225565a29519232ebc3a5f5f0d58f36727dcabee9", + "format": 1 + }, + { + "name": "roles/promtail/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/promtail/defaults/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d18557b1514828f4bd5655c0f0b7edc860976a408d7dcf0c75c8d2308db4025c", + "format": 1 + }, + { + "name": "roles/promtail/templates", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/promtail/templates/promtail.service.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4f60e5896fdf7423c18ad756be65dd579c2de67e1a6ba65087732e36022705f5", + "format": 1 + }, + { + "name": "roles/promtail/templates/config.yml.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7a60b181374ac3404f41dd2c81fba86f95d007db5980fb5416d0939e311a5b10", + "format": 1 + }, + { + "name": "roles/promtail/templates/promtail_acl.j2", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a337a0e3744d0482abf95ee2100a97c457c06fda93a0104f909c8aa366035580", + "format": 1 + }, + { + "name": "roles/promtail/molecule", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/promtail/molecule/default", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/promtail/molecule/default/molecule.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f2fb19d8e5973db9cd226780c4ecf9ae5947286626de40224c1228a6463b1114", + "format": 1 + }, + { + "name": "roles/promtail/molecule/default/converge.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "10c9a514befc870545238b9f4b79ef344d6e0903c728c2cfbf8b5df7f43911d6", + "format": 1 + }, + { + "name": "roles/promtail/handlers", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "roles/promtail/handlers/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b847d2d889b4579a7990dca5ddf6ed8cd8e2686f4d7cd6fce68ec2cfa7683287", + "format": 1 + }, + { "name": "roles/grafana", "ftype": "dir", "chksum_type": null, @@ -753,7 +1530,7 @@ "name": "roles/grafana/tasks/preflight.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5448f51232dfd1aac920ccc6e6c873c44702ee558b6b5ed1a5e0f7ff2331c820", + "chksum_sha256": "5fbef6a34f1edb47ecaf806d00395fb1be2f9546901e832885c9f019ff08dc05", "format": 1 }, { @@ -767,7 +1544,7 @@ "name": "roles/grafana/tasks/dashboards.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9ed4293bc3bb37072a64a333c3bc8ded3f2fd1d72b993581d3a4a6b3334eff74", + "chksum_sha256": "85fb407ca2c9921343617debdd439a733bdea188df3b973019a2d616449a13ce", "format": 1 }, { @@ -795,7 +1572,7 @@ "name": "roles/grafana/tasks/datasources.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ad5d5a6a8d25c980b1961e6bf3fc54d7545fc8d420642381341c91bf7085a26f", + "chksum_sha256": "341a5026400f862da67a598712171bb0f17020c53abd8256ebbba59dd5c4d3ff", "format": 1 }, { @@ -830,14 +1607,14 @@ "name": "roles/grafana/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b74a99dba66c4a559a3a0c1fe555e3a5fb45ae036d89f5fa772b4b9978d8004d", + "chksum_sha256": "5d423f87d9e19d5e6891f793447b323055110a24390a884e98b8b2175515b08f", "format": 1 }, { "name": "roles/grafana/README.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e60db326c70efc1cddd791edbe2e717922b4b65d10a71c126e02a8dbf4933140", + "chksum_sha256": "6f06c44a1022f5155cd8ba5ed8ed5e3b463a3c1cf9aa2dc7be73f1a137ad4ec2", "format": 1 }, { @@ -851,7 +1628,7 @@ "name": "roles/grafana/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2f0b3a3a16323f48435a725a1d286c1fbd5008a3d6ad18e15d2c7004feb44b1e", + "chksum_sha256": "0167eb975ca949b2b9df5ec120f97d311fce1c3326d886869a89702d9b7153a9", "format": 1 }, { @@ -865,7 +1642,7 @@ "name": "roles/grafana/templates/grafana.ini.j2", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2dcef2a5205dd9b7d6b1a4c025e17a0827815b7b239cd63deec4ebeb24fc8745", + "chksum_sha256": "644b22b7601859a027f82f919d5d67911e08c903f7fcac167de06a32a7bb4c21", "format": 1 }, { @@ -998,28 +1775,28 @@ "name": "changelogs/.plugin-cache.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "74da9ff1ab4154c38a7d91b8c3aa985e70c59709efa8832f7325dc0530483da2", + "chksum_sha256": "57b26de76fb2f40aa7c75107a8100d182e670af65e61aa41bcd898ab3c49b756", "format": 1 }, { "name": "changelogs/changelog.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "200b1a4250b4551f9ec3e9e4409a4818f8d82be69875f4a8b44cff47741a6cf8", + "chksum_sha256": "c161fd35bc25041c9f64122ce2ff06d23f8c7d83cfefa8e439bbeadeaf8aa0a2", "format": 1 }, { "name": "README.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "58ab38c25312c0f6e89abd7ea7e99341806c0d7b9629a6b50fba7f31dfa1dd19", + "chksum_sha256": "cdb531cc97972ef31ab06917f2d79a37bbecf594696575c7ad21fe575a80315b", "format": 1 }, { "name": "Pipfile", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b812b6255a910c789bb830ada81e1af0f6a9c0c1d715f753b3224c03c63133a0", + "chksum_sha256": "1450eae074679953056cddca4ffa876be099f5767891d21bac5122ca80b0e6e2", "format": 1 }, { @@ -1040,7 +1817,7 @@ "name": ".gitignore", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d48f68dd16490e0613490dafff5d5284650fab7276c7117bbc6c726ee5b9b96f", + "chksum_sha256": "a09430ce7bbf9c75791cc3bee42e6f47187a40b99461beaec5c1185fbd1a16b0", "format": 1 }, { @@ -1058,6 +1835,27 @@ "format": 1 }, { + "name": "examples/monitor-multiple-instance-otel.md", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0b655cc01142478e478cbc266f376e718b8e209e59aac98a09bcde43bda3e09d", + "format": 1 + }, + { + "name": "examples/loki-local-filesystem-with-retention-and-alert.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8ccad2dcd5b8c5753135e2bbd6bcd32898e3ba44fb28b6f5160483cefa73cad8", + "format": 1 + }, + { + "name": "examples/loki-basic-no-options.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "66ca6d2b2ce29a6057c60041fe4b694d071752b74a90ef61dcde8faa5d1bc249", + "format": 1 + }, + { "name": "examples/agent-basic-no-options.yaml", "ftype": "file", "chksum_type": "sha256", @@ -1065,13 +1863,27 @@ "format": 1 }, { - "name": "examples/monitor-multiple-instances.md", + "name": "examples/opentelemetry-collector.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0234500a96941f52701a0cdd7e852373507cb18d9113fa22cd36c30efdf2d18a", + "format": 1 + }, + { + "name": "examples/monitor-multiple-instances-agent.md", "ftype": "file", "chksum_type": "sha256", "chksum_sha256": "312db8918e6f1e22bd0a6a2aefad5f5db8c0ab9bb88562c883aa047614b7b701", "format": 1 }, { + "name": "examples/mimir-3-hosts.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c4977212869d1d832c2a52de6ef4860349d0a1592e3e202965cb87e6f453f9a5", + "format": 1 + }, + { "name": "examples/agent-send-to-grafana-cloud.yaml", "ftype": "file", "chksum_type": "sha256", @@ -1086,6 +1898,20 @@ "format": 1 }, { + "name": "examples/alloy.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "02702560039862854cb704e6fd646a5fdb2f6214445fe2d0455a4cf56041903d", + "format": 1 + }, + { + "name": "examples/promtail-multiple-logs.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "6fad8d05061f273414ca19ed9c671fc05a8e83ee74b1c0512f76da2dc0ccb8f0", + "format": 1 + }, + { "name": "ansible.cfg", "ftype": "file", "chksum_type": "sha256", @@ -1128,6 +1954,27 @@ "format": 1 }, { + "name": ".github/workflows/loki-molecule.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a02e6776151e0fd03cd754771d80e73e1470c7088d861b514d5a7dafd47ad6b8", + "format": 1 + }, + { + "name": ".github/workflows/mimir-molecule.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f0bd0193174f7d1413c900200bd12b87f833fa0c4feb4d4e788708a7675befb1", + "format": 1 + }, + { + "name": ".github/workflows/promtail-molecule.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b1179c60a308fb166a8ca3839fe7480db7143394f816cbc6089af5252ae74142", + "format": 1 + }, + { "name": ".github/workflows/lint.yaml", "ftype": "file", "chksum_type": "sha256", @@ -1152,7 +1999,7 @@ "name": "requirements.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9f11ec06a7a1d62821de4fe26c7f76e15694fb4bfee1ae2ed1d2db93e4803545", + "chksum_sha256": "85c5d41624847de7aa4a49e6d8060fc60e71af5a610b21e75cff8391494ce65c", "format": 1 }, { @@ -1166,14 +2013,14 @@ "name": "CHANGELOG.rst", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "208e9649fa74320b42aea4fe7c32826a1e980b534adee8277d7cdb9767a5b4cb", + "chksum_sha256": "ef2ab62dbc562173e3f8744fcbd7ad43c8113175279a9fec3a87079c4196454b", "format": 1 }, { "name": "Pipfile.lock", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1c5742f0d83518089922a5d484029f21ae68612c4bfd55dfbc54be61150ef087", + "chksum_sha256": "e1f57b42ce8100b3f6f7ba6769bf1c8f137d4f2f5a505117e1f999e85e3cbdbb", "format": 1 } ], diff --git a/ansible_collections/grafana/grafana/MANIFEST.json b/ansible_collections/grafana/grafana/MANIFEST.json index 4a9ec0eb1..79db7d745 100644 --- a/ansible_collections/grafana/grafana/MANIFEST.json +++ b/ansible_collections/grafana/grafana/MANIFEST.json @@ -2,10 +2,11 @@ "collection_info": { "namespace": "grafana", "name": "grafana", - "version": "2.2.5", + "version": "5.2.0", "authors": [ "Grafana Labs <grafana.com>", - "Ishan Jain <ishan.jain@grafana.com>" + "Ishan Jain <ishan.jain@grafana.com>", + "Gerard van Engelen <g.vanengelen@codepeople.nl>" ], "readme": "README.md", "tags": [ @@ -28,7 +29,7 @@ "name": "FILES.json", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "efd45a0ccd368b6abc4faf1231e1a4cea2b606bd4f3220d4b8b899e3b2084aa7", + "chksum_sha256": "f2138d4c8cd1f89bb7d54619b2a069869c86adc4b00f08e2a07590c3576eaf0f", "format": 1 }, "format": 1 diff --git a/ansible_collections/grafana/grafana/Pipfile b/ansible_collections/grafana/grafana/Pipfile index 162940e72..99637e1e1 100644 --- a/ansible_collections/grafana/grafana/Pipfile +++ b/ansible_collections/grafana/grafana/Pipfile @@ -4,7 +4,7 @@ verify_ssl = true name = "pypi" [packages] -yamllint = "==1.34.0" +yamllint = "==1.35.1" ansible-lint = ">=6.13.1,<25.0.0" pylint = ">=2.16.2,<4.0.0" diff --git a/ansible_collections/grafana/grafana/Pipfile.lock b/ansible_collections/grafana/grafana/Pipfile.lock index c15343a37..704c72edc 100644 --- a/ansible_collections/grafana/grafana/Pipfile.lock +++ b/ansible_collections/grafana/grafana/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "126b8e64a6e5896b218c3d70b198f9a6d159bccb911f554b17295c4a74888223" + "sha256": "6a1528d3f70e2629822009c43b3b54d7e74aa1ac3873ec6700f3b2ca47ccb0bf" }, "pipfile-spec": 6, "requires": { @@ -26,28 +26,28 @@ }, "ansible-core": { "hashes": [ - "sha256:50c9f33a5b2ee645470a77f4bf99cf35d1ffdefef60388910020b0c58534bec1", - "sha256:76a8765a8586064ef073a299562e308fa2c180a75b5f7569bbd0f61d4171cdb3" + "sha256:111e55d358c2297ec0ce03ba98e6c5ce95947fdf50d878215eb8c183d0c275e4", + "sha256:f9dea5044a86fd95cc27099f4f5c3ae9beb23acf7c3b6331455726c47825922b" ], "markers": "python_version >= '3.10'", - "version": "==2.16.3" + "version": "==2.16.6" }, "ansible-lint": { "hashes": [ - "sha256:6bc5d6273f33711ec6d370dfe5fdbe97a64b4c36c2a7a19a249401326eb03616", - "sha256:755f369c6baf601b09c4931a4e6bd0df3d79c54eb519f093e5db6ab52ad03e0c" + "sha256:2ec67cc1719f56e63b1dfc3728d0c2c4142e531f4452f6ae31f618438d59469a", + "sha256:8aad0de454e0e803b0416a9c6e409302a8eb93c0f3866a98f035b96647e72213" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==24.2.0" + "version": "==24.2.3" }, "astroid": { "hashes": [ - "sha256:4a61cf0a59097c7bb52689b0fd63717cd2a8a14dc9f1eee97b82d814881c8c91", - "sha256:d6e62862355f60e716164082d6b4b041d38e2a8cf1c7cd953ded5108bac8ff5c" + "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819", + "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4" ], "markers": "python_full_version >= '3.8.0'", - "version": "==3.0.2" + "version": "==3.1.0" }, "attrs": { "hashes": [ @@ -59,31 +59,31 @@ }, "black": { "hashes": [ - "sha256:0269dfdea12442022e88043d2910429bed717b2d04523867a85dacce535916b8", - "sha256:07204d078e25327aad9ed2c64790d681238686bce254c910de640c7cc4fc3aa6", - "sha256:08b34e85170d368c37ca7bf81cf67ac863c9d1963b2c1780c39102187ec8dd62", - "sha256:1a95915c98d6e32ca43809d46d932e2abc5f1f7d582ffbe65a5b4d1588af7445", - "sha256:2588021038bd5ada078de606f2a804cadd0a3cc6a79cb3e9bb3a8bf581325a4c", - "sha256:2fa6a0e965779c8f2afb286f9ef798df770ba2b6cee063c650b96adec22c056a", - "sha256:34afe9da5056aa123b8bfda1664bfe6fb4e9c6f311d8e4a6eb089da9a9173bf9", - "sha256:3897ae5a21ca132efa219c029cce5e6bfc9c3d34ed7e892113d199c0b1b444a2", - "sha256:40657e1b78212d582a0edecafef133cf1dd02e6677f539b669db4746150d38f6", - "sha256:48b5760dcbfe5cf97fd4fba23946681f3a81514c6ab8a45b50da67ac8fbc6c7b", - "sha256:5242ecd9e990aeb995b6d03dc3b2d112d4a78f2083e5a8e86d566340ae80fec4", - "sha256:5cdc2e2195212208fbcae579b931407c1fa9997584f0a415421748aeafff1168", - "sha256:5d7b06ea8816cbd4becfe5f70accae953c53c0e53aa98730ceccb0395520ee5d", - "sha256:7258c27115c1e3b5de9ac6c4f9957e3ee2c02c0b39222a24dc7aa03ba0e986f5", - "sha256:854c06fb86fd854140f37fb24dbf10621f5dab9e3b0c29a690ba595e3d543024", - "sha256:a21725862d0e855ae05da1dd25e3825ed712eaaccef6b03017fe0853a01aa45e", - "sha256:a83fe522d9698d8f9a101b860b1ee154c1d25f8a82ceb807d319f085b2627c5b", - "sha256:b3d64db762eae4a5ce04b6e3dd745dcca0fb9560eb931a5be97472e38652a161", - "sha256:e298d588744efda02379521a19639ebcd314fba7a49be22136204d7ed1782717", - "sha256:e2c8dfa14677f90d976f68e0c923947ae68fa3961d61ee30976c388adc0b02c8", - "sha256:ecba2a15dfb2d97105be74bbfe5128bc5e9fa8477d8c46766505c1dda5883aac", - "sha256:fc1ec9aa6f4d98d022101e015261c056ddebe3da6a8ccfc2c792cbe0349d48b7" + "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474", + "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1", + "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0", + "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8", + "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96", + "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1", + "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04", + "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021", + "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94", + "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d", + "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c", + "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7", + "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c", + "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc", + "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7", + "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d", + "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c", + "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741", + "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce", + "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb", + "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063", + "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e" ], "markers": "python_version >= '3.8'", - "version": "==24.1.1" + "version": "==24.4.2" }, "bracex": { "hashes": [ @@ -161,41 +161,41 @@ }, "cryptography": { "hashes": [ - "sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380", - "sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589", - "sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea", - "sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65", - "sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a", - "sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3", - "sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008", - "sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1", - "sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2", - "sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635", - "sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2", - "sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90", - "sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee", - "sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a", - "sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242", - "sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12", - "sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2", - "sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d", - "sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be", - "sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee", - "sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6", - "sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529", - "sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929", - "sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1", - "sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6", - "sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a", - "sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446", - "sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9", - "sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888", - "sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4", - "sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33", - "sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f" + "sha256:00c0faa5b021457848d031ecff041262211cc1e2bce5f6e6e6c8108018f6b44a", + "sha256:073104df012fc815eed976cd7d0a386c8725d0d0947cf9c37f6c36a6c20feb1b", + "sha256:076c92b08dd1ab88108bc84545187e10d3693a9299c593f98c4ea195a0b0ead7", + "sha256:089aeb297ff89615934b22c7631448598495ffd775b7d540a55cfee35a677bf4", + "sha256:3b750279f3e7715df6f68050707a0cee7cbe81ba2eeb2f21d081bd205885ffed", + "sha256:43e521f21c2458038d72e8cdfd4d4d9f1d00906a7b6636c4272e35f650d1699b", + "sha256:4bdb39ecbf05626e4bfa1efd773bb10346af297af14fb3f4c7cb91a1d2f34a46", + "sha256:5967e3632f42b0c0f9dc2c9da88c79eabdda317860b246d1fbbde4a8bbbc3b44", + "sha256:65d529c31bd65d54ce6b926a01e1b66eacf770b7e87c0622516a840e400ec732", + "sha256:6981acac509cc9415344cb5bfea8130096ea6ebcc917e75503143a1e9e829160", + "sha256:81dbe47e28b703bc4711ac74a64ef8b758a0cf056ce81d08e39116ab4bc126fa", + "sha256:8b90c57b3cd6128e0863b894ce77bd36fcb5f430bf2377bc3678c2f56e232316", + "sha256:9184aff0856261ecb566a3eb26a05dfe13a292c85ce5c59b04e4aa09e5814187", + "sha256:945a43ebf036dd4b43ebfbbd6b0f2db29ad3d39df824fb77476ca5777a9dde33", + "sha256:97eeacae9aa526ddafe68b9202a535f581e21d78f16688a84c8dcc063618e121", + "sha256:9f1a3bc2747166b0643b00e0b56cd9b661afc9d5ff963acaac7a9c7b2b1ef638", + "sha256:9ff75b88a4d273c06d968ad535e6cb6a039dd32db54fe36f05ed62ac3ef64a44", + "sha256:aeb6f56b004e898df5530fa873e598ec78eb338ba35f6fa1449970800b1d97c2", + "sha256:b16b90605c62bcb3aa7755d62cf5e746828cfc3f965a65211849e00c46f8348d", + "sha256:b99831397fdc6e6e0aa088b060c278c6e635d25c0d4d14bdf045bf81792fda0a", + "sha256:bc954251edcd8a952eeaec8ae989fec7fe48109ab343138d537b7ea5bb41071a", + "sha256:c05230d8aaaa6b8ab3ab41394dc06eb3d916131df1c9dcb4c94e8f041f704b74", + "sha256:d16a310c770cc49908c500c2ceb011f2840674101a587d39fa3ea828915b7e83", + "sha256:d93080d2b01b292e7ee4d247bf93ed802b0100f5baa3fa5fd6d374716fa480d4", + "sha256:e1f5f15c5ddadf6ee4d1d624a2ae940f14bd74536230b0056ccb28bb6248e42a", + "sha256:e3442601d276bd9e961d618b799761b4e5d892f938e8a4fe1efbe2752be90455", + "sha256:e85f433230add2aa26b66d018e21134000067d210c9c68ef7544ba65fc52e3eb", + "sha256:eecca86813c6a923cabff284b82ff4d73d9e91241dc176250192c3a9b9902a54", + "sha256:f1e933b238978ccfa77b1fee0a297b3c04983f4cb84ae1c33b0ea4ae08266cc9", + "sha256:f4cece02478d73dacd52be57a521d168af64ae03d2a567c0c4eb6f189c3b9d79", + "sha256:f567a82b7c2b99257cca2a1c902c1b129787278ff67148f188784245c7ed5495", + "sha256:f987a244dfb0333fbd74a691c36000a2569eaf7c7cc2ac838f85f59f0588ddc9" ], "markers": "python_version >= '3.7'", - "version": "==42.0.2" + "version": "==42.0.6" }, "dill": { "hashes": [ @@ -207,11 +207,11 @@ }, "filelock": { "hashes": [ - "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e", - "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c" + "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f", + "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a" ], "markers": "python_version >= '3.8'", - "version": "==3.13.1" + "version": "==3.14.0" }, "isort": { "hashes": [ @@ -223,19 +223,19 @@ }, "jinja2": { "hashes": [ - "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", - "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" + "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", + "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" ], "markers": "python_version >= '3.7'", - "version": "==3.1.3" + "version": "==3.1.4" }, "jsonschema": { "hashes": [ - "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f", - "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5" + "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7", + "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802" ], "markers": "python_version >= '3.8'", - "version": "==4.21.1" + "version": "==4.22.0" }, "jsonschema-specifications": { "hashes": [ @@ -387,11 +387,11 @@ }, "packaging": { "hashes": [ - "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" ], "markers": "python_version >= '3.7'", - "version": "==23.2" + "version": "==24.0" }, "pathspec": { "hashes": [ @@ -403,35 +403,36 @@ }, "platformdirs": { "hashes": [ - "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", - "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" + "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf", + "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1" ], "markers": "python_version >= '3.8'", - "version": "==4.2.0" + "version": "==4.2.1" }, "pycparser": { "hashes": [ - "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", - "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" ], - "version": "==2.21" + "markers": "python_version >= '3.8'", + "version": "==2.22" }, "pygments": { "hashes": [ - "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", - "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" + "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" ], - "markers": "python_version >= '3.7'", - "version": "==2.17.2" + "markers": "python_version >= '3.8'", + "version": "==2.18.0" }, "pylint": { "hashes": [ - "sha256:58c2398b0301e049609a8429789ec6edf3aabe9b6c5fec916acd18639c16de8b", - "sha256:7a1585285aefc5165db81083c3e06363a27448f6b467b3b0f30dbd0ac1f73810" + "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74", + "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23" ], "index": "pypi", "markers": "python_full_version >= '3.8.0'", - "version": "==3.0.3" + "version": "==3.1.0" }, "pyyaml": { "hashes": [ @@ -492,11 +493,11 @@ }, "referencing": { "hashes": [ - "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5", - "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7" + "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", + "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de" ], "markers": "python_version >= '3.8'", - "version": "==0.33.0" + "version": "==0.35.1" }, "resolvelib": { "hashes": [ @@ -507,116 +508,116 @@ }, "rich": { "hashes": [ - "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa", - "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235" + "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222", + "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432" ], "markers": "python_full_version >= '3.7.0'", - "version": "==13.7.0" + "version": "==13.7.1" }, "rpds-py": { "hashes": [ - "sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147", - "sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7", - "sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2", - "sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68", - "sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1", - "sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382", - "sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d", - "sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921", - "sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38", - "sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4", - "sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a", - "sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d", - "sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518", - "sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e", - "sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d", - "sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf", - "sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5", - "sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba", - "sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6", - "sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59", - "sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253", - "sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6", - "sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f", - "sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3", - "sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea", - "sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1", - "sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76", - "sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93", - "sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad", - "sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad", - "sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc", - "sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049", - "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d", - "sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90", - "sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d", - "sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd", - "sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25", - "sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2", - "sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f", - "sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6", - "sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4", - "sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c", - "sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8", - "sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d", - "sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b", - "sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19", - "sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453", - "sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9", - "sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde", - "sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296", - "sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58", - "sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec", - "sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99", - "sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a", - "sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb", - "sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383", - "sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d", - "sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896", - "sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc", - "sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6", - "sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b", - "sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7", - "sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22", - "sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf", - "sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394", - "sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0", - "sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57", - "sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74", - "sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83", - "sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29", - "sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9", - "sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f", - "sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745", - "sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb", - "sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811", - "sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55", - "sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342", - "sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23", - "sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82", - "sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041", - "sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb", - "sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066", - "sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55", - "sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6", - "sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a", - "sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140", - "sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b", - "sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9", - "sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256", - "sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c", - "sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772", - "sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4", - "sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae", - "sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920", - "sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a", - "sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b", - "sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361", - "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8", - "sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a" + "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee", + "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc", + "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc", + "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944", + "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20", + "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7", + "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4", + "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6", + "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6", + "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93", + "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633", + "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0", + "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360", + "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8", + "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139", + "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7", + "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a", + "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9", + "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26", + "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724", + "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72", + "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b", + "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09", + "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100", + "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3", + "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261", + "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3", + "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9", + "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b", + "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3", + "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de", + "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d", + "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e", + "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8", + "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff", + "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5", + "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c", + "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e", + "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e", + "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4", + "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8", + "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922", + "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338", + "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d", + "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8", + "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2", + "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72", + "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80", + "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644", + "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae", + "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163", + "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104", + "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d", + "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60", + "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a", + "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d", + "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07", + "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49", + "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10", + "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f", + "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2", + "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8", + "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7", + "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88", + "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65", + "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0", + "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909", + "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8", + "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c", + "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184", + "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397", + "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a", + "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346", + "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590", + "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333", + "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb", + "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74", + "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e", + "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d", + "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa", + "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f", + "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53", + "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1", + "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac", + "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0", + "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd", + "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611", + "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f", + "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c", + "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5", + "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab", + "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc", + "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43", + "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da", + "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac", + "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843", + "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e", + "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89", + "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64" ], "markers": "python_version >= '3.8'", - "version": "==0.17.1" + "version": "==0.18.1" }, "ruamel.yaml": { "hashes": [ @@ -708,27 +709,27 @@ }, "tomlkit": { "hashes": [ - "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4", - "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba" + "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b", + "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3" ], "markers": "python_version >= '3.7'", - "version": "==0.12.3" + "version": "==0.12.4" }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", + "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" ], "markers": "python_version < '3.11'", - "version": "==4.9.0" + "version": "==4.11.0" }, "wcmatch": { "hashes": [ - "sha256:14554e409b142edeefab901dc68ad570b30a72a8ab9a79106c5d5e9a6d241bd5", - "sha256:86c17572d0f75cbf3bcb1a18f3bf2f9e72b39a9c08c9b4a74e991e1882a8efb3" + "sha256:24c19cedc92bc9c9e27f39db4e1824d72f95bd2cea32b254a47a45b1a1b227ed", + "sha256:c0088c7f6426cf6bf27e530e2b7b734031905f7e490475fd83c7c5008ab581b3" ], "markers": "python_version >= '3.8'", - "version": "==8.5" + "version": "==8.5.1" }, "wrapt": { "hashes": [ @@ -813,12 +814,12 @@ }, "yamllint": { "hashes": [ - "sha256:33b813f6ff2ffad2e57a288281098392b85f7463ce1f3d5cd45aa848b916a806", - "sha256:7f0a6a41e8aab3904878da4ae34b6248b6bc74634e0d3a90f0fb2d7e723a3d4f" + "sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3", + "sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.34.0" + "version": "==1.35.1" } }, "develop": {} diff --git a/ansible_collections/grafana/grafana/README.md b/ansible_collections/grafana/grafana/README.md index e28604a1f..ceef02c7a 100644 --- a/ansible_collections/grafana/grafana/README.md +++ b/ansible_collections/grafana/grafana/README.md @@ -6,12 +6,7 @@ [![GitHub Last Commit](https://img.shields.io/github/last-commit/grafana/grafana-ansible-collection)](https://github.com/grafana/grafana-ansible-collection/tags) [![GitHub Contributors](https://img.shields.io/github/contributors/grafana/grafana-ansible-collection)](https://github.com/grafana/grafana-ansible-collection/tags) -[![Modules Test](https://github.com/grafana/grafana-ansible-collection/actions/workflows/modules-test.yml/badge.svg?branch=main)](https://github.com/grafana/grafana-ansible-collection/actions/workflows/modules-test.yml) -[![Roles Test](https://github.com/grafana/grafana-ansible-collection/actions/workflows/roles-test.yml/badge.svg?branch=main)](https://github.com/grafana/grafana-ansible-collection/actions/workflows/roles-test.yml) -[![Full Integration Test](https://github.com/grafana/grafana-ansible-collection/actions/workflows/full-integration-test.yml/badge.svg?branch=main)](https://github.com/grafana/grafana-ansible-collection/actions/workflows/full-integration-test.yml) -[![Lint](https://github.com/grafana/grafana-ansible-collection/actions/workflows/lint.yaml/badge.svg)](https://github.com/grafana/grafana-ansible-collection/actions/workflows/lint.yaml) - -This collection (`grafana.grafana`) contains modules and plugins to assist in automating managing of resources in **Grafana** with Ansible. +This collection (`grafana.grafana`) contains modules and roles to assist in automating the management of resources in **Grafana**, **Grafana Agent**, **OpenTelemetry Collector**, **Loki**, **Mimir**, and **Promtail** with Ansible. - [Ansible collection Documentation](https://docs.ansible.com/ansible/latest/collections/grafana/grafana/) - [Grafana](https://grafana.com) @@ -46,6 +41,17 @@ collections: version: 1.0.0 ``` +## Roles included in the collection + +This collection includes the following roles to help set up and manage Grafana, Grafana Agent, OpenTelemetry Collector, Loki, Mimir and Promtail: + +- **Grafana**: Installs and configures Grafana on your target hosts. +- **Grafana Agent**: Deploys and configures Grafana Agent, allowing for efficient metrics, logs, and trace data shipping to Grafana Cloud or other endpoints. +- **OpenTelemetry Collector**: Sets up and configures the OpenTelemetry Collector, enabling advanced observability features through data collection and transmission. +- **Loki**: Deploy and manage Loki, the log aggregation system. +- **Mimir**: Deploy and manage Mimir, the scalable long-term storage for Prometheus. +- **Promtail**: Deploy and manage Promtail, the agent which ships the contents of local logs to a private Grafana Loki. + ## Using this collection You can call modules by their Fully Qualified Collection Namespace (FQCN), such as `grafana.grafana.cloud_stack`: diff --git a/ansible_collections/grafana/grafana/changelogs/.plugin-cache.yaml b/ansible_collections/grafana/grafana/changelogs/.plugin-cache.yaml index 0f8ab33ab..1d78dc030 100644 --- a/ansible_collections/grafana/grafana/changelogs/.plugin-cache.yaml +++ b/ansible_collections/grafana/grafana/changelogs/.plugin-cache.yaml @@ -56,4 +56,4 @@ plugins: strategy: {} test: {} vars: {} -version: 2.2.5 +version: 5.2.0 diff --git a/ansible_collections/grafana/grafana/changelogs/changelog.yaml b/ansible_collections/grafana/grafana/changelogs/changelog.yaml index c915cd788..bdf0debdd 100644 --- a/ansible_collections/grafana/grafana/changelogs/changelog.yaml +++ b/ansible_collections/grafana/grafana/changelogs/changelog.yaml @@ -223,7 +223,8 @@ releases: changes: minor_changes: - Add 'run_once' to download&unzip tasks by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/136 - - Adding `oauth_allow_insecure_email_lookup` to fix oauth user sync error by @hypery2k in https://github.com/grafana/grafana-ansible-collection/pull/132 + - Adding `oauth_allow_insecure_email_lookup` to fix oauth user sync error by + @hypery2k in https://github.com/grafana/grafana-ansible-collection/pull/132 - Bump ansible-core from 2.15.4 to 2.15.8 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/137 - Bump ansible-lint from 6.13.1 to 6.14.3 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/139 - Bump ansible-lint from 6.14.3 to 6.22.2 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/142 @@ -238,3 +239,47 @@ releases: - Topic/grafana agent idempotency by @ohdearaugustin in https://github.com/grafana/grafana-ansible-collection/pull/147 release_summary: Grafana and Agent Role bug fixes and security updates release_date: '2024-02-13' + 3.0.0: + changes: + major_changes: + - Add an Ansible role for OpenTelemetry Collector by @ishanjainn in https://github.com/grafana/grafana-ansible-collection/pull/138 + minor_changes: + - Bump pylint from 3.0.3 to 3.1.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/158 + - Bump pylint from 3.0.3 to 3.1.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/161 + - Bump the pip group across 1 directories with 1 update by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/156 + - Bump yamllint from 1.33.0 to 1.35.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/155 + - Bump yamllint from 1.33.0 to 1.35.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/159 + - ExecStartPre and EnvironmentFile settings to system unit file by @fabiiw05 + in https://github.com/grafana/grafana-ansible-collection/pull/157 + - datasources url parameter fix by @dergudzon in https://github.com/grafana/grafana-ansible-collection/pull/162 + release_date: '2024-03-12' + 4.0.0: + changes: + major_changes: + - Add an Ansible role for Grafana Alloy by @ishanjainn in https://github.com/grafana/grafana-ansible-collection/pull/169 + minor_changes: + - Bump ansible-lint from 24.2.0 to 24.2.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/164 + - Update description to match module by @brmurphy in https://github.com/grafana/grafana-ansible-collection/pull/179 + - Clarify grafana-server configuration in README by @VGerris in https://github.com/grafana/grafana-ansible-collection/pull/177 + - Bump ansible-lint from 24.2.0 to 24.2.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/168 + - Bump black from 24.1.1 to 24.3.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/165 + - fix: Apply correct uid + gid for imported dashboards by @hypery2k in https://github.com/grafana/grafana-ansible-collection/pull/167 + release_date: '2024-04-10' + 5.0.0: + changes: + major_changes: + - Add Grafana Mimir role by @GVengelen in https://github.com/grafana/grafana-ansible-collection/pull/183 + - Add Grafana Loki role by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/188 + release_date: '2024-04-29' + 5.1.0: + changes: + major_changes: + - fix: Uninstall Step for Loki and Mimir by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/193 + release_date: '2024-05-07' + 5.2.0: + changes: + major_changes: + - Bump ansible-lint from 24.2.2 to 24.2.3 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/195 + - Add promtail role by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/197 + - Add a new config part to configure KeyCloak based auth by @he0s in https://github.com/grafana/grafana-ansible-collection/pull/191 + release_date: '2024-05-13' diff --git a/ansible_collections/grafana/grafana/examples/alloy.yaml b/ansible_collections/grafana/grafana/examples/alloy.yaml new file mode 100644 index 000000000..29084cbff --- /dev/null +++ b/ansible_collections/grafana/grafana/examples/alloy.yaml @@ -0,0 +1,24 @@ +- name: Install alloy + hosts: all + become: true + + tasks: + - name: Install alloy + ansible.builtin.include_role: + name: grafana.grafana.alloy + vars: + config: | + prometheus.scrape "default" { + targets = [{"__address__" = "localhost:12345"}] + forward_to = [prometheus.remote_write.prom.receiver] + } + prometheus.remote_write "prom" { + endpoint { + url = "https://prometheus-prod-13-prod-us-east-0.grafana.net/api/prom/push" + + basic_auth { + username = "1493467" + password = "glc_eyJvIjoiNjUyOTkyIiwibiI6InN0YWNrLTg5MDA0My1obS13cml0ZS1hc2FzIiwiayI6IjIwME9NeThmWlFpMGlmQzBGMTlJNDdqSiIsIm0iOnsiciI6InByb2QtdXMtZWFzdC0wIn19" + } + } + } diff --git a/ansible_collections/grafana/grafana/examples/loki-basic-no-options.yml b/ansible_collections/grafana/grafana/examples/loki-basic-no-options.yml new file mode 100644 index 000000000..cda128da9 --- /dev/null +++ b/ansible_collections/grafana/grafana/examples/loki-basic-no-options.yml @@ -0,0 +1,6 @@ +--- +- name: Deploy Loki using the default configuration + hosts: all + become: true + roles: + - role: grafana.grafana.loki diff --git a/ansible_collections/grafana/grafana/examples/loki-local-filesystem-with-retention-and-alert.yml b/ansible_collections/grafana/grafana/examples/loki-local-filesystem-with-retention-and-alert.yml new file mode 100644 index 000000000..f37718811 --- /dev/null +++ b/ansible_collections/grafana/grafana/examples/loki-local-filesystem-with-retention-and-alert.yml @@ -0,0 +1,70 @@ +--- +- name: Deploy Loki using the local filesystem + hosts: all + become: true + roles: + - role: grafana.grafana.loki + vars: + loki_querier: + max_concurrent: 16 + engine: + max_look_back_period: 8760h + loki_storage_config: + tsdb_shipper: + active_index_directory: "{{ loki_working_path }}/tsdb-index" + cache_location: "{{ loki_working_path }}/tsdb-cache" + filesystem: + directory: "{{ loki_working_path }}/chunks" + loki_ingester: + wal: + enabled: true + dir: "{{ loki_working_path }}/wal" + lifecycler: + address: 127.0.0.1 + ring: + kvstore: + store: inmemory + replication_factor: 1 + final_sleep: 0s + chunk_idle_period: 1h + max_chunk_age: 2h + chunk_target_size: 1048576 + query_store_max_look_back_period: 8760h + loki_limits_config: + split_queries_by_interval: 0 + reject_old_samples: true + reject_old_samples_max_age: 168h + max_query_length: 0 + max_query_series: 50000 + retention_period: 8760h + allow_structured_metadata: false + max_query_lookback: 8760h + loki_compactor: + working_directory: "{{ loki_working_path }}/compactor" + compaction_interval: 10m + retention_enabled: true + retention_delete_delay: 2h + retention_delete_worker_count: 150 + delete_request_store: filesystem + loki_common: + path_prefix: "{{ loki_working_path }}" + storage: + filesystem: + rules_directory: "{{ loki_working_path }}/rules" + replication_factor: 1 + ring: + instance_addr: 127.0.0.1 + kvstore: + store: inmemory + loki_ruler_alerts: + - name: Logs.sshd + rules: + - alert: SshLoginFailed + expr: | + count_over_time({job=~"secure"} |="sshd[" |~": Failed|: Invalid|: Connection closed by authenticating user" | __error__="" [15m]) > 6 + for: 0m + labels: + severity: critical + annotations: + summary: "{% raw %}SSH authentication failure (instance {{ $labels.instance }}).{% endraw %}" + description: "{% raw %}Increase of SSH authentication failures in last 15 minutes\\n VALUE = {{ $value }}{% endraw %}" diff --git a/ansible_collections/grafana/grafana/examples/mimir-3-hosts.yaml b/ansible_collections/grafana/grafana/examples/mimir-3-hosts.yaml new file mode 100644 index 000000000..5d9e7922b --- /dev/null +++ b/ansible_collections/grafana/grafana/examples/mimir-3-hosts.yaml @@ -0,0 +1,32 @@ +- name: Install mimir + hosts: [mimir-1, mimir-2, mimir-3] + become: true + + tasks: + - name: Install mimir + ansible.builtin.include_role: + name: grafana.grafana.mimir + vars: + # Run against minio blob store backed, see readme for local setup or mimir docs for Azure, AWS, etc. + mimir_storage: + storage: + backend: s3 + s3: + endpoint: localhost:9000 + access_key_id: testtest + secret_access_key: testtest + insecure: true + bucket_name: mimir + + # Blocks storage requires a prefix when using a common object storage bucket. + mimir_blocks_storage: + storage_prefix: blocks + tsdb: + dir: "{{ mimir_working_path}}/ingester" + + # Use memberlist, a gossip-based protocol, to enable the 3 Mimir replicas to communicate + mimir_memberlist: + join_members: + - mimir-1:7946 + - mimir-2:7946 + - mimir-3:7946 diff --git a/ansible_collections/grafana/grafana/examples/monitor-multiple-instance-otel.md b/ansible_collections/grafana/grafana/examples/monitor-multiple-instance-otel.md new file mode 100644 index 000000000..89762ca1b --- /dev/null +++ b/ansible_collections/grafana/grafana/examples/monitor-multiple-instance-otel.md @@ -0,0 +1,193 @@ +# Scaling OpenTelemetry Collector Deployments Using Grafana Ansible Collection +This guide is focused on scaling the OpenTelemetry Collector deployment across various Linux hosts by leveraging Ansible, to function both as gateways and agents within your observability architecture. Utilizing the OpenTelemetry Collector in this dual capacity enables a robust collection and forwarding of metrics, traces, and logs to analysis and visualization platforms, such as Grafana Cloud. + +Here, we outline a strategy for deploying and managing the OpenTelemetry Collector's scalable instances throughout your infrastructure with Ansible, enhancing your overall monitoring strategy and data visualization capabilities in Grafana Cloud. + +## Before You Begin + +To follow this guide, ensure you have: + +- Linux hosts. +- SSH access to each of these Linux hosts. +- Account permissions to install and configure the OpenTelemetry Collector on these hosts. + +## Install the Grafana Ansible collection + +The [Grafana Agent role](https://github.com/grafana/grafana-ansible-collection/tree/main/roles/grafana_agent) is available in the Grafana Ansible collection as of the 1.1.0 release. + +To install the Grafana Ansible collection, run this command: + +``` +ansible-galaxy collection install grafana.grafana +``` + +## Create an Ansible inventory file + +Next, you will set up your hosts and create an inventory file. + +1. Create your hosts and add public SSH keys to them. + + This example uses eight Linux hosts: two Ubuntu hosts, two CentOS hosts, two Fedora hosts, and two Debian hosts. + +1. Create an Ansible inventory file. + + The Ansible inventory, which resides in a file named `inventory`, looks similar to this: + + ``` + 146.190.208.216 # hostname = ubuntu-01 + 146.190.208.190 # hostname = ubuntu-02 + 137.184.155.128 # hostname = centos-01 + 146.190.216.129 # hostname = centos-02 + 198.199.82.174 # hostname = debian-01 + 198.199.77.93 # hostname = debian-02 + 143.198.182.156 # hostname = fedora-01 + 143.244.174.246 # hostname = fedora-02 + ``` + + > **Note**: If you are copying the above file, remove the comments (#). + +1. Create an `ansible.cfg` file within the same directory as `inventory`, with the following values: + ``` + [defaults] + inventory = inventory # Path to the inventory file + private_key_file = ~/.ssh/id_rsa # Path to my private SSH Key + remote_user=root + ``` + +## Use the OpenTelemetry Collector Ansible Role + +Next, you'll define an Ansible playbook to apply your chosen or created OpenTelemetry Collector role across your hosts. + +Create a file named `deploy-opentelemetry.yml` in the same directory as your `ansible.cfg` and `inventory`. + +```yaml +- name: Install OpenTelemetry Collector + hosts: all + become: true + + vars: + grafana_cloud_api_key: <Your Grafana.com API Key> # Example - eyJrIjoiYjI3NjI5MGQxZTcyOTIxYTc0MDgzMGVhNDhlODNhYzA5OTk2Y2U5YiIsIm4iOiJhbnNpYmxldGVzdCIsImlkIjo2NTI5 + metrics_username: <prometheus-username> # Example - 825019 + logs_username: <loki-username> # Example - 411478 + prometheus_url: <prometheus-push-url> # Example - https://prometheus-us-central1.grafana.net/api/prom/push + loki_url: <loki-push-url> # Example - https://logs-prod-017.grafana.net/loki/api/v1/push + tempo_url: <tempo-push-url> # Example - tempo-prod-04-prod-us-east-0.grafana.net:443 + traces_username: <tempo-username> # Example - 411478 + + tasks: + - name: Install OpenTelemetry Collector + ansible.builtin.include_role: + name: grafana.grafana.opentelemetry_collector + vars: + otel_collector_extensions: + basicauth/grafana_cloud_tempo: + # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/basicauthextension + client_auth: + username: "{{ traces_username }}" + password: "{{ grafana_cloud_api_key }}" + basicauth/grafana_cloud_prometheus: + client_auth: + username: "{{ prometheus_url }}" + password: "{{ grafana_cloud_api_key }}" + basicauth/grafana_cloud_loki: + client_auth: + username: "{{ logs_username }}" + password: "{{ grafana_cloud_api_key }}" + + + otel_collector_receivers: + otlp: + # https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver + protocols: + grpc: + http: + hostmetrics: + # Optional. Host Metrics Receiver added as an example of Infra Monitoring capabilities of the OpenTelemetry Collector + # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/hostmetricsreceiver + scrapers: + load: + memory: + + otel_collector_processors: + batch: + # https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/batchprocessor + resourcedetection: + # Enriches telemetry data with resource information from the host + # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/resourcedetectionprocessor + detectors: ["env", "system"] + override: false + transform/add_resource_attributes_as_metric_attributes: + # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/transformprocessor + error_mode: ignore + metric_statements: + - context: datapoint + statements: + - set(attributes["deployment.environment"], resource.attributes["deployment.environment"]) + - set(attributes["service.version"], resource.attributes["service.version"]) + + otel_collector_exporters: + otlp/grafana_cloud_traces: + # https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/otlpexporter + endpoint: "{{ tempo_url }}" + auth: + authenticator: basicauth/grafana_cloud_tempo + + loki/grafana_cloud_logs: + # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/lokiexporter + endpoint: "{{ loki_url }}" + auth: + authenticator: basicauth/grafana_cloud_loki + + prometheusremotewrite/grafana_cloud_metrics: + # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/prometheusremotewriteexporter + endpoint: "{{ prometheus_url }}" + add_metric_suffixes: false + auth: + authenticator: basicauth/grafana_cloud_prometheus + + + otel_collector_service: + extensions: [basicauth/grafana_cloud_tempo, basicauth/grafana_cloud_prometheus, basicauth/grafana_cloud_loki] + pipelines: + traces: + receivers: [otlp] + processors: [resourcedetection, batch] + exporters: [otlp/grafana_cloud_traces] + metrics: + receivers: [otlp, hostmetrics] + processors: [resourcedetection, transform/add_resource_attributes_as_metric_attributes, batch] + exporters: [prometheusremotewrite/grafana_cloud_metrics] + logs: + receivers: [otlp] + processors: [resourcedetection, batch] + exporters: [loki/grafana_cloud_logs] +``` + +> **Note:** You'll need to adjust the configuration to match the specific telemetry data you intend to collect and where you plan to forward it. The configuration snippet above is a basic example designed for traces, logs and metrics collection via OTLP and forwarding to Grafana Cloud. + + +## Running the Ansible Playbook + +Deploy the OpenTelemetry Collector across your hosts by executing: + +```sh +ansible-playbook deploy-opentelemetry.yml +``` + +## Verifying Data Ingestion into Grafana Cloud + +Once you've deployed the OpenTelemetry Collector and configured it to forward data to Grafana Cloud, you can verify the ingestion: + +- Log into your Grafana Cloud instance. +- Navigate to the **Explore** section. +- Select your Grafana Cloud Prometheus data source from the dropdown menu. +- Execute a query to confirm the reception of metrics, e.g., `{instance="ubuntu-01"}` for a specific host's metrics. + +## Visualizing Metrics and Logs in Grafana + +With data successfully ingested into Grafana Cloud, you can create custom dashboards to visualize the metrics, logs and traces received from your OpenTelemetry Collector. Utilize Grafana's powerful query builder and visualization tools to derive insights from your data effectively. + +- Consider creating dashboards that offer a comprehensive overview of your infrastructure's health and performance. +- Utilize Grafana's alerting features to proactively manage and respond to issues identified through the OpenTelemetry data. + +This guide simplifies the deployment of the OpenTelemetry Collector across multiple Linux hosts using Ansible and illustrates how to visualize collected telemetry data in Grafana Cloud. Tailor the Ansible roles, OpenTelemetry Collector configurations, and Grafana dashboards to suit your specific monitoring and observability requirements. diff --git a/ansible_collections/grafana/grafana/examples/monitor-multiple-instances.md b/ansible_collections/grafana/grafana/examples/monitor-multiple-instances-agent.md index d624c7ec4..d624c7ec4 100644 --- a/ansible_collections/grafana/grafana/examples/monitor-multiple-instances.md +++ b/ansible_collections/grafana/grafana/examples/monitor-multiple-instances-agent.md diff --git a/ansible_collections/grafana/grafana/examples/opentelemetry-collector.yml b/ansible_collections/grafana/grafana/examples/opentelemetry-collector.yml new file mode 100644 index 000000000..445a3a265 --- /dev/null +++ b/ansible_collections/grafana/grafana/examples/opentelemetry-collector.yml @@ -0,0 +1,43 @@ +- name: Install OpenTelemetry Collector + hosts: all + become: true + + tasks: + - name: Install OpenTelemetry Collector + ansible.builtin.include_role: + name: grafana.grafana.opentelemetry_collector + vars: + otel_collector_receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + otel_collector_processors: + batch: + + otel_collector_exporters: + otlp: + endpoint: otelcol:4317 + + otel_collector_extensions: + health_check: + pprof: + zpages: + + otel_collector_service: + extensions: [health_check, pprof, zpages] + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] diff --git a/ansible_collections/grafana/grafana/examples/promtail-multiple-logs.yml b/ansible_collections/grafana/grafana/examples/promtail-multiple-logs.yml new file mode 100644 index 000000000..d49f542ad --- /dev/null +++ b/ansible_collections/grafana/grafana/examples/promtail-multiple-logs.yml @@ -0,0 +1,24 @@ +--- +- name: Deploy Promtail to ship logs to the local Loki instance + hosts: all + become: true + roles: + - role: grafana.grafana.promtail + vars: + promtail_clients: + - url: http://localhost:3100/loki/api/v1/push + promtail_scrape_configs: + - job_name: system + static_configs: + - targets: + - localhost + labels: + job: messages + instance: "{{ ansible_fqdn }}" + __path__: /var/log/messages + - targets: + - localhost + labels: + job: nginx + instance: "{{ ansible_fqdn }}" + __path__: /var/log/nginx/*.log diff --git a/ansible_collections/grafana/grafana/plugins/modules/cloud_plugin.py b/ansible_collections/grafana/grafana/plugins/modules/cloud_plugin.py index 9383beb05..6e28f0f88 100644 --- a/ansible_collections/grafana/grafana/plugins/modules/cloud_plugin.py +++ b/ansible_collections/grafana/grafana/plugins/modules/cloud_plugin.py @@ -14,7 +14,7 @@ author: version_added: "0.0.1" short_description: Manage Grafana Cloud Plugins description: - - Create, Update and delete Grafana Cloud stacks using Ansible. + - Create, Update and delete Grafana Cloud plugins using Ansible. requirements: [ "requests >= 1.0.0" ] notes: - Does not support C(check_mode). diff --git a/ansible_collections/grafana/grafana/requirements.txt b/ansible_collections/grafana/grafana/requirements.txt index aff353eae..2d38dea57 100644 --- a/ansible_collections/grafana/grafana/requirements.txt +++ b/ansible_collections/grafana/grafana/requirements.txt @@ -1,3 +1,3 @@ -yamllint==1.33.0 -ansible-lint>=6.13.1, <7.0.0 -pylint>=2.16.2,<3.0.0 +yamllint==1.35.1 +ansible-lint>=6.13.1, <25.0.0 +pylint>=2.16.2,<4.0.0 diff --git a/ansible_collections/grafana/grafana/requirements.yml b/ansible_collections/grafana/grafana/requirements.yml index c1917b408..8d80a4d22 100644 --- a/ansible_collections/grafana/grafana/requirements.yml +++ b/ansible_collections/grafana/grafana/requirements.yml @@ -4,3 +4,5 @@ collections: type: git - name: https://github.com/ansible-collections/community.grafana.git type: git + - name: https://github.com/ansible-collections/ansible.posix.git + type: git diff --git a/ansible_collections/grafana/grafana/roles/alloy/README.md b/ansible_collections/grafana/grafana/roles/alloy/README.md new file mode 100644 index 000000000..f1f0198b4 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/README.md @@ -0,0 +1,71 @@ +# Ansible Role for Alloy + +This Ansible role to install and configure [Alloy](https://grafana.com/docs/alloy/latest/), which can be used to collect traces, metrics, and logs. + +## Requirements + +Please ensure that `curl` is intalled on Ansible controller. + +## Role Variables + +Available variables with their default values are listed below (`defaults/main.yml`): + +## Role Variables + +| Variable Name | Description | Default Value | +|-----------------------|----------------------------------------------------------------------|---------------------------------------------------------------------| +| `version` | The version of Grafana Alloy to be installed. | "1.0.0" | +| `arch_mapping` | A mapping of common architecture names to Grafana Alloy binaries. | `{'x86_64': 'amd64', 'aarch64': 'arm64', 'armv7l': 'armhf', 'i386': 'i386', 'ppc64le': 'ppc64le'}` | +| `arch` | The architecture of the current machine. | Based on `ansible_architecture` lookup, defaults to 'amd64'. | +| `binary_url` | URL to Grafana Alloy binary for the specific version and architecture. | Constructed URL based on `version` and `arch` variables. | +| `service_name` | The name to be used for the Grafana Alloy service. | "alloy" | +| `installation_dir` | Directory where Grafana Alloy is to be installed. | "/etc/alloy" | +| `environment_file` | Name of the environment file for the Grafana Alloy service. | "service.env" | +| `config_dir` | Directory for Grafana Alloy configuration. | "/etc/alloy" | +| `config_file` | Configuration file name for Grafana Alloy. | "config.river" | +| `service_user` | User under which the Grafana Alloy service will run. | "alloy" | +| `service_group` | Group under which the Grafana Alloy service will run. | "alloy" | +| `working_dir` | Working directory for the Grafana Alloy service. | "/etc/alloy" | +| `env_file_vars` | Additional environment variables to be set in the service environment file. | {} (Empty dictionary) | +| `alloy_flags_extra` | Extra flags to pass to the Alloy service. | {} (Empty dictionary) | +| `start_after_service` | Specify an optional dependency service Alloy should start after. | '' (Empty string) | +| `config` | Configuration template for Grafana Alloy. | Configuration script with Prometheus scrape and remote_write setup | + + +## Example Playbook + +Including an example of how to use your role: +```yaml +- name: Install alloy + hosts: all + become: true + + tasks: + - name: Install alloy + ansible.builtin.include_role: + name: grafana.grafana.alloy + vars: + config: | + prometheus.scrape "default" { + targets = [{"__address__" = "localhost:12345"}] + forward_to = [prometheus.remote_write.prom.receiver] + } + prometheus.remote_write "prom" { + endpoint { + url = "https://prometheus-prod-13-prod-us-east-0.grafana.net/api/prom/push" + + basic_auth { + username = "149xxx" + password = "glc_xxx" + } + } + } +``` + +## License + +See [LICENSE](https://github.com/grafana/grafana-ansible-collection/blob/main/LICENSE) + +## Author Information + +- [Ishan Jain](https://github.com/ishanjainn) diff --git a/ansible_collections/grafana/grafana/roles/alloy/defaults/main.yml b/ansible_collections/grafana/grafana/roles/alloy/defaults/main.yml new file mode 100644 index 000000000..e9de09732 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/defaults/main.yml @@ -0,0 +1,45 @@ +version: "1.0.0" + +arch_mapping: + x86_64: amd64 + aarch64: arm64 + armv7l: armhf + i386: i386 + ppc64le: ppc64le + +arch: "{{ arch_mapping[ansible_architecture] | default('amd64') }}" + +binary_url: "https://github.com/grafana/alloy/releases/download/v{{ version }}/alloy-linux-{{ arch }}.zip" + +service_name: "alloy" + +installation_dir: "/etc/alloy" + +environment_file: "service.env" + +config_dir: "/etc/alloy" + +config_file: "config.alloy" + +service_user: "alloy" + +service_group: "alloy" + +working_dir: "/etc/alloy" + +env_file_vars: {} + +alloy_flags_extra: {} + +start_after_service: '' + +config: | + prometheus.scrape "default" { + targets = [{"__address__" = "localhost:12345"}] + forward_to = [prometheus.remote_write.prom.receiver] + } + prometheus.remote_write "prom" { + endpoint { + url = "http://mimir:9009/api/v1/push" + } + } diff --git a/ansible_collections/grafana/grafana/roles/alloy/handlers/main.yml b/ansible_collections/grafana/grafana/roles/alloy/handlers/main.yml new file mode 100644 index 000000000..40d72dec7 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/handlers/main.yml @@ -0,0 +1,5 @@ +- name: Restart alloy + ansible.builtin.systemd: + name: "{{ service_name }}" + state: restarted + become: true diff --git a/ansible_collections/grafana/grafana/roles/alloy/meta/main.yml b/ansible_collections/grafana/grafana/roles/alloy/meta/main.yml new file mode 100644 index 000000000..589eb2fbc --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/meta/main.yml @@ -0,0 +1,24 @@ +galaxy_info: + author: Ishan Jain + description: Role to Install and Configure Grafana Alloy + license: "GPL-3.0-or-later" + min_ansible_version: "2.11" + platforms: + - name: Fedora + versions: + - "all" + - name: Debian + versions: + - "all" + - name: Ubuntu + versions: + - "all" + - name: EL + versions: + - "all" + galaxy_tags: + - grafana + - observability + - monitoring + - opentelemetry + - telemetry diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/configure.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/configure.yml new file mode 100644 index 000000000..6a9f7790a --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/tasks/configure.yml @@ -0,0 +1,28 @@ +- name: Create alloy config directory + ansible.builtin.file: + path: "{{ config_dir }}" + state: directory + owner: "{{ service_user }}" + group: "{{ service_group }}" + mode: '0755' + become: true + +- name: Deploy alloy configuration file + ansible.builtin.template: + src: config.alloy.j2 + dest: "{{ config_dir }}/{{ config_file }}" + owner: "{{ service_user }}" + group: "{{ service_group }}" + mode: '0644' + notify: Restart alloy + become: true + +- name: Deploy alloy environment file + ansible.builtin.template: + src: environment.j2 + dest: "{{ config_dir }}/{{ environment_file }}" + owner: "{{ service_user }}" + group: "{{ service_group }}" + mode: '0644' + notify: Restart alloy + become: true diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/install.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/install.yml new file mode 100644 index 000000000..967d73c3f --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/tasks/install.yml @@ -0,0 +1,51 @@ +- name: Install unzip + ansible.builtin.package: + name: unzip + state: present + become: true + +- name: Create alloy group + ansible.builtin.group: + name: "{{ service_group }}" + system: true + become: true + +- name: Create alloy user + ansible.builtin.user: + name: "{{ service_user }}" + group: "{{ service_group }}" + system: true + create_home: false # Appropriate for a system user, usually doesn't need a home directory + become: true + +- name: Download alloy binary + ansible.builtin.get_url: + url: "{{ binary_url }}" + dest: "/tmp/alloy-{{ version }}.zip" + mode: '0755' + become: true + register: download_result + +- name: Remove existing alloy installation directory + ansible.builtin.file: + path: "{{ installation_dir }}" + state: absent + become: true + when: download_result.changed + +- name: Create alloy installation directory + ansible.builtin.file: + path: "{{ installation_dir }}" + state: directory + mode: '0755' + owner: "{{ service_user }}" + group: "{{ service_group }}" + become: true + +- name: Extract alloy binary + ansible.builtin.unarchive: + src: "/tmp/alloy-{{ version }}.zip" + dest: "{{ installation_dir }}" + remote_src: yes + become: true + register: extract_result diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/main.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/main.yml new file mode 100644 index 000000000..49a6dd69a --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/tasks/main.yml @@ -0,0 +1,11 @@ +- name: Install alloy + include_tasks: install.yml + tags: [install] + +- name: Configure alloy + include_tasks: configure.yml + tags: [configure] + +- name: Manage alloy service + include_tasks: service.yml + tags: [service] diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/service.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/service.yml new file mode 100644 index 000000000..0d5d42afe --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/tasks/service.yml @@ -0,0 +1,19 @@ +- name: Copy alloy systemd unit file + ansible.builtin.template: + src: alloy.service.j2 + dest: /etc/systemd/system/{{ service_name }}.service + mode: '0644' + become: true + notify: Restart alloy + +- name: Reload systemd daemon to pick up changes + ansible.builtin.systemd: + daemon_reload: yes + become: true + +- name: Ensure alloy service is enabled and running + ansible.builtin.service: + name: "{{ service_name }}" + enabled: yes + state: started + become: true diff --git a/ansible_collections/grafana/grafana/roles/alloy/templates/alloy.service.j2 b/ansible_collections/grafana/grafana/roles/alloy/templates/alloy.service.j2 new file mode 100644 index 000000000..5e56b3306 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/templates/alloy.service.j2 @@ -0,0 +1,32 @@ +[Unit] +Description=Vendor-neutral programmable observability pipelines. +Documentation=https://grafana.com/docs/alloy/ +Wants=network-online.target +After=network-online.target{{ ' ' + start_after_service if start_after_service is defined else '' }} + +[Service] +Restart=always +User={{ service_user }} +Group={{ service_group }} +Environment=HOSTNAME=%H +EnvironmentFile={{ installation_dir }}/{{ environment_file }} +WorkingDirectory={{ working_dir }} +ExecStart={{ installation_dir }}/alloy-linux-{{ arch }} run \ +{% for flag, flag_value in alloy_flags_extra.items() %} +{% if not flag_value %} + --{{ flag }} \ +{% elif flag_value is string %} + --{{ flag }}={{ flag_value }} \ +{% elif flag_value is sequence %} +{% for flag_value_item in flag_value %} + --{{ flag }}={{ flag_value_item }} \ +{% endfor %} +{% endif %} +{% endfor %} + $CUSTOM_ARGS --storage.path={{ working_dir }} $CONFIG_FILE +ExecReload=/usr/bin/env kill -HUP $MAINPID +TimeoutStopSec=20s +SendSIGKILL=no + +[Install] +WantedBy=multi-user.target diff --git a/ansible_collections/grafana/grafana/roles/alloy/templates/config.alloy.j2 b/ansible_collections/grafana/grafana/roles/alloy/templates/config.alloy.j2 new file mode 100644 index 000000000..26278f366 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/templates/config.alloy.j2 @@ -0,0 +1 @@ +{{ config }} diff --git a/ansible_collections/grafana/grafana/roles/alloy/templates/environment.j2 b/ansible_collections/grafana/grafana/roles/alloy/templates/environment.j2 new file mode 100644 index 000000000..5d6de6a61 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/alloy/templates/environment.j2 @@ -0,0 +1,10 @@ +{{ ansible_managed | comment }} +# Grafana Alloy Environment File +CONFIG_FILE="{{ config_dir }}/{{ config_file }}" + +GOMAXPROCS={{ ansible_processor_vcpus|default(ansible_processor_count) }} +RESTART_ON_UPGRADE=true + +{% for key, value in env_file_vars.items() %} +{{key}}={{value}} +{% endfor %} diff --git a/ansible_collections/grafana/grafana/roles/grafana/README.md b/ansible_collections/grafana/grafana/roles/grafana/README.md index eb00b3f25..c5aa738f5 100644 --- a/ansible_collections/grafana/grafana/roles/grafana/README.md +++ b/ansible_collections/grafana/grafana/roles/grafana/README.md @@ -107,6 +107,18 @@ grafana_alert_notifications: uid: channel2 ``` +**NOTE 2**: setting the `http_addr`,`http_port`,`domain` and `root_url` parameters under the `grafana_server` variable has no effect, the `grafana_address`, `grafana_port`, `grafana_domain` and `grafana_url` values are used instead ( from [defaults/main.yml](defaults/main.yml) or as set variables). +An example snippet: +```yaml +grafana_domain: "{{ inventory_hostname }}" +grafana_url: "https://{{ inventory_hostname }}:3000" +grafana_address: 0.0.0.0 +grafana_port: 3000 + +grafana_server: + enforce_domain: false +``` + ## Supported CPU Architectures Historically packages were taken from different channels according to CPU architecture. Specifically, armv6/armv7 and aarch64/arm64 packages were via [unofficial packages distributed by fg2it](https://github.com/fg2it/grafana-on-raspberry). Now that Grafana publishes official ARM builds, all packages are taken from the official [Debian/Ubuntu](http://docs.grafana.org/installation/debian/#installing-on-debian-ubuntu) or [RPM](http://docs.grafana.org/installation/rpm/) packages. diff --git a/ansible_collections/grafana/grafana/roles/grafana/defaults/main.yml b/ansible_collections/grafana/grafana/roles/grafana/defaults/main.yml index 12f3d7cc7..3c640973c 100644 --- a/ansible_collections/grafana/grafana/roles/grafana/defaults/main.yml +++ b/ansible_collections/grafana/grafana/roles/grafana/defaults/main.yml @@ -145,6 +145,21 @@ grafana_ldap: {} # - group_dn: "cn=alternative_admins,ou=groups,dc=grafana,dc=org" # org_role: Admin +# Grafana KeyCloak auth +grafana_auth_generic_oauth: {} +# enabled: true +# name: "Keycloak-OAuth" +# allow_sign_up: true +# client_id: YOUR_APP_CLIENT_ID +# client_secret: YOUR_APP_CLIENT_SECRET +# scopes: "openid email profile offline_access roles" +# email_attribute_path: email +# login_attribute_path: username +# name_attribute_path: full_name +# auth_url: "https://<PROVIDER_DOMAIN>/realms/<REALM_NAME>/protocol/openid-connect/auth" +# token_url: "https://<PROVIDER_DOMAIN>/realms/<REALM_NAME>/protocol/openid-connect/token" +# api_url: "https://<PROVIDER_DOMAIN>/realms/<REALM_NAME>/protocol/openid-connect/userinfo" + grafana_session: {} # provider: file # provider_config: "sessions" diff --git a/ansible_collections/grafana/grafana/roles/grafana/meta/main.yml b/ansible_collections/grafana/grafana/roles/grafana/meta/main.yml index 564b8bcc5..a8dbc3343 100644 --- a/ansible_collections/grafana/grafana/roles/grafana/meta/main.yml +++ b/ansible_collections/grafana/grafana/roles/grafana/meta/main.yml @@ -2,7 +2,7 @@ galaxy_info: author: "Grafana" description: "Grafana - platform for analytics and monitoring" - license: "MIT" + license: "GPL-3.0-or-later" min_ansible_version: "2.9" platforms: - name: Ubuntu diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/dashboards.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/dashboards.yml index c3f154f7b..3fedb1f4d 100644 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/dashboards.yml +++ b/ansible_collections/grafana/grafana/roles/grafana/tasks/dashboards.yml @@ -116,6 +116,8 @@ ansible.builtin.copy: src: "{{ item }}" dest: "{{ grafana_data_dir }}/dashboards/{{ item | basename }}" + owner: root + group: grafana mode: "0640" with_fileglob: - "{{ __tmp_dashboards.path }}/*" diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/datasources.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/datasources.yml index 6fc56ed3c..70b114516 100644 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/datasources.yml +++ b/ansible_collections/grafana/grafana/roles/grafana/tasks/datasources.yml @@ -5,7 +5,7 @@ grafana_user: "{{ grafana_security.admin_user }}" grafana_password: "{{ grafana_security.admin_password }}" name: "{{ item.name }}" - url: "{{ item.url }}" + ds_url: "{{ item.url }}" ds_type: "{{ item.type }}" access: "{{ item.access | default(omit) }}" is_default: "{{ item.isDefault | default(omit) }}" diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/preflight.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/preflight.yml index d209abc5d..60f104428 100644 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/preflight.yml +++ b/ansible_collections/grafana/grafana/roles/grafana/tasks/preflight.yml @@ -34,7 +34,7 @@ - name: "Fail on bad database configuration" ansible.builtin.fail: - msg: "Wrong database configuration. Please look at http://docs.grafana.org/installation/configuration/#database" + msg: "Invalid database configuration. Please look at http://docs.grafana.org/installation/configuration/#database" when: "( grafana_database.type == 'sqlite3' and grafana_database.url is defined ) or ( grafana_database.type != 'sqlite3' and grafana_database.path is defined ) or ( grafana_database.type == 'sqlite3' and grafana_database.host is defined ) or @@ -42,12 +42,19 @@ ( grafana_database.type == 'sqlite3' and grafana_database.password is defined ) or ( grafana_database.type == 'sqlite3' and grafana_database.server_cert_name is defined )" -- name: "Fail when grafana domain isn't properly configured" - ansible.builtin.fail: - msg: "Check server configuration. Please look at http://docs.grafana.org/installation/configuration/#server" - when: - - "grafana_server.root_url is defined" - - "grafana_server.root_url is search(grafana_server.domain)" +- name: "Fail when grafana_server isn't properly configured" + ansible.builtin.assert: + that: item.option not in grafana_server + fail_msg: "Invalid grafana_server configuration parameter: {{ item.option }}. Use variable {{ item.role_var }} instead" + loop: + - option: http_addr + role_var: grafana_address + - option: http_port + role_var: grafana_port + - option: domain + role_var: grafana_domain + - option: root_url + role_var: grafana_url - name: "Fail when grafana_api_keys uses invalid role names" ansible.builtin.fail: diff --git a/ansible_collections/grafana/grafana/roles/grafana/templates/grafana.ini.j2 b/ansible_collections/grafana/grafana/roles/grafana/templates/grafana.ini.j2 index df6eab14f..a18af8bea 100644 --- a/ansible_collections/grafana/grafana/roles/grafana/templates/grafana.ini.j2 +++ b/ansible_collections/grafana/grafana/roles/grafana/templates/grafana.ini.j2 @@ -212,3 +212,11 @@ provider = {{ grafana_image_storage.provider }} {{ k }} = {{ v }} {% endfor %} {% endif %} + +# Oauth_Keycloack +{% if grafana_auth_generic_oauth != {} %} +[auth.generic_oauth] +{% for k,v in grafana_auth_generic_oauth.items() %} +{{ k }} = {{ v }} +{% endfor %} +{% endif %} diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/README.md b/ansible_collections/grafana/grafana/roles/grafana_agent/README.md index 6e7eaa942..5301aa58c 100644 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/README.md +++ b/ansible_collections/grafana/grafana/roles/grafana_agent/README.md @@ -1,4 +1,7 @@ -# Role Name +|![](https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Warning.svg/156px-Warning.svg.png) | This Ansible role is now in maintenance mode only. We recommend using the Grafana Alloy Role for future deployments and updates. +|---|---| + +# Ansible Role for Grafana Agent Ansible Role to deploy Grafana Agent on Linux hosts. Using this Role, Grafana Agent can be deployed on RedHat, Ubuntu, Debian, CentOS and Fedora linux distributions. @@ -22,6 +25,7 @@ All variables which can be overridden are stored in [./defaults/main.yaml](./def | `grafana_agent_config_dir` | `/etc/grafana-agent` | directory to store the configuration files in | | `grafana_agent_config_filename` | `config.yaml` | name of the configuration file for the agent | | `grafana_agent_env_file` | `service.env` | name of the environment file loaded by the system unit file | +| `grafana_agent_service_extra` | "" | dictionary of additional custom settings for the systemd service file | | `grafana_agent_local_tmp_dir` | `/tmp/grafana-agent` | temporary directory to create on the controller/localhost where the archive will be downloaded to | | `grafana_agent_data_dir` | `/var/lib/grafana-agent` | the data directory to create for the wal and positions | | `grafana_agent_wal_dir` | `"{{ grafana_agent_data_dir }}/data"` | wal directory to use, should be a sub-folder of grafana_agent_data_dir, will automatically be created when the agent starts | diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/defaults/main.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/defaults/main.yaml index 4ea702db0..31acc5bc6 100644 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/defaults/main.yaml +++ b/ansible_collections/grafana/grafana/roles/grafana_agent/defaults/main.yaml @@ -20,6 +20,9 @@ grafana_agent_config_filename: config.yaml # name of the environment file loaded by the system unit file grafana_agent_env_file: service.env +# dictionary of additional custom settings for the systemd service file +grafana_agent_service_extra: {} + # temporary directory to create on the controller/localhost where the archive will be downloaded to grafana_agent_local_tmp_dir: /tmp/grafana-agent diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/templates/grafana-agent.service.j2 b/ansible_collections/grafana/grafana/roles/grafana_agent/templates/grafana-agent.service.j2 index 8a52b5c53..b4d5bcef6 100644 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/templates/grafana-agent.service.j2 +++ b/ansible_collections/grafana/grafana/roles/grafana_agent/templates/grafana-agent.service.j2 @@ -14,6 +14,9 @@ WorkingDirectory={{ grafana_agent_data_dir }} Environment={{key}}={{value}} {% endfor %} EnvironmentFile={{ grafana_agent_config_dir }}/{{ grafana_agent_env_file}} +{% for key, value in grafana_agent_service_extra.items() %} +{{ key }}={{ value }} +{% endfor %} {% if grafana_agent_mode == 'flow' %} ExecStart={{ grafana_agent_install_dir }}/{{ grafana_agent_binary }} run \ diff --git a/ansible_collections/grafana/grafana/roles/loki/README.md b/ansible_collections/grafana/grafana/roles/loki/README.md new file mode 100644 index 000000000..73ee99554 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/README.md @@ -0,0 +1,238 @@ +# Ansible role - Loki + +[![License](https://img.shields.io/github/license/grafana/grafana-ansible-collection)](LICENSE) + +The Ansible Loki Role allows you to effortlessly deploy and manage [Loki](https://grafana.com/oss/loki/), the log aggregation system. This role is tailored for operating systems such as **RedHat**, **Rocky Linux**, **AlmaLinux**, **Ubuntu**, and **Debian**. + +**๐ Key Features** +- **๐ฆ Out-of-the-box Deployment**: Get Loki up and running quickly with default configurations. +- **๐งน Effortless Uninstall**: Easily remove Loki from your system using the "loki_uninstall" tag. +- **๐ Example Alerting Rules**: Benefit from the included sample Ruler configuration. Utilize the provided example alerting rules as a reference guide for structuring your own rules effectively. + +## Table of Content + +- [Requirements](#requirements) +- [Role Variables](#role-variables) +- - [Default Variables - `defaults/main.yml`](#default-variables---defaultsmainyml) +- - [Alerting Rules Variables](#alerting-rules-variables) +- - [Additional Config Variables for `/etc/loki/config.yml`](#additional-config-variables-for-etclokiconfigyml) +- [Playbook](#playbook) + +## Requirements + +- Ansible 2.10+ + +## Role Variables + +- ๐ Official Loki configuration [documentation](https://grafana.com/docs/loki/latest/configuration/) +- ๐๏ธ Upgrading Loki [documentation](https://grafana.com/docs/loki/latest/upgrading/) + +### **Default Variables - `defaults/main.yml`** + +```yaml +loki_version: "latest" +``` +The version of Loki to download and deploy. Supported standard version "3.0.0" format or "latest". + +```yaml +loki_http_listen_port: 3100 +``` +The TCP port on which Loki listens. By default, it listens on port `3100`. + +```yaml +loki_http_listen_address: "0.0.0.0" +``` +The address on which Loki listens for HTTP requests. By default, it listens on all interfaces. + +```yaml +loki_expose_port: false +``` +By default, this is set to `false`. It supports only simple `firewalld` configurations. If set to `true`, a firewalld rule is added to expose the TCP `loki_http_listen_port`. If set to `false`, the system ensures that the rule is not present. If the `firewalld.service` is not active, all firewalld tasks are skipped. + +```yaml +loki_download_url_rpm: "https://github.com/grafana/loki/releases/download/v{{ loki_version }}/loki-{{ loki_version }}.{{ __loki_arch }}.rpm" +``` +The default download URL for the Loki rpm package from GitHub. + +```yaml +loki_download_url_deb: "https://github.com/grafana/loki/releases/download/v{{ loki_version }}/loki_{{ loki_version }}_{{ __loki_arch }}.deb" +``` +The default download URL for the Loki deb package from GitHub. + +```yaml +loki_working_path: "/var/lib/loki" +``` +โ ๏ธ Avoid using `/tmp/loki` as the working path. This role removes the /tmp/loki directory and replaces it with the specified working path to ensure a permanent configuration. + +```yaml +loki_ruler_alert_path: "{{ loki_working_path }}/rules/fake" +``` +The variable defines the location where the `ruler` configuration `alerts` are stored. +โ ๏ธ Please note that the role currently does not support multi-tenancy for alerting, so there is no need to modify this variable for different tenants. + +```yaml +loki_auth_enabled: false +``` +Enables authentication through the X-Scope-OrgID header, which must be present if `true`. If `false`, the OrgID will always be set to `fake`. + +```yaml +loki_target: "all" +``` +A comma-separated list of components to run. The default value 'all' runs Loki in single binary mode. +Supported values: `all`, `compactor`, `distributor`, `ingester`, `querier`, `query-scheduler`, `ingester-querier`, `query-frontend`, `index-gateway`, `ruler`, `table-manager`, `read`, `write`. + +```yaml +loki_ballast_bytes: 0 +``` +The amount of virtual memory in bytes to reserve as ballast in order to optimize garbage collection. + +```yaml +loki_server: + http_listen_address: "{{ loki_http_listen_address }}" + http_listen_port: "{{ loki_http_listen_port }}" + grpc_listen_port: 9096 +``` +Configures the `server` of the launched module(s). [All possible values for `server`](https://grafana.com/docs/loki/latest/configuration/#server) + +```yaml +loki_common: + instance_addr: 127.0.0.1 + path_prefix: "{{ loki_working_path }}" + storage: + filesystem: + chunks_directory: "{{ loki_working_path }}/chunks" + rules_directory: "{{ loki_working_path }}/rules" + replication_factor: 1 + ring: + kvstore: + store: inmemory +``` +Common configuration to be shared between multiple modules. If a more specific configuration is given in other sections, the related configuration within this section will be ignored. [All possible values for `common`](https://grafana.com/docs/loki/latest/configuration/#common) + +```yaml +loki_query_range: + results_cache: + cache: + embedded_cache: + enabled: true + max_size_mb: 100 +``` +The `query_range` block configures the query splitting and caching in the Loki query-frontend. [All possible values for `query_range`](https://grafana.com/docs/loki/latest/configuration/#query_range) + +```yaml +loki_schema_config: + configs: + - from: 2020-10-24 + store: tsdb + object_store: filesystem + schema: v13 + index: + prefix: index_ + period: 24h +``` +Configures the chunk index schema and where it is stored. [All possible values for `schema_config`](https://grafana.com/docs/loki/latest/configuration/#schema_config) + +```yaml +loki_ruler: + storage: + type: local + local: + directory: "{{ loki_working_path }}/rules" + rule_path: "{{ loki_working_path }}/rules_tmp" + ring: + kvstore: + store: inmemory + enable_api: true + enable_alertmanager_v2: true + alertmanager_url: http://localhost:9093 +``` +The `ruler` block configures the Loki ruler. [All possible values for `ruler`](https://grafana.com/docs/loki/latest/configuration/#ruler) + +```yaml +loki_analytics: + reporting_enabled: false +``` +Enable anonymous usage reporting. Disabled by default. + + +### **Alerting Rules Variables** +(not set by default) + +```yaml +--- +loki_ruler_alerts: + - name: Logs.Nextcloud + rules: + - alert: NextcloudLoginFailed + expr: | + count by (filename,env,job) (count_over_time({job=~"nextcloud"} | json | message=~"Login failed.*" [10m])) > 4 + for: 0m + labels: + severity: critical + annotations: + summary: "{% raw %}On {{ $labels.job }} in log {{ $labels.filename }} failed login detected.{% endraw %}" + - name: Logs.sshd + rules: + - alert: SshLoginFailed + expr: | + count_over_time({job=~"secure"} |="sshd[" |~": Failed|: Invalid|: Connection closed by authenticating user" | __error__="" [15m]) > 15 + for: 0m + labels: + severity: critical + annotations: + summary: "{% raw %}SSH authentication failure (instance {{ $labels.instance }}).{% endraw %}" +``` +Example alerting rule configuration. You can add multiple alerting rules to suit your requirements. Please note that the alerting rules are not templated by default + +### **Additional Config Variables for `/etc/loki/config.yml`** +(not set by default) + +Below variables allow you to extend Loki configuration to fit your needs. Always refer to official [Loki configuration](https://grafana.com/docs/loki/latest/configuration/) to obtain possible configuration parameters. + +| Variable Name | Description +| ----------- | ----------- | +| `loki_distributor` | Configures the `distributor`. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#distributor) +| `loki_querier` | Configures the `querier`. Only appropriate when running all modules or just the querier. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#querier) +| `loki_query_scheduler` | The `query_scheduler` block configures the Loki query scheduler. When configured it separates the tenant query queues from the query-frontend. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#query_scheduler) +| `loki_frontend` | The `frontend` block configures the Loki query-frontend. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#frontend) +| `loki_ingester_client` | The `ingester_client` block configures how the distributor will connect to ingesters. Only appropriate when running all components, the distributor, or the querier. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#ingester_client) +| `loki_ingester` | The `ingester` block configures the ingester and how the ingester will register itself to a key value store. ๐ configuration [documentation](https://grafana.com/docs/loki/latest/configuration/#ingester) +| `loki_index_gateway` | The `index_gateway` block configures the Loki index gateway server, responsible for serving index queries without the need to constantly interact with the object store. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#index_gateway) +| `loki_storage_config` | The `storage_config` block configures one of many possible stores for both the index and chunks. Which configuration to be picked should be defined in schema_config block. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#storage_config) +| `loki_chunk_store_config` | The `chunk_store_config` block configures how chunks will be cached and how long to wait before saving them to the backing store. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#chunk_store_config) +| `loki_compactor` | The `compactor` block configures the compactor component, which compacts index shards for performance. ๐ [documentation](https://grafana.com/docs/loki/latest/configure/#compactor) +| `loki_limits_config` | The `limits_config` block configures global and per-tenant limits in Loki. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#limits_config) +| `loki_frontend_worker` | The `frontend_worker` configures the worker - running within the Loki querier - picking up and executing queries enqueued by the query-frontend. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#frontend_worker) +| `loki_table_manager` | The `table_manager` block configures the table manager for retention. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#table_manager) +| `loki_memberlist` | Configuration for memberlist client. Only applies if the selected kvstore is memberlist. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#memberlist) +| `loki_runtime_config` | Configuration for `runtime config` module, responsible for reloading runtime configuration file. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#runtime_config) +| `loki_operational_config` | These are values which allow you to control aspects of Loki's operation, most commonly used for controlling types of higher verbosity logging, the values here can be overridden in the configs section of the `runtime_config` file. ๐ [documentation](https://grafana.com/docs/loki/latest/configure/#operational_config) +| `loki_tracing` | Configuration for tracing. ๐ [documentation](https://grafana.com/docs/loki/latest/configuration/#tracing) + +## Playbook + +- playbook +```yaml +- name: Manage loki service + hosts: all + become: true + roles: + - role: grafana.grafana.loki +``` + +- Playbook execution example +```shell +# Deployment +ansible-playbook -i inventory/hosts playbook/function_loki_play.yml + +# Uninstall +ansible-playbook -i inventory/hosts playbook/function_loki_play.yml -t loki_uninstall +``` + +## License + +See [LICENSE](https://github.com/grafana/grafana-ansible-collection/blob/main/LICENSE) + +## Author Information + +- [VoidQuark](https://github.com/voidquark) diff --git a/ansible_collections/grafana/grafana/roles/loki/defaults/main.yml b/ansible_collections/grafana/grafana/roles/loki/defaults/main.yml new file mode 100644 index 000000000..ee712bb23 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/defaults/main.yml @@ -0,0 +1,107 @@ +--- +# defaults file for loki +loki_version: "latest" +loki_http_listen_port: 3100 +loki_http_listen_address: "0.0.0.0" +loki_expose_port: false +loki_download_url_rpm: "https://github.com/grafana/loki/releases/download/v{{ loki_version }}/loki-{{ loki_version }}.{{ __loki_arch }}.rpm" +loki_download_url_deb: "https://github.com/grafana/loki/releases/download/v{{ loki_version }}/loki_{{ loki_version }}_{{ __loki_arch }}.deb" +loki_working_path: "/var/lib/loki" +loki_ruler_alert_path: "{{ loki_working_path }}/rules/fake" + +# Default Variables for /etc/loki/config.yml +loki_auth_enabled: false +loki_target: "all" +loki_ballast_bytes: 0 + +loki_server: + http_listen_address: "{{ loki_http_listen_address }}" + http_listen_port: "{{ loki_http_listen_port }}" + grpc_listen_port: 9096 + +loki_common: + instance_addr: 127.0.0.1 + path_prefix: "{{ loki_working_path }}" + storage: + filesystem: + chunks_directory: "{{ loki_working_path }}/chunks" + rules_directory: "{{ loki_working_path }}/rules" + replication_factor: 1 + ring: + kvstore: + store: inmemory + +loki_query_range: + results_cache: + cache: + embedded_cache: + enabled: true + max_size_mb: 100 + +loki_schema_config: + configs: + - from: 2020-10-24 + store: tsdb + object_store: filesystem + schema: v13 + index: + prefix: index_ + period: 24h + +loki_ruler: + storage: + type: local + local: + directory: "{{ loki_working_path }}/rules" + rule_path: "{{ loki_working_path }}/rules_tmp" + ring: + kvstore: + store: inmemory + enable_api: true + enable_alertmanager_v2: true + alertmanager_url: http://localhost:9093 + +loki_analytics: + reporting_enabled: false + +# Alerting Rules Variables +# loki_ruler_alerts: +# - name: Logs.Nextcloud +# rules: +# - alert: NextcloudLoginFailed +# expr: | +# count by (filename,env,job) (count_over_time({job=~"nextcloud"} | json | message=~"Login failed.*" [10m])) > 4 +# for: 0m +# labels: +# severity: critical +# annotations: +# summary: "{% raw %}On {{ $labels.job }} in log {{ $labels.filename }} failed login detected.{% endraw %}" +# - name: Logs.sshd +# rules: +# - alert: SshLoginFailed +# expr: | +# count_over_time({job=~"secure"} |="sshd[" |~": Failed|: Invalid|: Connection closed by authenticating user" | __error__="" [15m]) > 15 +# for: 0m +# labels: +# severity: critical +# annotations: +# summary: "{% raw %}SSH authentication failure (instance {{ $labels.instance }}).{% endraw %}" + +# Additional Config Variables for /etc/loki/config.yml +# loki_distributor: +# loki_querier: +# loki_query_scheduler: +# loki_frontend: +# loki_ingester_client: +# loki_ingester: +# loki_index_gateway: +# loki_storage_config: +# loki_chunk_store_config: +# loki_compactor: +# loki_limits_config: +# loki_frontend_worker: +# loki_table_manager: +# loki_memberlist: +# loki_runtime_config: +# loki_operational_config: +# loki_tracing: diff --git a/ansible_collections/grafana/grafana/roles/loki/handlers/main.yml b/ansible_collections/grafana/grafana/roles/loki/handlers/main.yml new file mode 100644 index 000000000..b2326ec66 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/handlers/main.yml @@ -0,0 +1,9 @@ +--- +# handlers file for loki +- name: Restart loki + listen: "restart loki" + ansible.builtin.systemd: + daemon_reload: true + name: loki.service + state: restarted + enabled: true diff --git a/ansible_collections/grafana/grafana/roles/loki/meta/main.yml b/ansible_collections/grafana/grafana/roles/loki/meta/main.yml new file mode 100644 index 000000000..b66e783d3 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/meta/main.yml @@ -0,0 +1,28 @@ +--- +galaxy_info: + role_name: loki + author: voidquark + description: Manage Grafana Loki Application + license: "GPL-3.0-or-later" + min_ansible_version: "2.10" + platforms: + - name: EL + versions: + - "8" + - "9" + - name: Fedora + versions: + - all + - name: Debian + versions: + - all + - name: Ubuntu + versions: + - all + galaxy_tags: + - loki + - grafana + - logging + - monitoring + +dependencies: [] diff --git a/ansible_collections/grafana/grafana/roles/loki/molecule/default/converge.yml b/ansible_collections/grafana/grafana/roles/loki/molecule/default/converge.yml new file mode 100644 index 000000000..1f2ce7f5c --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/molecule/default/converge.yml @@ -0,0 +1,5 @@ +--- +- name: Converge + hosts: all + roles: + - role: grafana.grafana.loki diff --git a/ansible_collections/grafana/grafana/roles/loki/molecule/default/molecule.yml b/ansible_collections/grafana/grafana/roles/loki/molecule/default/molecule.yml new file mode 100644 index 000000000..339965a50 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/molecule/default/molecule.yml @@ -0,0 +1,20 @@ +--- +dependency: + name: galaxy + options: + ignore-errors: true +driver: + name: docker +platforms: + - name: instance + image: "geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux8}-ansible:latest" + command: ${MOLECULE_DOCKER_COMMAND:-""} + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + cgroupns_mode: host + privileged: true + pre_build_image: true +provisioner: + name: ansible + playbooks: + converge: converge.yml diff --git a/ansible_collections/grafana/grafana/roles/loki/tasks/deploy.yml b/ansible_collections/grafana/grafana/roles/loki/tasks/deploy.yml new file mode 100644 index 000000000..65ecaf6f4 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/tasks/deploy.yml @@ -0,0 +1,146 @@ +--- +# tasks file for loki deployment + +- name: Obtain the latest version from the Loki GitHub repo + when: loki_version == "latest" + block: + - name: Scrape Github API endpoint to obtain latest Loki version + ansible.builtin.uri: + url: "https://api.github.com/repos/grafana/loki/releases/latest" + method: GET + body_format: json + become: false + delegate_to: localhost + run_once: true + register: __github_latest_version + + - name: Latest available Loki version + ansible.builtin.set_fact: + loki_version: "{{ __github_latest_version.json.tag_name | regex_replace('^v?(\\d+\\.\\d+\\.\\d+)$', '\\1') }}" + +- name: Verify current deployed version + block: + - name: Check if Loki binary is present + ansible.builtin.stat: + path: "/usr/bin/loki" + register: __already_deployed + + - name: Obtain current deployed Loki version + ansible.builtin.command: + cmd: "/usr/bin/loki --version" + changed_when: false + register: __current_deployed_version + when: __already_deployed.stat.exists | bool + +- name: Include RedHat/Rocky setup + ansible.builtin.include_tasks: + file: setup-RedHat.yml + when: ansible_os_family in ['RedHat', 'Rocky'] + +- name: Include Debian/Ubuntu setup + ansible.builtin.include_tasks: + file: setup-Debian.yml + when: ansible_os_family == 'Debian' + +- name: Check if Loki default dir is present + ansible.builtin.stat: + path: "/tmp/loki/boltdb-shipper-active" + register: __default_structure + +- name: Default structure cleanup + when: __default_structure.stat.exists | bool + block: + - name: Ensure that Loki is stopped before default cleanup + ansible.builtin.systemd: + name: loki.service + state: stopped + + - name: Remove default configuration from "/tmp/loki" directory + ansible.builtin.file: + path: "/tmp/loki" + state: absent + +- name: Ensure that Loki working path exists + ansible.builtin.file: + path: "{{ loki_working_path }}" + state: directory + owner: "loki" + group: "root" + mode: "0755" + +- name: Template Loki config - /etc/loki/config.yml + ansible.builtin.template: + src: "config.yml.j2" + dest: "/etc/loki/config.yml" + owner: "root" + group: "root" + mode: "0644" + validate: "/usr/bin/loki --verify-config -config.file %s" + notify: restart loki + +- name: Ensure that Loki rule path exists + ansible.builtin.file: + path: "{{ loki_ruler_alert_path }}" + state: directory + owner: "loki" + group: "root" + mode: "0750" + when: + - loki_ruler_alert_path is defined + - loki_ruler is defined + +- name: Template Loki Rule File + ansible.builtin.template: + src: "rules.yml.j2" + dest: "{{ loki_ruler_alert_path }}/rules.yml" + owner: "loki" + group: "root" + mode: "0644" + notify: restart loki + when: + - loki_ruler_alerts is defined + - loki_ruler_alert_path is defined + - loki_ruler is defined + +- name: Get firewalld state + ansible.builtin.systemd: + name: "firewalld" + register: __firewalld_service_state + +- name: Enable firewalld rule to expose Loki tcp port {{ loki_http_listen_port }} + ansible.posix.firewalld: + immediate: true + permanent: true + port: "{{ loki_http_listen_port }}/tcp" + state: enabled + when: + - __firewalld_service_state.status.ActiveState == "active" + - loki_expose_port | bool + +- name: Ensure that Loki firewalld rule is not present - tcp port {{ loki_http_listen_port }} + ansible.posix.firewalld: + immediate: true + permanent: true + port: "{{ loki_http_listen_port }}/tcp" + state: disabled + when: + - __firewalld_service_state.status.ActiveState == "active" + - not loki_expose_port | bool + +- name: Flush handlers after deployment + ansible.builtin.meta: flush_handlers + +- name: Ensure that Loki is started + ansible.builtin.systemd: + name: loki.service + state: started + +- name: Verify that Loki URL is responding + ansible.builtin.uri: + url: "http://{{ loki_http_listen_address }}:{{ loki_http_listen_port }}/ready" + method: GET + register: loki_verify_url_status_code + retries: 5 + delay: 8 + until: loki_verify_url_status_code.status == 200 + when: loki_expose_port | bool diff --git a/ansible_collections/grafana/grafana/roles/loki/tasks/main.yml b/ansible_collections/grafana/grafana/roles/loki/tasks/main.yml new file mode 100644 index 000000000..4e0bb741b --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/tasks/main.yml @@ -0,0 +1,23 @@ +--- +# tasks file for loki +- name: Include OS specific variables + ansible.builtin.include_vars: + file: "{{ ansible_os_family }}.yml" + +- name: Deploy Loki service + ansible.builtin.include_tasks: + file: "deploy.yml" + apply: + tags: loki_deploy + tags: loki_deploy + +- name: Uninstall Loki service + ansible.builtin.include_tasks: + file: "uninstall.yml" + apply: + tags: + - loki_uninstall + - never + tags: + - loki_uninstall + - never diff --git a/ansible_collections/grafana/grafana/roles/loki/tasks/setup-Debian.yml b/ansible_collections/grafana/grafana/roles/loki/tasks/setup-Debian.yml new file mode 100644 index 000000000..c71af7f44 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/tasks/setup-Debian.yml @@ -0,0 +1,7 @@ +--- +- name: APT - Install Loki + ansible.builtin.apt: + deb: "{{ loki_download_url_deb }}" + state: present + notify: restart loki + when: __current_deployed_version.stdout is not defined or loki_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/loki/tasks/setup-RedHat.yml b/ansible_collections/grafana/grafana/roles/loki/tasks/setup-RedHat.yml new file mode 100644 index 000000000..91e60c504 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/tasks/setup-RedHat.yml @@ -0,0 +1,8 @@ +--- +- name: DNF - Install Loki from remote URL + ansible.builtin.dnf: + name: "{{ loki_download_url_rpm }}" + state: present + disable_gpg_check: true + notify: restart loki + when: __current_deployed_version.stdout is not defined or loki_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/loki/tasks/uninstall.yml b/ansible_collections/grafana/grafana/roles/loki/tasks/uninstall.yml new file mode 100644 index 000000000..0ac7566c0 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/tasks/uninstall.yml @@ -0,0 +1,51 @@ +--- +# tasks file for loki uninstall + +- name: Stop Loki service + ansible.builtin.systemd: # noqa ignore-errors + name: loki + state: stopped + ignore_errors: true + +- name: Uninstall Loki rpm package + ansible.builtin.dnf: + name: "loki" + state: absent + autoremove: true + when: ansible_os_family in ['RedHat', 'Rocky'] + +- name: Uninstall Loki deb package + ansible.builtin.apt: + name: "loki" + state: absent + purge: true + when: ansible_os_family == 'Debian' + +- name: Ensure that Loki firewalld rule is not present - tcp port {{ loki_http_listen_port }} + ansible.posix.firewalld: # noqa ignore-errors + immediate: true + permanent: true + port: "{{ loki_http_listen_port }}/tcp" + state: disabled + ignore_errors: true + +- name: Remove Loki directories" + ansible.builtin.file: + path: "{{ remove_me }}" + state: absent + loop: + - "/etc/loki" + - "{{ loki_working_path }}" + loop_control: + loop_var: remove_me + +- name: Remove the Loki system user + ansible.builtin.user: + name: "loki" + force: true + state: absent + +- name: Remove Loki system group + ansible.builtin.group: + name: "loki" + state: absent diff --git a/ansible_collections/grafana/grafana/roles/loki/templates/config.yml.j2 b/ansible_collections/grafana/grafana/roles/loki/templates/config.yml.j2 new file mode 100644 index 000000000..72147184f --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/templates/config.yml.j2 @@ -0,0 +1,99 @@ +{% if loki_target is defined %} +target: {{ loki_target }} +{% endif %} +{% if loki_auth_enabled is defined %} +auth_enabled: {{ loki_auth_enabled }} +{% endif %} +{% if loki_ballast_bytes is defined %} +ballast_bytes: {{ loki_ballast_bytes }} +{% endif %} +server: + {{ loki_server | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% if loki_distributor is defined %} +distributor: + {{ loki_distributor | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_querier is defined %} +querier: + {{ loki_querier | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_query_scheduler is defined %} +query_scheduler: + {{ loki_query_scheduler | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_frontend is defined %} +frontend: + {{ loki_frontend | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_query_range is defined %} +query_range: + {{ loki_query_range | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_ruler is defined %} +ruler: + {{ loki_ruler | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_ingester_client is defined %} +ingester_client: + {{ loki_ingester_client | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_ingester is defined %} +ingester: + {{ loki_ingester | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_index_gateway is defined %} +index_gateway: + {{ loki_index_gateway | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_storage_config is defined %} +storage_config: + {{ loki_storage_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_chunk_store_config is defined %} +chunk_store_config: + {{ loki_chunk_store_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_schema_config is defined %} +schema_config: + {{ loki_schema_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_compactor is defined %} +compactor: + {{ loki_compactor | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_limits_config is defined %} +limits_config: + {{ loki_limits_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_frontend_worker is defined %} +frontend_worker: + {{ loki_frontend_worker | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_table_manager is defined %} +table_manager: + {{ loki_table_manager | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_memberlist is defined %} +memberlist: + {{ loki_memberlist | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_runtime_config is defined %} +runtime_config: + {{ loki_runtime_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if operational_config is defined %} +operational_config: + {{ loki_operational_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_tracing is defined %} +tracing: + {{ loki_tracing | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_analytics is defined %} +analytics: + {{ loki_analytics | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if loki_common is defined %} +common: + {{ loki_common | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} diff --git a/ansible_collections/grafana/grafana/roles/loki/templates/rules.yml.j2 b/ansible_collections/grafana/grafana/roles/loki/templates/rules.yml.j2 new file mode 100644 index 000000000..a3dc3be25 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/templates/rules.yml.j2 @@ -0,0 +1,3 @@ +--- +groups: + {{ loki_ruler_alerts | to_nice_yaml(indent=2,sort_keys=False) | indent(2,False) }} diff --git a/ansible_collections/grafana/grafana/roles/loki/vars/Debian.yml b/ansible_collections/grafana/grafana/roles/loki/vars/Debian.yml new file mode 100644 index 000000000..b211affeb --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/vars/Debian.yml @@ -0,0 +1,5 @@ +--- +__loki_arch_map: + x86_64: 'amd64' + +__loki_arch: "{{ __loki_arch_map[ansible_architecture] | default(ansible_architecture) }}" diff --git a/ansible_collections/grafana/grafana/roles/loki/vars/RedHat.yml b/ansible_collections/grafana/grafana/roles/loki/vars/RedHat.yml new file mode 100644 index 000000000..77fe6b4d1 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/loki/vars/RedHat.yml @@ -0,0 +1,2 @@ +--- +__loki_arch: "{{ ansible_architecture }}" diff --git a/ansible_collections/grafana/grafana/roles/mimir/README.md b/ansible_collections/grafana/grafana/roles/mimir/README.md new file mode 100644 index 000000000..92f7d42c5 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/README.md @@ -0,0 +1,76 @@ +# ansible-role-mimir +Grafana Mimir +========= + +This role installs and configures a Mimir standalone application. + +## Testing with Molecule +To be able to test this collection locally we use Molecule. Molecule is an Ansible testtool that enable us to run our roles inside containers. In our case we are using Podman as a container runtime. To be able to run the Molecule test you need to have the following installed on your machine: + +- Podman +- Ansible +- Python3 + +### First Time Setup +To install all the depencies, use the following commands: + +``` +# Create a virtual environment +python -m venv .venv + +# On MacOS, WSL, Linux +source .venv/bin/activate + +# On Windows +.\.venv\Scripts\activate + +# Install dependencies +pip3 install molecule molecule-plugins[docker] docker pytest-testinfra jmespath selinux passlib + +# Create molecule network +docker network create molecule +``` + +### Run Minio for local S3 +To be able to run mimir using an object store backend, run the following command + +docker run -d \ + -p 9000:9000 \ + -p 9001:9001 \ + --name minio-mimir --network molecule \ + -e "MINIO_ROOT_USER=testtest" \ + -e "MINIO_ROOT_PASSWORD=testtest" \ + -e "MINIO_DEFAULT_BUCKETS=mimir" \ + bitnami/minio:latest + +### Testing the changes +To test the changes in a role run: +``` +molecule converge +## example: molecule converge +``` +When Ansible has succesfully ran, you can run assertions against your infrastructure using. +``` +molecule verify +## example: `molecule verify` +``` + +You can also run commands like `molecule destroy` , `molecule prepare` , and `molecule test` . See Molecule documentation for more information + +## Role Variables +-------------- +| Name | Type | Default | Description | +|---|---|---|---| +mimir_working_path|str|/usr/share/mimir|Used to specify the directory path where Mimir, a component of the Grafana Agent, stores its working files and temporary data.| +mimir_ruler_alert_path|str|/data/ruler|Used to specify the directory path where the Mimir ruler component of the Grafana Agent stores its alert files.| +mimir_http_listen_port|str|8080|Used to specify the port number on which the Mimir component of the Grafana Agent listens for incoming HTTP requests.| +mimir_http_listen_address|str|0.0.0.0|Used to specify the network address on which the Mimir component of the Grafana Agent listens for incoming HTTP requests.| +mimir_ruler.rule_path|str|/data/ruler|Used to specify the directory path where the Mimir ruler component of the Grafana Agent looks for rule files.| +mimir_ruler.alertmanager_url|str|http://127.0.0.1:8080/alertmanager|Used to specify the URL or address of the Alertmanager API that the Mimir ruler component of the Grafana Agent should communicate with.| +mimir_ruler.ring.heartbeat_period|str|2s|Used to specify the interval at which the Mimir ruler component of the Grafana Agent sends heartbeat signals to the ring.| +mimir_ruler.heartbeat_timeout|str|10s|Used to specify the maximum duration of time that the Mimir ruler component of the Grafana Agent will wait for a heartbeat signal from other components in the ring.| +mimir_alertmanager.data_dir|str|/data/alertmanager|sed to specify the directory path where the Mimir Alertmanager component of the Grafana Agent stores its data files.| +mimir_alertmanager.fallback_config_file|str|/etc/alertmanager-fallback-config.yaml|Used to specify the path to a fallback configuration file for the Mimir Alertmanager component of the Grafana Agent.| +mimir_alertmanager.external_url|str|http://localhost:9009/alertmanager|Used to specify the external URL or address at which the Mimir Alertmanager component of the Grafana Agent can be accessed.| +mimir_server.log_level|str|warn|Used to specify the log level of the server. Possible configurations error, warn, info, debug| +mimir_memberlist.join_members|[]| List of members for the Mimir cluster| diff --git a/ansible_collections/grafana/grafana/roles/mimir/defaults/main.yml b/ansible_collections/grafana/grafana/roles/mimir/defaults/main.yml new file mode 100644 index 000000000..40ab730e5 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/defaults/main.yml @@ -0,0 +1,37 @@ +--- +# defaults file for mimir +mimir_version: "latest" +__mimir_arch: "{{ arch_mapping[ansible_architecture] | default('amd64') }}" +mimir_download_url_rpm: "https://github.com/grafana/mimir/releases/download/{{ mimir_version }}/{{ mimir_version }}_{{ __mimir_arch }}.rpm" +mimir_download_url_deb: "https://github.com/grafana/mimir/releases/download/{{ mimir_version }}/{{ mimir_version }}_{{ __mimir_arch }}.deb" +mimir_working_path: "/var/lib/mimir" +mimir_ruler_alert_path: "{{ mimir_working_path }}/ruler" +mimir_http_listen_port: 8080 +mimir_http_listen_address: "0.0.0.0" +mimir_log_level: warn + +arch_mapping: + x86_64: amd64 + aarch64: arm64 + armv7l: armhf + i386: i386 + ppc64le: ppc64le + +mimir_ruler: + rule_path: "{{ mimir_working_path }}/ruler" + alertmanager_url: "http://127.0.0.1:{{ mimir_http_listen_port }}/alertmanager" + ring: + heartbeat_period: 5s + heartbeat_timeout: 10s + +mimir_alertmanager: + data_dir: "{{ mimir_working_path }}/alertmanager" + external_url: "http://localhost:{{ mimir_http_listen_port }}/alertmanager" + +mimir_server: + http_listen_port: "{{ mimir_http_listen_port }}" + http_listen_address: "{{ mimir_http_listen_address }}" + log_level: "{{ mimir_log_level }}" + +mimir_limits: + compactor_blocks_retention_period: 6m diff --git a/ansible_collections/grafana/grafana/roles/mimir/files/.gitkeep b/ansible_collections/grafana/grafana/roles/mimir/files/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/files/.gitkeep diff --git a/ansible_collections/grafana/grafana/roles/mimir/handlers/main.yml b/ansible_collections/grafana/grafana/roles/mimir/handlers/main.yml new file mode 100644 index 000000000..22251ca2b --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/handlers/main.yml @@ -0,0 +1,6 @@ +--- + +- name: Restart mimir + ansible.builtin.systemd: + name: mimir.service + state: restarted diff --git a/ansible_collections/grafana/grafana/roles/mimir/meta/main.yml b/ansible_collections/grafana/grafana/roles/mimir/meta/main.yml new file mode 100644 index 000000000..596fca2af --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/meta/main.yml @@ -0,0 +1,37 @@ +--- +# meta/main.yml +galaxy_info: + author: "Grafana" + role_name: mimir + description: "Grafana - platform for analytics and monitoring" + license: "MIT" + min_ansible_version: "2.9" + platforms: + - name: Ubuntu + versions: + - bionic + - xenial + - name: Debian + versions: + - stretch + - buster + - name: EL + versions: + - "7" + - "8" + - name: Fedora + versions: + - "30" + - "31" + galaxy_tags: + - grafana + - dashboard + - alerts + - alerting + - presentation + - monitoring + - metrics + +dependencies: [] + +allow_duplicates: true diff --git a/ansible_collections/grafana/grafana/roles/mimir/molecule/default/converge.yml b/ansible_collections/grafana/grafana/roles/mimir/molecule/default/converge.yml new file mode 100644 index 000000000..57a36c09c --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/molecule/default/converge.yml @@ -0,0 +1,33 @@ +--- +- name: Converge mimir + hosts: all + collections: + - grafana.grafana + vars: + mimir_storage: + storage: + backend: s3 + s3: + endpoint: minio-mimir.:9000 + access_key_id: testtest + secret_access_key: testtest + insecure: true + bucket_name: mimir + + # Blocks storage requires a prefix when using a common object storage bucket. + mimir_blocks_storage: + storage_prefix: blocks + tsdb: + dir: "{{ mimir_working_path}}/ingester" + + # Use memberlist, a gossip-based protocol, to enable the 3 Mimir replicas to communicate + mimir_memberlist: + join_members: + - molecule-grafana-mimir01.:7946 + - molecule-grafana-mimir02.:7946 + - molecule-grafana-mimir03.:7946 + + tasks: + - name: "Run Grafana mimir collection" + include_role: + name: mimir diff --git a/ansible_collections/grafana/grafana/roles/mimir/molecule/default/molecule.yml b/ansible_collections/grafana/grafana/roles/mimir/molecule/default/molecule.yml new file mode 100644 index 000000000..2790af53c --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/molecule/default/molecule.yml @@ -0,0 +1,60 @@ +--- +dependency: + name: galaxy +driver: + name: docker +platforms: + - name: molecule-grafana-mimir01 + image: "geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux8}-ansible:latest" + command: ${MOLECULE_DOCKER_COMMAND:-"/sbin/init"} + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + cgroupns_mode: host + privileged: true + pre_build_image: true + network: molecule + network_mode: "molecule" + published_ports: + - 7946 + - 9019:9009 + - 9096 + - name: molecule-grafana-mimir02 + image: "geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux8}-ansible:latest" + command: ${MOLECULE_DOCKER_COMMAND:-"/sbin/init"} + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + cgroupns_mode: host + privileged: true + pre_build_image: true + network: molecule + network_mode: "molecule" + published_ports: + - 7946 + - 9029:9009 + - 9096 + - name: molecule-grafana-mimir03 + image: "geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux8}-ansible:latest" + command: ${MOLECULE_DOCKER_COMMAND:-"/sbin/init"} + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + cgroupns_mode: host + privileged: true + pre_build_image: true + network: molecule + network_mode: "molecule" + published_ports: + - 7946 + - 9039:9009 + - 9096 + +provisioner: + name: ansible + env: + ANSIBLE_ROLES_PATH: ${MOLECULE_PROJECT_DIRECTORY}/roles + +verifier: + name: testinfra +lint: | + set -e + yamllint . + ansible-lint . diff --git a/ansible_collections/grafana/grafana/roles/mimir/molecule/default/tests/test_default.py b/ansible_collections/grafana/grafana/roles/mimir/molecule/default/tests/test_default.py new file mode 100644 index 000000000..671a5adca --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/molecule/default/tests/test_default.py @@ -0,0 +1,36 @@ +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import os +import testinfra.utils.ansible_runner + +testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( + os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all') + + +def test_directories(host): + dirs = [ + "/etc/mimir", + "/var/lib/mimir", + ] + files = [ + "/etc/mimir/config.yml" + ] + for directory in dirs: + d = host.file(directory) + assert d.is_directory + assert d.exists + for file in files: + f = host.file(file) + assert f.exists + assert f.is_file + + +def test_service(host): + s = host.service("mimir") + assert s.is_running + + +def test_packages(host): + p = host.package("mimir") + assert p.is_installed diff --git a/ansible_collections/grafana/grafana/roles/mimir/molecule/test-requirements.txt b/ansible_collections/grafana/grafana/roles/mimir/molecule/test-requirements.txt new file mode 100644 index 000000000..af58c1102 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/molecule/test-requirements.txt @@ -0,0 +1,6 @@ +molecule +docker +pytest-testinfra +jmespath +selinux +passlib diff --git a/ansible_collections/grafana/grafana/roles/mimir/tasks/deploy.yml b/ansible_collections/grafana/grafana/roles/mimir/tasks/deploy.yml new file mode 100644 index 000000000..93385c3db --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/tasks/deploy.yml @@ -0,0 +1,104 @@ +--- +# tasks file for Mimir deployment +- name: Obtain the latest version from the Mimir GitHub repo + when: mimir_version == "latest" + block: + - name: Scrape Github API endpoint to obtain latest Mimir version + ansible.builtin.uri: + url: "https://api.github.com/repos/grafana/mimir/releases/latest" + method: GET + body_format: json + become: false + delegate_to: localhost + run_once: true + register: __github_latest_version + + - name: Latest available Mimir version + ansible.builtin.set_fact: + mimir_version: "{{ __github_latest_version.json.tag_name | regex_replace('^v?(\\d+\\.\\d+\\.\\d+)$', '\\1') }}" + +- name: Verify current deployed version + block: + - name: Check if Mimir binary is present + ansible.builtin.stat: + path: "/usr/bin/mimir" + register: __already_deployed + + - name: Obtain current deployed Mimir version + ansible.builtin.command: + cmd: "/usr/bin/mimir --version" + changed_when: false + register: __current_deployed_version + when: __already_deployed.stat.exists | bool + +- name: Include RedHat/Rocky setup + ansible.builtin.include_tasks: + file: setup-Redhat.yml + when: ansible_os_family in ['RedHat', 'Rocky'] + +- name: Include Debian/Ubuntu setup + ansible.builtin.include_tasks: + file: setup-Debian.yml + when: ansible_os_family == 'Debian' + +- name: Check if Mimir default dir is present + ansible.builtin.stat: + path: "/tmp/mimir/boltdb-shipper-active" + register: __default_structure + +- name: Default structure cleanup + when: __default_structure.stat.exists | bool + block: + - name: Ensure that Mimir is stopped before default cleanup + ansible.builtin.systemd: + name: mimir.service + state: stopped + + - name: Remove default configuration from "/tmp/mimir" directory + ansible.builtin.file: + path: "/tmp/mimir" + state: absent + +- name: Ensure that Mimir working path exists + ansible.builtin.file: + path: "{{ mimir_working_path }}" + state: directory + owner: "mimir" + group: "mimir" + mode: "0755" + +- name: Template Mimir config - /etc/mimir/config.yml + ansible.builtin.template: + src: "config.yml.j2" + dest: "/etc/mimir/config.yml" + owner: "mimir" + group: "mimir" + mode: "0644" + notify: + - Restart mimir + +- name: Ensure that Mimir rule path exists + ansible.builtin.file: + path: "{{ mimir_ruler_alert_path }}" + state: directory + owner: "mimir" + group: "mimir" + mode: "0755" + when: + - mimir_ruler_alert_path is defined + - mimir_ruler is defined + +- name: Ensure that Mimir is started + ansible.builtin.systemd: + name: mimir.service + state: started + enabled: true + +- name: Verify that Mimir URL is responding + ansible.builtin.uri: + url: "http://127.0.0.1:{{ mimir_http_listen_port }}/ready" + method: GET + register: mimir_verify_url_status_code + retries: 5 + delay: 8 + until: mimir_verify_url_status_code.status == 200 diff --git a/ansible_collections/grafana/grafana/roles/mimir/tasks/main.yml b/ansible_collections/grafana/grafana/roles/mimir/tasks/main.yml new file mode 100644 index 000000000..880c6e5a2 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/tasks/main.yml @@ -0,0 +1,17 @@ +- name: Deploy Mimir service + ansible.builtin.include_tasks: + file: "deploy.yml" + apply: + tags: mimir_deploy + tags: mimir_deploy + +- name: Uninstall Mimir service + ansible.builtin.include_tasks: + file: "uninstall.yml" + apply: + tags: + - mimir_uninstall + - never + tags: + - mimir_uninstall + - never diff --git a/ansible_collections/grafana/grafana/roles/mimir/tasks/setup-Debian.yml b/ansible_collections/grafana/grafana/roles/mimir/tasks/setup-Debian.yml new file mode 100644 index 000000000..7028ed4d9 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/tasks/setup-Debian.yml @@ -0,0 +1,7 @@ +--- +- name: APT - Install Mimir + ansible.builtin.apt: + deb: "{{ mimir_download_url_deb }}" + state: present + notify: Restart mimir + when: __current_deployed_version.stdout is not defined or mimir_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/mimir/tasks/setup-Redhat.yml b/ansible_collections/grafana/grafana/roles/mimir/tasks/setup-Redhat.yml new file mode 100644 index 000000000..5bc34a91d --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/tasks/setup-Redhat.yml @@ -0,0 +1,8 @@ +--- +- name: DNF - Install Mimir from remote URL + ansible.builtin.dnf: + name: "{{ mimir_download_url_rpm }}" + state: present + disable_gpg_check: true + notify: Restart mimir + when: __current_deployed_version.stdout is not defined or mimir_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/mimir/tasks/uninstall.yml b/ansible_collections/grafana/grafana/roles/mimir/tasks/uninstall.yml new file mode 100644 index 000000000..e0ebee0c1 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/tasks/uninstall.yml @@ -0,0 +1,51 @@ +--- +# tasks file for Mimir uninstall + +- name: Stop Mimir service + ansible.builtin.systemd: # noqa ignore-errors + name: mimir + state: stopped + ignore_errors: true + +- name: Uninstall Mimir rpm package + ansible.builtin.dnf: + name: "mimir" + state: absent + autoremove: true + when: ansible_os_family in ['RedHat', 'Rocky'] + +- name: Uninstall Mimir deb package + ansible.builtin.apt: + name: "mimir" + state: absent + purge: true + when: ansible_os_family == 'Debian' + +- name: Ensure that Mimir firewalld rule is not present - tcp port {{ mimir_http_listen_port }} + ansible.posix.firewalld: # noqa ignore-errors + immediate: true + permanent: true + port: "{{ mimir_http_listen_port }}/tcp" + state: disabled + ignore_errors: true + +- name: Remove Mimir directories" + ansible.builtin.file: + path: "{{ remove_me }}" + state: absent + loop: + - "/etc/mimir" + - "{{ mimir_working_path }}" + loop_control: + loop_var: remove_me + +- name: Remove the Mimir system user + ansible.builtin.user: + name: "mimir" + force: true + state: absent + +- name: Remove Mimir system group + ansible.builtin.group: + name: "mimir" + state: absent diff --git a/ansible_collections/grafana/grafana/roles/mimir/templates/.gitkeep b/ansible_collections/grafana/grafana/roles/mimir/templates/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/templates/.gitkeep diff --git a/ansible_collections/grafana/grafana/roles/mimir/templates/config.yml.j2 b/ansible_collections/grafana/grafana/roles/mimir/templates/config.yml.j2 new file mode 100644 index 000000000..8f1035a6c --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/templates/config.yml.j2 @@ -0,0 +1,52 @@ +# Run Mimir in single process mode, with all components running in 1 process. +target: all,alertmanager,overrides-exporter + +# Configure Mimir to use Minio as object storage backend. +common: +{% if mimir_storage is defined %} + {{ mimir_storage | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} +{% endif %} + +# Blocks storage requires a prefix when using a common object storage bucket. +{% if mimir_blocks_storage is defined %} +blocks_storage: + {{ mimir_blocks_storage | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} +{% endif %} + +# Blocks storage requires a prefix when using a common object storage bucket. +{% if mimir_ruler_storage is defined %} +ruler_storage: + {{ mimir_ruler_storage | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} +{% endif %} + +# Alertmanager storage requires a prefix when using a common object storage bucket. +{% if mimir_alertmanager_storage is defined %} +alertmanager_storage: + {{ mimir_alertmanager_storage | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} +{% endif %} + +# Use memberlist, a gossip-based protocol, to enable the 3 Mimir replicas to communicate. +{% if mimir_memberlist is defined %} +memberlist: + {{ mimir_memberlist | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} +{% endif %} + +{% if mimir_ruler is defined %} +ruler: + {{ mimir_ruler | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} +{% endif %} + +{% if mimir_alertmanager is defined %} +alertmanager: + {{ mimir_alertmanager | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} +{% endif %} + +{% if mimir_server is defined %} +server: + {{ mimir_server | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} +{% endif %} + +{% if mimir_limits is defined %} +limits: + {{ mimir_limits | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} +{% endif %} diff --git a/ansible_collections/grafana/grafana/roles/mimir/vars/.gitkeep b/ansible_collections/grafana/grafana/roles/mimir/vars/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/mimir/vars/.gitkeep diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/README.md b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/README.md new file mode 100644 index 000000000..11c7cda67 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/README.md @@ -0,0 +1,100 @@ +# Ansible Role for OpenTelemetry Collector + +This Ansible role to install and configure the OpenTelemetry Collector, which can be used to collect traces, metrics, and logs. + +## Requirements + +Please ensure that `curl` is intalled on Ansible controller. + +## Role Variables + +Available variables with their default values are listed below (`defaults/main.yml`): + +| Variable Name | Description | Default Value | +|---------------|-------------|---------------| +| `otel_collector_version` | Version of OpenTelemetry Collector to install. | `"0.90.1"` | +| `otel_collector_binary_url` | URL for downloading the OpenTelemetry Collector binary. This URL is constructed based on the collector version, type, and architecture. | `"https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{ otel_collector_version }}/{% if otel_collector_type == 'contrib' %}otelcol-contrib_{{ otel_collector_version }}_linux_{{ otel_collector_arch }}{% else %}otelcol_{{ otel_collector_version }}_linux_{{ otel_collector_arch }}{% endif %}.tar.gz"` | +| `arch_mapping` | Mapping of `ansible_architecture` values to OpenTelemetry Collector binary architecture names. | See below\* | +| `otel_collector_arch` | Architecture for the OpenTelemetry Collector binary, determined based on the `ansible_architecture` fact. | `"{{ arch_mapping[ansible_architecture] | default('amd64') }}"` | +| `otel_collector_service_name` | The service name for the OpenTelemetry Collector. | `"otel-collector"` | +| `otel_collector_type` | Type of the OpenTelemetry Collector (`contrib` includes additional components). | `contrib` | +| `otel_collector_executable` | The executable name of the OpenTelemetry Collector, changes based on the collector type. | `{% if otel_collector_type == 'contrib' %}otelcol-contrib{% else %}otelcol{% endif %}` | +| `otel_collector_installation_dir` | Installation directory for the OpenTelemetry Collector. | `"/etc/otel-collector"` | +| `otel_collector_config_dir` | Directory for OpenTelemetry Collector configuration files. | `"/etc/otel-collector"` | +| `otel_collector_config_file` | The main configuration file name for the OpenTelemetry Collector. | `"config.yaml"` | +| `otel_collector_service_user` | The system user under which the OpenTelemetry Collector service will run. | `"otel"` | +| `otel_collector_service_group` | The system group under which the OpenTelemetry Collector service will run. | `"otel"` | +| `otel_collector_receivers` | Receivers configuration for the OpenTelemetry Collector. | `""` | +| `otel_collector_exporters` | Exporters configuration for the OpenTelemetry Collector. | `""` | +| `otel_collector_processors` | Processors configuration for the OpenTelemetry Collector. | `""` | +| `otel_collector_extensions` | Extensions configuration for the OpenTelemetry Collector. | `""` | +| `otel_collector_service` | Service configuration for the OpenTelemetry Collector. | `""` | +| `otel_collector_connectors` | Connectors configuration for the OpenTelemetry Collector (optional). | `""` | + +\* For `arch_mapping`, the default mapping is as follows: +- `x86_64`: `amd64` +- `aarch64`: `arm64` +- `armv7l`: `armhf` +- `i386`: `i386` +- `ppc64le`: `ppc64le` + +Users of the role can override these variables as needed. + +## Example Playbook + +Include this role in your playbook with default settings: + +```yaml +- name: Install OpenTelemetry Collector + hosts: all + become: true + + tasks: + - name: Install OpenTelemetry Collector + ansible.builtin.include_role: + name: grafana.grafana.opentelemetry_collector + vars: + otel_collector_receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + otel_collector_processors: + batch: + + otel_collector_exporters: + otlp: + endpoint: otelcol:4317 + + otel_collector_extensions: + health_check: + pprof: + zpages: + + otel_collector_service: + extensions: [health_check, pprof, zpages] + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + +``` + +## License + +See [LICENSE](https://github.com/grafana/grafana-ansible-collection/blob/main/LICENSE) + +## Author Information + +- [Ishan Jain](https://github.com/ishanjainn) diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/defaults/main.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/defaults/main.yml new file mode 100644 index 000000000..f615b6c78 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/defaults/main.yml @@ -0,0 +1,27 @@ +otel_collector_version: "0.90.1" + +otel_collector_binary_url: "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{ otel_collector_version }}/{% if otel_collector_type == 'contrib' %}otelcol-contrib_{{ otel_collector_version }}_linux_{{ otel_collector_arch }}{% else %}otelcol_{{ otel_collector_version }}_linux_{{ otel_collector_arch }}{% endif %}.tar.gz" + +arch_mapping: + x86_64: amd64 + aarch64: arm64 + armv7l: armhf + i386: i386 + ppc64le: ppc64le + +otel_collector_arch: "{{ arch_mapping[ansible_architecture] | default('amd64') }}" +otel_collector_service_name: "otel-collector" +otel_collector_type: contrib +otel_collector_executable: "{% if otel_collector_type == 'contrib' %}otelcol-contrib{% else %}otelcol{% endif %}" +otel_collector_installation_dir: "/etc/otel-collector" +otel_collector_config_dir: "/etc/otel-collector" +otel_collector_config_file: "config.yaml" +otel_collector_service_user: "otel" +otel_collector_service_group: "otel" + +otel_collector_receivers: "" +otel_collector_exporters: "" +otel_collector_processors: "" +otel_collector_extensions: "" +otel_collector_service: "" +otel_collector_connectors: "" diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/handlers/main.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/handlers/main.yml new file mode 100644 index 000000000..b5bbf355b --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/handlers/main.yml @@ -0,0 +1,5 @@ +- name: Restart OpenTelemetry Collector + ansible.builtin.systemd: + name: "{{ otel_collector_service_name }}" + state: restarted + become: true diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/meta/main.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/meta/main.yml new file mode 100644 index 000000000..edd9779c6 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/meta/main.yml @@ -0,0 +1,25 @@ +galaxy_info: + author: Ishan Jain + description: Role to install and configure OpenTelemetry Collector + license: "GPL-3.0-or-later" + min_ansible_version: "2.11" + platforms: + - name: Fedora + versions: + - "all" + - name: Debian + versions: + - "all" + - name: Ubuntu + versions: + - "all" + - name: EL + versions: + - "all" + galaxy_tags: + - grafana + - observability + - monitoring + - opentelemetry + - telemetry + - collector diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/configure.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/configure.yml new file mode 100644 index 000000000..3d5f57ac3 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/configure.yml @@ -0,0 +1,18 @@ +- name: Create OpenTelemetry Collector config directory + ansible.builtin.file: + path: "{{ otel_collector_config_dir }}" + state: directory + owner: "{{ otel_collector_service_user }}" + group: "{{ otel_collector_service_group }}" + mode: '0755' + become: true + +- name: Deploy OpenTelemetry Collector configuration file + ansible.builtin.template: + src: otel_collector_config.yml.j2 + dest: "{{ otel_collector_config_dir }}/{{ otel_collector_config_file }}" + owner: "{{ otel_collector_service_user }}" + group: "{{ otel_collector_service_group }}" + mode: '0644' + notify: Restart OpenTelemetry Collector + become: true diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/install.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/install.yml new file mode 100644 index 000000000..0e4e87b92 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/install.yml @@ -0,0 +1,56 @@ +- name: Create otel group + ansible.builtin.group: + name: "{{ otel_collector_service_group }}" + system: true + become: true + +- name: Create otel user + ansible.builtin.user: + name: "{{ otel_collector_service_user }}" + group: "{{ otel_collector_service_group }}" + system: true + create_home: false # Appropriate for a system user, usually doesn't need a home directory + become: true + +- name: Determine the architecture for OpenTelemetry Collector binary + set_fact: + otel_collector_arch: "{{ arch_mapping[ansible_architecture] | default('amd64') }}" + vars: + arch_mapping: + x86_64: amd64 + aarch64: arm64 + armv7l: armhf + i386: i386 + ppc64le: ppc64le + +- name: Download OpenTelemetry Collector binary + ansible.builtin.get_url: + url: "{{ otel_collector_binary_url }}" + dest: "/tmp/otelcol-{{ otel_collector_type }}-{{ otel_collector_version }}.tar.gz" + mode: '0755' + become: true + register: download_result + +- name: Remove existing OpenTelemetry Collector installation directory + ansible.builtin.file: + path: "{{ otel_collector_installation_dir }}" + state: absent + become: true + when: download_result.changed + +- name: Create OpenTelemetry Collector installation directory + ansible.builtin.file: + path: "{{ otel_collector_installation_dir }}" + state: directory + mode: '0755' + owner: "{{ otel_collector_service_user }}" + group: "{{ otel_collector_service_group }}" + become: true + +- name: Extract OpenTelemetry Collector binary + ansible.builtin.unarchive: + src: "/tmp/otelcol-{{ otel_collector_type }}-{{ otel_collector_version }}.tar.gz" + dest: "{{ otel_collector_installation_dir }}" + remote_src: yes + become: true + register: extract_result diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/main.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/main.yml new file mode 100644 index 000000000..6557285ff --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/main.yml @@ -0,0 +1,11 @@ +- name: Install OpenTelemetry Collector + include_tasks: install.yml + tags: [install] + +- name: Configure OpenTelemetry Collector + include_tasks: configure.yml + tags: [configure] + +- name: Manage OpenTelemetry Collector service + include_tasks: service.yml + tags: [service] diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/service.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/service.yml new file mode 100644 index 000000000..6de6e8fe3 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/service.yml @@ -0,0 +1,19 @@ +- name: Copy OpenTelemetry Collector systemd unit file + ansible.builtin.template: + src: otel_collector.service.j2 + dest: /etc/systemd/system/{{ otel_collector_service_name }}.service + mode: '0644' + become: true + notify: Restart OpenTelemetry Collector + +- name: Reload systemd daemon to pick up changes + ansible.builtin.systemd: + daemon_reload: yes + become: true + +- name: Ensure OpenTelemetry Collector service is enabled and running + ansible.builtin.service: + name: "{{ otel_collector_service_name }}" + enabled: yes + state: started + become: true diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/templates/otel_collector.service.j2 b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/templates/otel_collector.service.j2 new file mode 100644 index 000000000..79b35bece --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/templates/otel_collector.service.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=OpenTelemetry Collector +After=network.target + +[Service] +Type=simple +ExecStart={{ otel_collector_installation_dir }}/{{ otel_collector_executable }} --config={{ otel_collector_config_dir }}/{{ otel_collector_config_file }} +User={{ otel_collector_service_user }} +Group={{ otel_collector_service_group }} +Restart=on-failure + +[Install] +WantedBy=multi-user.target diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/templates/otel_collector_config.yml.j2 b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/templates/otel_collector_config.yml.j2 new file mode 100644 index 000000000..130189bbb --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/templates/otel_collector_config.yml.j2 @@ -0,0 +1,24 @@ +{% if otel_collector_receivers is defined and otel_collector_receivers | length > 0 %} +receivers: +{{ otel_collector_receivers | to_nice_yaml(indent=2) | indent(2, true) }} +{% endif %} +{% if otel_collector_processors is defined and otel_collector_processors | length > 0 %} +processors: +{{ otel_collector_processors | to_nice_yaml(indent=2) | indent(2, true) }} +{% endif %} +{% if otel_collector_exporters is defined and otel_collector_exporters | length > 0 %} +exporters: +{{ otel_collector_exporters | to_nice_yaml(indent=2) | indent(2, true) }} +{% endif %} +{% if otel_collector_extensions is defined and otel_collector_extensions | length > 0 %} +extensions: +{{ otel_collector_extensions | to_nice_yaml(indent=2) | indent(2, true) }} +{% endif %} +{% if otel_collector_service is defined and otel_collector_service | length > 0 %} +service: +{{ otel_collector_service | to_nice_yaml(indent=2) | indent(2, true) }} +{% endif %} +{% if otel_collector_connectors is defined and otel_collector_connectors | length > 0 %} +connectors: +{{ otel_collector_connectors | to_nice_yaml(indent=2) | indent(2, true) }} +{% endif %} diff --git a/ansible_collections/grafana/grafana/roles/promtail/README.md b/ansible_collections/grafana/grafana/roles/promtail/README.md new file mode 100644 index 000000000..1fbcb5503 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/README.md @@ -0,0 +1,164 @@ +# Ansible role - Promtail + +[![License](https://img.shields.io/github/license/grafana/grafana-ansible-collection)](LICENSE) + +The Ansible Promtail Role allows you to effortlessly deploy and manage Promtail, agent which ships contents of local logs to private Loki. +This role is tailored for operating systems such as **RedHat**, **Rocky Linux**, **AlmaLinux**, **Ubuntu**, and **Debian**. + +**๐ Key Features** +- **โก Root-less/Root runtime**: By default, Promtail operates in root-less mode, utilizing ACL (Access Control List) to securely access logs without requiring root permissions. You have the option to configure root mode if necessary. +- **๐งน Effortless Uninstall**: Easily remove Promtail from your system using the "promtail_uninstall" tag. + +๐ข **[Check the blog post](https://voidquark.com/blog/rootless-promtail-with-ansible/)** ๐ **Learn more about root-less mode.** + +## Table of Content + +- [Requirements](#requirements) +- [Role Variables](#role-variables) +- [Playbook](#playbook) + +## Requirements + +- Ansible 2.10+ + +## Role Variables + +```yaml +promtail_version: "latest" +``` +The version of Promtail to download and deploy. Supported standard version "3.0.0" format or "latest". + +```yaml +promtail_http_listen_port: 9080 +``` +The TCP port on which Promtail listens. By default, it listens on port `9080`. + +```yaml +promtail_http_listen_address: "0.0.0.0" +``` +The address on which Promtail listens for HTTP requests. By default, it listens on all interfaces. + +```yaml +promtail_expose_port: false +``` +By default, this is set to `false`. It supports only simple `firewalld` configurations. If set to `true`, a firewalld rule is added to expose the TCP `promtail_http_listen_port`. If set to `false`, configuration is skipped. If the `firewalld.service` is not active, all firewalld tasks are skipped. + +```yaml +promtail_positions_path: "/var/lib/promtail" +``` +Promtail path for position file. File indicating how far it has read into a file. It is needed for when Promtail is restarted to allow it to continue from where it left off. + +```yaml +promtail_runtime_mode: "acl" +``` +By default, Promtail runs in root-less mode. It supports two modes: +- `acl`: Root-less mode, utilizing ACL permission model to read target log files. +- `root`: Root mode, where Promtail runs as root and ACL configuration is skipped. + +```yaml +promtail_user_append_groups: + - "systemd-journal" +``` +Appends the promtail user to specific groups in root-less mode. By default, it appends the user to the `systemd-journal` group, granting permission to read system journal logs. + +```yaml +promtail_download_url_rpm: "https://github.com/grafana/loki/releases/download/v{{ promtail_version }}/promtail-{{ promtail_version }}.{{ __promtail_arch }}.rpm" +``` +The default download URL for the Promtail rpm package from GitHub. + +```yaml +promtail_download_url_deb: "https://github.com/grafana/loki/releases/download/v{{ promtail_version }}/promtail_{{ promtail_version }}_{{ __promtail_arch }}.deb" +``` +The default download URL for the Promtail deb package from GitHub. + +```yaml +promtail_server: + http_listen_port: "{{ promtail_http_listen_port }}" + http_listen_address: "{{ promtail_http_listen_address }}" +``` +The `server` block configures Promtail behavior as an HTTP server. [All possible values for `server`](https://grafana.com/docs/loki/latest/clients/promtail/configuration/#server) + +```yaml +promtail_positions: + filename: "{{ promtail_positions_path }}/positions.yaml" +``` +The `positions` block configures where Promtail will save a file indicating how far it has read into a file. It is needed for when Promtail is restarted to allow it to continue from where it left off. [All possible values for `positions`](https://grafana.com/docs/loki/latest/clients/promtail/configuration/#positions) + +```yaml +promtail_clients: + - url: http://localhost:3100/loki/api/v1/push +``` +The `clients` block configures how Promtail connects to instances of Loki. [All possible values for `clients`](https://grafana.com/docs/loki/latest/clients/promtail/configuration/#clients). โ ๏ธ This configuration is mandatory. By default, it's empty, and the example above serves as a simple illustration for inspiration. + +```yaml +promtail_scrape_configs: + - job_name: system + static_configs: + - targets: + - localhost + labels: + job: messages + instance: "{{ ansible_fqdn }}" + __path__: /var/log/messages + - targets: + - localhost + labels: + job: nginx + instance: "{{ ansible_fqdn }}" + __path__: /var/log/nginx/*.log +``` +The `scrape_configs` block configures how Promtail can scrape logs from a series of targets using a specified discovery method. [All possible values for `scrape_configs`](https://grafana.com/docs/loki/latest/clients/promtail/configuration/#scrape_configs). โ ๏ธ This configuration is mandatory. By default, it's empty, and the example above serves as a simple illustration for inspiration. + +| Variable Name | Description +| ----------- | ----------- | +| `promtail_limits_config` | The optional limits_config block configures global limits for this instance of Promtail. ๐ [documentation](https://grafana.com/docs/loki/latest/clients/promtail/configuration/#limits_config). +| `promtail_target_config` | The target_config block controls the behavior of reading files from discovered targets. ๐ [documentation](https://grafana.com/docs/loki/latest/clients/promtail/configuration/#target_config). + +## Dependencies + +No Dependencies + +## Playbook + +```yaml +- name: Manage promtail service + hosts: all + become: true + vars: + promtail_clients: + - url: http://localhost:3100/loki/api/v1/push + promtail_scrape_configs: + - job_name: system + static_configs: + - targets: + - localhost + labels: + job: messages + instance: "{{ ansible_fqdn }}" + __path__: /var/log/messages + - targets: + - localhost + labels: + job: nginx + instance: "{{ ansible_fqdn }}" + __path__: /var/log/nginx/*.log + roles: + - role: grafana.grafana.promtail +``` + +- Playbook execution example +```shell +# Deploy Promtail +ansible-playbook function_promtail_play.yml + +# Uninstall Promtail +ansible-playbook function_promtail_play.yml -t promtail_uninstall +``` + +## License + +See [LICENSE](https://github.com/grafana/grafana-ansible-collection/blob/main/LICENSE) + +## Author Information + +- [VoidQuark](https://github.com/voidquark) diff --git a/ansible_collections/grafana/grafana/roles/promtail/defaults/main.yml b/ansible_collections/grafana/grafana/roles/promtail/defaults/main.yml new file mode 100644 index 000000000..277037bf7 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/defaults/main.yml @@ -0,0 +1,47 @@ +--- +# defaults file for promtail +promtail_version: "latest" +promtail_http_listen_port: 9080 +promtail_http_listen_address: "0.0.0.0" +promtail_expose_port: false +promtail_positions_path: "/var/lib/promtail" +promtail_runtime_mode: "acl" # Supported "root" or "acl" + +promtail_user_append_groups: + - "systemd-journal" + +promtail_download_url_rpm: "https://github.com/grafana/loki/releases/download/v{{ promtail_version }}/promtail-{{ promtail_version }}.{{ __promtail_arch }}.rpm" +promtail_download_url_deb: "https://github.com/grafana/loki/releases/download/v{{ promtail_version }}/promtail_{{ promtail_version }}_{{ __promtail_arch }}.deb" + +# default variables for /etc/promtail/config.yml +promtail_server: + http_listen_port: "{{ promtail_http_listen_port }}" + http_listen_address: "{{ promtail_http_listen_address }}" + +promtail_positions: + filename: "{{ promtail_positions_path }}/positions.yaml" + +promtail_clients: [] +# promtail_clients: +# - url: http://localhost:3100/loki/api/v1/push + +promtail_scrape_configs: [] +# promtail_scrape_configs: +# - job_name: system +# static_configs: +# - targets: +# - localhost +# labels: +# job: messages +# instance: "{{ ansible_fqdn }}" +# __path__: /var/log/messages +# - targets: +# - localhost +# labels: +# job: nginx +# instance: "{{ ansible_fqdn }}" +# __path__: /var/log/nginx/*.log + +# not set by default +# promtail_limits_config: +# promtail_target_config: diff --git a/ansible_collections/grafana/grafana/roles/promtail/handlers/main.yml b/ansible_collections/grafana/grafana/roles/promtail/handlers/main.yml new file mode 100644 index 000000000..d9f17243d --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/handlers/main.yml @@ -0,0 +1,9 @@ +--- +# handlers file for promtail +- name: Restart promtail + listen: "restart promtail" + ansible.builtin.systemd: + daemon_reload: true + name: promtail.service + state: restarted + enabled: true diff --git a/ansible_collections/grafana/grafana/roles/promtail/meta/main.yml b/ansible_collections/grafana/grafana/roles/promtail/meta/main.yml new file mode 100644 index 000000000..c7cee9a27 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/meta/main.yml @@ -0,0 +1,28 @@ +--- +galaxy_info: + role_name: promtail + author: voidquark + description: Manage Grafana Promtail Application + license: "GPL-3.0-or-later" + min_ansible_version: "2.10" + platforms: + - name: EL + versions: + - "9" + - "8" + - name: Fedora + versions: + - all + - name: Debian + versions: + - all + - name: Ubuntu + versions: + - all + galaxy_tags: + - promtail + - grafana + - logging + - monitoring + +dependencies: [] diff --git a/ansible_collections/grafana/grafana/roles/promtail/molecule/default/converge.yml b/ansible_collections/grafana/grafana/roles/promtail/molecule/default/converge.yml new file mode 100644 index 000000000..d9945b108 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/molecule/default/converge.yml @@ -0,0 +1,15 @@ +--- +- name: Converge + hosts: all + vars: + promtail_scrape_configs: + - job_name: test + static_configs: + - targets: + - localhost + labels: + job: test + instance: "{{ ansible_fqdn }}" + __path__: /var/log/last* + roles: + - role: grafana.grafana.promtail diff --git a/ansible_collections/grafana/grafana/roles/promtail/molecule/default/molecule.yml b/ansible_collections/grafana/grafana/roles/promtail/molecule/default/molecule.yml new file mode 100644 index 000000000..339965a50 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/molecule/default/molecule.yml @@ -0,0 +1,20 @@ +--- +dependency: + name: galaxy + options: + ignore-errors: true +driver: + name: docker +platforms: + - name: instance + image: "geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux8}-ansible:latest" + command: ${MOLECULE_DOCKER_COMMAND:-""} + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + cgroupns_mode: host + privileged: true + pre_build_image: true +provisioner: + name: ansible + playbooks: + converge: converge.yml diff --git a/ansible_collections/grafana/grafana/roles/promtail/tasks/acl_configuration.yml b/ansible_collections/grafana/grafana/roles/promtail/tasks/acl_configuration.yml new file mode 100644 index 000000000..65516b92c --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/tasks/acl_configuration.yml @@ -0,0 +1,116 @@ +--- +# tasks file for promtail deploy - acl configuration + +- name: Extract log files from static_configs - labels - path + ansible.builtin.set_fact: + __promtail_acl_log_files: >- + {{ + promtail_scrape_configs + | selectattr('static_configs', 'defined') + | map(attribute='static_configs') + | flatten + | map(attribute='labels') + | map(attribute='__path__') + | list + }} + +- name: Extract log dirs paths from static_configs - labels - path + ansible.builtin.set_fact: + __promtail_acl_log_dirs: >- + {{ + promtail_scrape_configs + | selectattr('static_configs', 'defined') + | map(attribute='static_configs') + | flatten + | map(attribute='labels') + | map(attribute='__path__') + | map('dirname') + | unique + | list + }} + +- name: Stat log dirs + ansible.builtin.stat: + path: "{{ item }}" + loop: "{{ __promtail_acl_log_dirs }}" + register: __promtail_stat_acl_log_dirs + +- name: Set recursive default ACL permission for log dirs + ansible.posix.acl: + path: "{{ item.item }}" + recursive: true + entity: promtail + etype: user + permissions: rx + default: true + state: present + loop: "{{ __promtail_stat_acl_log_dirs.results }}" + when: + - __promtail_stat_acl_log_dirs | length > 0 + - item.stat.exists + notify: restart promtail + +- name: Set ACL permission for log dirs + ansible.posix.acl: + path: "{{ item.item }}" + entity: promtail + etype: user + permissions: rx + state: present + loop: "{{ __promtail_stat_acl_log_dirs.results }}" + when: + - __promtail_stat_acl_log_dirs | length > 0 + - item.stat.exists + notify: restart promtail + +- name: Find all existing ACL log files + ansible.builtin.find: + paths: "{{ item | dirname }}" + patterns: "{{ item | basename }}" + loop: "{{ __promtail_acl_log_files }}" + register: __promtail_find_files + +- name: Define existing ACL log files + ansible.builtin.set_fact: + __promtail_existing_acl_log_files: "{{ __promtail_find_files.results | map(attribute='files') | flatten | map(attribute='path') }}" + +- name: Set ACL permission for existing log files + ansible.posix.acl: + path: "{{ item }}" + entity: promtail + etype: user + permissions: r + state: present + loop: "{{ __promtail_existing_acl_log_files }}" + when: + - __promtail_existing_acl_log_files | length > 0 + notify: restart promtail + +- name: Promtail ACL Logrotate + when: + - __promtail_acl_log_dirs | length > 0 + - __promtail_acl_log_files | length > 0 + block: + - name: Template promtail ACL config for Logrotate + ansible.builtin.template: + src: "promtail_acl.j2" + dest: "/etc/logrotate.d/promtail_acl" + owner: "root" + group: "root" + mode: "0644" + + - name: Ensure that Promtail dummy dir for logrotate ACL configuration exist + ansible.builtin.file: + path: "/var/log/dummy_promtail_acl" + state: directory + owner: "promtail" + group: "root" + mode: "0750" + + - name: Create dummy empty log file for logrotate ACL configuration to work + ansible.builtin.copy: + content: "" + dest: "/var/log/dummy_promtail_acl/dummy_promtail_acl.log" + owner: "promtail" + group: "root" + mode: 0600 diff --git a/ansible_collections/grafana/grafana/roles/promtail/tasks/deploy.yml b/ansible_collections/grafana/grafana/roles/promtail/tasks/deploy.yml new file mode 100644 index 000000000..483a9b1ba --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/tasks/deploy.yml @@ -0,0 +1,139 @@ +--- +# tasks file for promtail deploy + +- name: Obtain the latest version from the GitHub repo + when: promtail_version == "latest" + block: + - name: Scrape Github API endpoint to obtain latest Promtail version + ansible.builtin.uri: + url: "https://api.github.com/repos/grafana/loki/releases/latest" + method: GET + body_format: json + become: false + delegate_to: localhost + run_once: true + register: __github_latest_version + + - name: Latest available Promtail version + ansible.builtin.set_fact: + promtail_version: "{{ __github_latest_version.json.tag_name | regex_replace('^v?(\\d+\\.\\d+\\.\\d+)$', '\\1') }}" + +- name: Verify current deployed version + block: + - name: Check if Promtail binary is present + ansible.builtin.stat: + path: "/usr/bin/promtail" + register: __already_deployed + + - name: Obtain current deployed Promtail version + ansible.builtin.command: + cmd: "/usr/bin/promtail --version" + changed_when: false + register: __current_deployed_version + when: __already_deployed.stat.exists | bool + +- name: Include RedHat/Rocky setup + ansible.builtin.include_tasks: + file: setup-RedHat.yml + when: ansible_os_family in ['RedHat', 'Rocky'] + +- name: Include Debian/Ubuntu setup + ansible.builtin.include_tasks: + file: setup-Debian.yml + when: ansible_os_family == 'Debian' + +- name: Ensure that Promtail position path exists + ansible.builtin.file: + path: "{{ promtail_positions_path }}" + state: directory + owner: "promtail" + group: "root" + mode: "0750" + notify: restart promtail + +- name: Template Promtail config - /etc/promtail/config.yml + ansible.builtin.template: + src: "config.yml.j2" + dest: "/etc/promtail/config.yml" + owner: "promtail" + group: "root" + mode: "0644" + validate: "/usr/bin/promtail -check-syntax -config.file %s" + notify: restart promtail + +- name: Template Promtail systemd - /etc/systemd/system/promtail.service + ansible.builtin.template: + src: "promtail.service.j2" + dest: "/etc/systemd/system/promtail.service" + owner: "root" + group: "root" + mode: "0644" + notify: restart promtail + +- name: Add the Promtail system user to additional group + ansible.builtin.user: + name: "promtail" + groups: "{{ item }}" + system: true + append: true + create_home: false + state: present + loop: "{{ promtail_user_append_groups }}" + when: + - promtail_user_append_groups | length > 0 + - promtail_runtime_mode == "acl" + +- name: Include Promtail ACL permission configuration + ansible.builtin.include_tasks: + file: "acl_configuration.yml" + when: + - promtail_scrape_configs | length > 0 + - promtail_runtime_mode == "acl" + +- name: Get firewalld state + ansible.builtin.systemd: + name: "firewalld" + register: __firewalld_service_state + +- name: Enable firewalld rule to expose Promtail tcp port {{ promtail_http_listen_port }} + ansible.posix.firewalld: + immediate: true + permanent: true + port: "{{ promtail_http_listen_port }}/tcp" + state: enabled + when: + - __firewalld_service_state.status.ActiveState == "active" + - promtail_expose_port | bool + +- name: Flush handlers after deployment + ansible.builtin.meta: flush_handlers + +- name: Ensure that Promtail is started + ansible.builtin.systemd: + name: promtail.service + state: started + +- name: Stat position file + ansible.builtin.stat: + path: "{{ promtail_positions_path }}/positions.yaml" + register: __promtail_stat_position_file + +- name: Ensure correct owner and group for Promtail position file + ansible.builtin.file: + path: "{{ promtail_positions_path }}/positions.yaml" + state: file + owner: "promtail" + notify: restart promtail + when: + - __promtail_stat_position_file.stat.exists + - promtail_runtime_mode == "acl" + +- name: Verify that Promtail URL is responding + ansible.builtin.uri: + url: "http://{{ promtail_http_listen_address }}:{{ promtail_http_listen_port }}/ready" + method: GET + register: promtail_verify_url_status_code + retries: 5 + delay: 8 + until: promtail_verify_url_status_code.status == 200 + when: promtail_expose_port | bool diff --git a/ansible_collections/grafana/grafana/roles/promtail/tasks/main.yml b/ansible_collections/grafana/grafana/roles/promtail/tasks/main.yml new file mode 100644 index 000000000..11bfdbf19 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/tasks/main.yml @@ -0,0 +1,23 @@ +--- +# tasks file for promtail +- name: Include OS specific variables + ansible.builtin.include_vars: + file: "{{ ansible_os_family }}.yml" + +- name: Deploy Promtail service + ansible.builtin.include_tasks: + file: "deploy.yml" + apply: + tags: promtail_deploy + tags: promtail_deploy + +- name: Uninstall Promtail service + ansible.builtin.include_tasks: + file: "uninstall.yml" + apply: + tags: + - promtail_uninstall + - never + tags: + - promtail_uninstall + - never diff --git a/ansible_collections/grafana/grafana/roles/promtail/tasks/setup-Debian.yml b/ansible_collections/grafana/grafana/roles/promtail/tasks/setup-Debian.yml new file mode 100644 index 000000000..3192279e9 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/tasks/setup-Debian.yml @@ -0,0 +1,14 @@ +--- +- name: APT - Ensure that ACL is present + ansible.builtin.apt: + name: "acl" + state: present + update_cache: yes + when: promtail_runtime_mode == "acl" + +- name: APT - Install Promtail + ansible.builtin.apt: + deb: "{{ promtail_download_url_deb }}" + state: present + notify: restart promtail + when: __current_deployed_version.stdout is not defined or promtail_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/promtail/tasks/setup-RedHat.yml b/ansible_collections/grafana/grafana/roles/promtail/tasks/setup-RedHat.yml new file mode 100644 index 000000000..b50573da0 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/tasks/setup-RedHat.yml @@ -0,0 +1,9 @@ +--- +- name: DNF - Install Promtail from remote URL + ansible.builtin.dnf: + name: "{{ promtail_download_url_rpm }}" + state: present + disable_gpg_check: true + notify: restart promtail + when: + - __current_deployed_version.stdout is not defined or promtail_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/promtail/tasks/uninstall.yml b/ansible_collections/grafana/grafana/roles/promtail/tasks/uninstall.yml new file mode 100644 index 000000000..0cac84d81 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/tasks/uninstall.yml @@ -0,0 +1,119 @@ +--- +# tasks file for promtail uninstall +- name: Stop Promtail service + ansible.builtin.systemd: # noqa ignore-errors + name: promtail + state: stopped + ignore_errors: true + +- name: Extract log files from static_configs - labels - path + ansible.builtin.set_fact: + __promtail_acl_log_files: >- + {{ + promtail_scrape_configs + | selectattr('static_configs', 'defined') + | map(attribute='static_configs') + | flatten + | map(attribute='labels') + | map(attribute='__path__') + | list + }} + +- name: Extract log dirs paths from static_configs - labels - path + ansible.builtin.set_fact: + __promtail_acl_log_dirs: >- + {{ + promtail_scrape_configs + | selectattr('static_configs', 'defined') + | map(attribute='static_configs') + | flatten + | map(attribute='labels') + | map(attribute='__path__') + | map('dirname') + | list + }} + +- name: Remove ACL Permission for log dirs - default + ansible.posix.acl: # noqa ignore-errors + path: "{{ item }}" + recursive: true + entity: promtail + etype: user + default: true + state: absent + loop: "{{ __promtail_acl_log_dirs }}" + ignore_errors: true + +- name: Remove ACL permission for log dirs + ansible.posix.acl: # noqa ignore-errors + path: "{{ item }}" + entity: promtail + etype: user + state: absent + loop: "{{ __promtail_acl_log_dirs }}" + ignore_errors: true + +- name: Find all existing ACL log files + ansible.builtin.find: + paths: "{{ item | dirname }}" + patterns: "{{ item | basename }}" + loop: "{{ __promtail_acl_log_files }}" + register: __promtail_find_files + +- name: Define existing ACL log files + ansible.builtin.set_fact: + __promtail_existing_acl_log_files: "{{ __promtail_find_files.results | map(attribute='files') | flatten | map(attribute='path') }}" + +- name: Remove ACL Permission for existing log files + ansible.posix.acl: # noqa ignore-errors + path: "{{ item }}" + entity: promtail + etype: user + state: absent + loop: "{{ __promtail_existing_acl_log_files }}" + ignore_errors: true + +- name: Uninstall Promtail rpm package + ansible.builtin.dnf: + name: "promtail" + state: absent + autoremove: true + when: ansible_os_family in ['RedHat', 'Rocky'] + +- name: Uninstall Promtail deb package + ansible.builtin.apt: + name: "promtail" + state: absent + purge: true + when: ansible_os_family == 'Debian' + +- name: Ensure that Promtail firewalld rule is not present - tcp port {{ promtail_http_listen_port }} + ansible.posix.firewalld: # noqa ignore-errors + immediate: true + permanent: true + port: "{{ promtail_http_listen_port }}/tcp" + state: disabled + ignore_errors: true + +- name: Remove Promtail directories" + ansible.builtin.file: + path: "{{ remove_me }}" + state: absent + loop: + - "/etc/promtail" + - "{{ promtail_positions_path }}" + - "/etc/logrotate.d/promtail_acl" + - "/var/log/dummy_promtail_acl" + loop_control: + loop_var: remove_me + +- name: Remove the Promtail system user + ansible.builtin.user: + name: "promtail" + force: true + state: absent + +- name: Remove Promtail system group + ansible.builtin.group: + name: "promtail" + state: absent diff --git a/ansible_collections/grafana/grafana/roles/promtail/templates/config.yml.j2 b/ansible_collections/grafana/grafana/roles/promtail/templates/config.yml.j2 new file mode 100644 index 000000000..83681310d --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/templates/config.yml.j2 @@ -0,0 +1,22 @@ +server: + {{ promtail_server | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% if promtail_positions is defined %} +positions: + {{ promtail_positions | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if promtail_clients is defined %} +clients: + {{ promtail_clients | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if promtail_scrape_configs is defined %} +scrape_configs: + {{ promtail_scrape_configs | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if promtail_limits_config is defined %} +limits_config: + {{ promtail_limits_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} +{% if promtail_target_config is defined %} +target_config: + {{ promtail_target_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} +{% endif %} diff --git a/ansible_collections/grafana/grafana/roles/promtail/templates/promtail.service.j2 b/ansible_collections/grafana/grafana/roles/promtail/templates/promtail.service.j2 new file mode 100644 index 000000000..6dc8384df --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/templates/promtail.service.j2 @@ -0,0 +1,18 @@ +[Unit] +Description=Promtail service +After=network.target + +[Service] +Type=simple +{% if promtail_runtime_mode == "acl" %} +User=promtail +{% elif promtail_runtime_mode == "root" %} +User=root +{% endif %} +ExecStart=/usr/bin/promtail -config.file /etc/promtail/config.yml + +TimeoutSec = 60 +Restart = on-failure +RestartSec = 2 + +[Install] diff --git a/ansible_collections/grafana/grafana/roles/promtail/templates/promtail_acl.j2 b/ansible_collections/grafana/grafana/roles/promtail/templates/promtail_acl.j2 new file mode 100644 index 000000000..40090658b --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/templates/promtail_acl.j2 @@ -0,0 +1,13 @@ +/var/log/dummy_promtail_acl/dummy_promtail_acl.log +{ + copytruncate + postrotate +{% for each_dir in __promtail_acl_log_dirs %} + /usr/bin/setfacl -R -m d:u:promtail:rx {{ each_dir }} + /usr/bin/setfacl -m u:promtail:rx {{ each_dir }} +{% endfor %} +{% for each_log in __promtail_acl_log_files %} + /usr/bin/setfacl -m u:promtail:r {{ each_log }} +{% endfor %} + endscript +} diff --git a/ansible_collections/grafana/grafana/roles/promtail/vars/Debian.yml b/ansible_collections/grafana/grafana/roles/promtail/vars/Debian.yml new file mode 100644 index 000000000..f9d41b28e --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/vars/Debian.yml @@ -0,0 +1,5 @@ +--- +__promtail_arch_map: + x86_64: 'amd64' + +__promtail_arch: "{{ __promtail_arch_map[ansible_architecture] | default(ansible_architecture) }}" diff --git a/ansible_collections/grafana/grafana/roles/promtail/vars/RedHat.yml b/ansible_collections/grafana/grafana/roles/promtail/vars/RedHat.yml new file mode 100644 index 000000000..0954ee3d3 --- /dev/null +++ b/ansible_collections/grafana/grafana/roles/promtail/vars/RedHat.yml @@ -0,0 +1,2 @@ +--- +__promtail_arch: "{{ ansible_architecture }}" |