diff --git a/ansible_collections/grafana/grafana/.ansible-lint b/ansible_collections/grafana/grafana/.ansible-lint deleted file mode 100644 index 6dab833..0000000 --- a/ansible_collections/grafana/grafana/.ansible-lint +++ /dev/null @@ -1,18 +0,0 @@ ---- -profile: production - -exclude_paths: - - .cache/ - - .github/ - - examples/ - -parseable: true -verbosity: 1 - -use_default_rules: true - -skip_list: - - '204' # Allow string length greater than 160 chars - - 'no-changed-when' # False positives for running command shells - - 'yaml' # Disable YAML linting since it's done by yamllint - - 'empty-string-compare' # Allow compare to empty string diff --git a/ansible_collections/grafana/grafana/.config/molecule/config.yml b/ansible_collections/grafana/grafana/.config/molecule/config.yml deleted file mode 100644 index b91b78d..0000000 --- a/ansible_collections/grafana/grafana/.config/molecule/config.yml +++ /dev/null @@ -1,83 +0,0 @@ ---- -dependency: - name: galaxy -driver: - name: docker -platforms: - - name: almalinux-8 - image: dokken/almalinux-8 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: almalinux-9 - image: dokken/almalinux-9 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: centos-7 - image: dokken/centos-7 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /usr/lib/systemd/systemd - - name: centos-stream-8 - image: dokken/centos-stream-8 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: centos-stream-9 - image: dokken/centos-stream-9 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: debian-10 - image: dokken/debian-10 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: debian-11 - image: dokken/debian-11 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: fedora-36 - image: dokken/fedora-36 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: fedora-37 - image: dokken/fedora-37 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-18.04 - image: dokken/ubuntu-18.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-20.04 - image: dokken/ubuntu-20.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-22.04 - image: dokken/ubuntu-22.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd -provisioner: - env: - ANSIBLE_INJECT_FACT_VARS: false -verifier: - name: testinfra diff --git a/ansible_collections/grafana/grafana/.editorconfig b/ansible_collections/grafana/grafana/.editorconfig deleted file mode 100644 index 9a7d285..0000000 --- a/ansible_collections/grafana/grafana/.editorconfig +++ /dev/null @@ -1,42 +0,0 @@ -# This file is the top-most EditorConfig file -root = true - -# All Files -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true - -# JSON Files -[*.{json,json5,webmanifest}] -indent_size = 2 - -# YAML Files -[*.{yml,yaml}] -indent_size = 2 - -# Markdown Files -[*.{md,mdx}] -indent_size = 2 -trim_trailing_whitespace = false - -# Web Files -[*.{htm,html,js,jsm,ts,tsx,cjs,cts,ctsx,mjs,mts,mtsx,css,sass,scss,less,pcss,svg,vue}] -indent_size = 2 - -# Bash Files -[*.sh] -indent_size = 2 -end_of_line = lf - -# Makefiles -[{Makefile,**.mk}] -indent_style = tab - -# Python Files -[*.py] -indent_style = space -indent_size = 4 diff --git a/ansible_collections/grafana/grafana/.github/dependabot.yml b/ansible_collections/grafana/grafana/.github/dependabot.yml deleted file mode 100644 index 9d866e3..0000000 --- a/ansible_collections/grafana/grafana/.github/dependabot.yml +++ /dev/null @@ -1,11 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - -version: 2 -updates: - - package-ecosystem: "pip" # See documentation for possible values - directory: "/" # Location of package manifests - schedule: - interval: "weekly" diff --git a/ansible_collections/grafana/grafana/.github/workflows/alloy-molecule.yml b/ansible_collections/grafana/grafana/.github/workflows/alloy-molecule.yml deleted file mode 100644 index fd4c92e..0000000 --- a/ansible_collections/grafana/grafana/.github/workflows/alloy-molecule.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- -name: Alloy Molecule - -on: - push: - branches: - - main - pull_request: - branches: - - main - -defaults: - run: - working-directory: roles/alloy - -jobs: - molecule: - name: Molecule - runs-on: ubuntu-latest - strategy: - matrix: - distro: - - rockylinux9 - - ubuntu2204 - - debian12 - - opensuseleap15 - - 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/full-integration-test.yml b/ansible_collections/grafana/grafana/.github/workflows/full-integration-test.yml deleted file mode 100644 index a7fd9c4..0000000 --- a/ansible_collections/grafana/grafana/.github/workflows/full-integration-test.yml +++ /dev/null @@ -1,69 +0,0 @@ ---- -name: Full Integration Test - -# yamllint disable-line rule:truthy -on: - schedule: - - cron: '0 0 * * 0' - workflow_dispatch: -env: - NAMESPACE: grafana - COLLECTION_NAME: grafana - -jobs: - - integration: - runs-on: ubuntu-20.04 - name: ${{ matrix.ansible }}-py${{ matrix.python }} - strategy: - fail-fast: true - max-parallel: 1 - matrix: - ansible: - - stable-2.11 - - stable-2.12 - - stable-2.13 - - devel - python: - - '2.7' - - '3.5' - - '3.6' - - '3.7' - - '3.8' - - '3.9' - - '3.10' - exclude: - - ansible: stable-2.11 - python: '3.10' - - steps: - - name: Check out code - uses: actions/checkout@v2 - with: - path: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: create integration_config - working-directory: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}}/tests/integration - run: | - cat < integration_config.yml - stack_name: ${{ secrets.ANSIBLE_TEST_STACK_NAME }} - org_name: ${{ secrets.ANSIBLE_TEST_ORG_NAME }} - grafana_cloud_api_key: ${{ secrets.ANSIBLE_TEST_CLOUD_API_KEY }} - grafana_api_key: ${{ secrets.ANSIBLE_TEST_GRAFANA_API_KEY }} - test_stack_name: ${{ secrets.ANSIBLE_TEST_CI_STACK }} - EOF - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.10' - - - name: Install ansible-base (${{ matrix.ansible }}) - run: pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible }}.tar.gz --disable-pip-version-check - - - name: Test Modules - run: ansible-test integration -v alert_contact_point alert_notification_policy cloud_api_key cloud_plugin cloud_stack dashboard datasource folder --color --retry-on-error --continue-on-error --diff --python ${{ matrix.python }} --coverage --docker - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: Cooling Period - run: sleep 3m diff --git a/ansible_collections/grafana/grafana/.github/workflows/lint.yaml b/ansible_collections/grafana/grafana/.github/workflows/lint.yaml deleted file mode 100644 index a53315d..0000000 --- a/ansible_collections/grafana/grafana/.github/workflows/lint.yaml +++ /dev/null @@ -1,63 +0,0 @@ ---- -name: Lint - -# yamllint disable-line rule:truthy -on: - push: - branches: ["main"] - pull_request: - branches: ["main"] - -jobs: - lint: - name: Perform Linting - runs-on: ubuntu-latest - steps: - - name: Install shellcheck - run: | - wget -c https://github.com/koalaman/shellcheck/releases/download/v0.9.0/shellcheck-v0.9.0.linux.x86_64.tar.xz -O shellcheck.tar.xz && \ - tar -xvf shellcheck.tar.xz && \ - sudo mv ./shellcheck-v0.9.0/shellcheck /usr/bin/shellcheck && \ - rm -rf shellcheck-v0.9.0 - - - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: npm - - - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - - name: Install pipenv - run: | - python -m pip install --upgrade pipenv wheel - - - name: Install dependencies - run: make install - - - name: Shell Linting - run: make ci-lint-shell - if: success() || failure() - - # - name: Markdown Linting - # run: make ci-lint-markdown - # if: success() || failure() - - # - name: Text Linting - # run: make ci-lint-text - # if: success() || failure() - - - name: Yaml Linting - run: make ci-lint-yaml - if: success() || failure() - - - name: Editorconfig Linting - run: make ci-lint-editorconfig - if: success() || failure() - - - name: Ansible Linting - run: make ci-lint-ansible - if: success() || failure() diff --git a/ansible_collections/grafana/grafana/.github/workflows/loki-molecule.yml b/ansible_collections/grafana/grafana/.github/workflows/loki-molecule.yml deleted file mode 100644 index 8d8da57..0000000 --- a/ansible_collections/grafana/grafana/.github/workflows/loki-molecule.yml +++ /dev/null @@ -1,44 +0,0 @@ ---- -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 deleted file mode 100644 index 2c6b374..0000000 --- a/ansible_collections/grafana/grafana/.github/workflows/mimir-molecule.yml +++ /dev/null @@ -1,51 +0,0 @@ ---- -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 ansible-core==2.16 'molecule-plugins[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" bitnamilegacy/minio:latest - - - name: Run Molecule tests. - run: molecule --debug test - env: - PY_COLORS: '1' - ANSIBLE_FORCE_COLOR: '1' - MOLECULE_DISTRO: ${{ matrix.distro }} diff --git a/ansible_collections/grafana/grafana/.github/workflows/modules-test.yml b/ansible_collections/grafana/grafana/.github/workflows/modules-test.yml deleted file mode 100644 index 20f7897..0000000 --- a/ansible_collections/grafana/grafana/.github/workflows/modules-test.yml +++ /dev/null @@ -1,98 +0,0 @@ ---- -name: Modules Test - -# yamllint disable-line rule:truthy -on: - push: - branches: - - "main" - pull_request: - schedule: - - cron: '0 6 * * *' -env: - NAMESPACE: grafana - COLLECTION_NAME: grafana - -jobs: - - sanity: - name: Sanity (Ⓐ${{ matrix.ansible }}) - strategy: - matrix: - ansible: - - stable-2.12 - - stable-2.13 - - stable-2.14 - - devel - runs-on: ubuntu-20.04 - steps: - - - name: Check out code - uses: actions/checkout@v3 - with: - path: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: Set up Python - uses: actions/setup-python@v3 - with: - python-version: '3.10' - - - name: Install ansible-base (${{ matrix.ansible }}) - run: pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible }}.tar.gz --disable-pip-version-check - - - name: Run sanity tests - run: ansible-test sanity -v --docker --color --coverage - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - integration: - runs-on: ubuntu-20.04 - name: Integration (Ⓐ${{ matrix.ansible }}-py${{ matrix.python }}) - strategy: - fail-fast: true - max-parallel: 1 - matrix: - ansible: - - stable-2.13 - python: - - '3.10' - - steps: - - name: Check out code - uses: actions/checkout@v2 - with: - path: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: create integration_config - working-directory: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}}/tests/integration - run: | - cat < integration_config.yml - org_name: ${{ secrets.ANSIBLE_TEST_ORG_NAME }} - grafana_cloud_api_key: ${{ secrets.ANSIBLE_TEST_CLOUD_API_KEY }} - grafana_api_key: ${{ secrets.ANSIBLE_TEST_GRAFANA_API_KEY }} - grafana_url: ${{ secrets.ANSIBLE_GRAFANA_URL }} - test_stack_name: ${{ secrets.ANSIBLE_TEST_CI_STACK }} - EOF - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python }} - - - name: Install ansible-base (${{ matrix.ansible }}) - run: pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible }}.tar.gz --disable-pip-version-check - - - name: Install Requests - run: pip install requests - - - name: Create Test Stack - run: ansible-test integration -v create_cloud_stack --color --retry-on-error --continue-on-error --diff --python ${{ matrix.python }} --coverage --docker - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: Test Modules - run: ansible-test integration -v alert_contact_point alert_notification_policy cloud_api_key cloud_plugin dashboard datasource folder --color --retry-on-error --continue-on-error --diff --python ${{ matrix.python }} --coverage --docker - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: Delete Test Stack - if: success() || failure() - run: ansible-test integration -v delete_cloud_stack --color --retry-on-error --continue-on-error --diff --python ${{ matrix.python }} --coverage --docker - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} diff --git a/ansible_collections/grafana/grafana/.github/workflows/opentelemetry-collector-molecule.yml b/ansible_collections/grafana/grafana/.github/workflows/opentelemetry-collector-molecule.yml deleted file mode 100644 index 4ee16cd..0000000 --- a/ansible_collections/grafana/grafana/.github/workflows/opentelemetry-collector-molecule.yml +++ /dev/null @@ -1,44 +0,0 @@ ---- -name: OpenTelemetry Collector Molecule - -on: - push: - branches: - - main - pull_request: - branches: - - main - -defaults: - run: - working-directory: roles/opentelemetry_collector - -jobs: - molecule: - name: Molecule - runs-on: ubuntu-latest - strategy: - matrix: - scenario: - - default - - default-check-first - - latest - - non-contrib - - 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 pytest-testinfra - - - name: Run Molecule tests. - run: molecule test -s ${{ matrix.scenario }} - env: - PY_COLORS: '1' - ANSIBLE_FORCE_COLOR: '1' diff --git a/ansible_collections/grafana/grafana/.github/workflows/promtail-molecule.yml b/ansible_collections/grafana/grafana/.github/workflows/promtail-molecule.yml deleted file mode 100644 index e8168b4..0000000 --- a/ansible_collections/grafana/grafana/.github/workflows/promtail-molecule.yml +++ /dev/null @@ -1,44 +0,0 @@ ---- -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/.github/workflows/release.yml b/ansible_collections/grafana/grafana/.github/workflows/release.yml deleted file mode 100644 index cdf1b2b..0000000 --- a/ansible_collections/grafana/grafana/.github/workflows/release.yml +++ /dev/null @@ -1,159 +0,0 @@ ---- -name: GitHub Release - -# yamllint disable-line rule:truthy -on: - workflow_dispatch: - inputs: - version: - description: 'Version number to release' - required: true -env: - NAMESPACE: grafana - COLLECTION_NAME: grafana - -jobs: - sanity: - name: Sanity (Ⓐ${{ matrix.ansible }}) - strategy: - matrix: - ansible: - - stable-2.12 - - stable-2.13 - - stable-2.14 - - devel - runs-on: ubuntu-20.04 - steps: - - - name: Check out code - uses: actions/checkout@v3 - with: - path: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: Set up Python - uses: actions/setup-python@v3 - with: - python-version: '3.10' - - - name: Install ansible-base (${{ matrix.ansible }}) - run: pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible }}.tar.gz --disable-pip-version-check - - - name: Run sanity tests - run: ansible-test sanity -v --docker --color --coverage - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - integration: - runs-on: ubuntu-20.04 - name: Integration (Ⓐ${{ matrix.ansible }}-py${{ matrix.python }}) - strategy: - fail-fast: true - max-parallel: 1 - matrix: - ansible: - - stable-2.13 - python: - - '3.10' - - steps: - - name: Check out code - uses: actions/checkout@v2 - with: - path: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: create integration_config - working-directory: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}}/tests/integration - run: | - cat < integration_config.yml - org_name: ${{ secrets.ANSIBLE_TEST_ORG_NAME }} - grafana_cloud_api_key: ${{ secrets.ANSIBLE_TEST_CLOUD_API_KEY }} - grafana_api_key: ${{ secrets.ANSIBLE_TEST_GRAFANA_API_KEY }} - grafana_url: ${{ secrets.ANSIBLE_GRAFANA_URL }} - test_stack_name: ${{ secrets.ANSIBLE_TEST_CI_STACK }} - EOF - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python }} - - - name: Install ansible-base (${{ matrix.ansible }}) - run: pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible }}.tar.gz --disable-pip-version-check - - - name: Install Requests - run: pip install requests - - - name: Create Test Stack - run: ansible-test integration -v create_cloud_stack --color --retry-on-error --continue-on-error --diff --python ${{ matrix.python }} --coverage --docker - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: Test Modules - run: ansible-test integration -v alert_contact_point alert_notification_policy cloud_api_key cloud_plugin dashboard datasource folder --color --retry-on-error --continue-on-error --diff --python ${{ matrix.python }} --coverage --docker - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: Delete Test Stack - if: success() || failure() - run: ansible-test integration -v delete_cloud_stack --color --retry-on-error --continue-on-error --diff --python ${{ matrix.python }} --coverage --docker - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - publish: - name: Publish to Galaxy - runs-on: ubuntu-latest - needs: [sanity, integration] - timeout-minutes: 15 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.10' - - - name: Install Ansible - run: pip install ansible-core - - - name: Install PyYaml - run: pip install pyyaml - - - name: Validate version matches - run: | - VERSION=$(python -c "import yaml; print(yaml.safe_load(open('galaxy.yml'))['version'])") - if [ "$VERSION" != "${{ github.event.inputs.version }}" ]; then - echo "Error: Input version (${{ github.event.inputs.version }}) doesn't match galaxy.yml version ($VERSION)" - exit 1 - fi - - - name: Build collection - id: build - run: | - ansible-galaxy collection build - echo "archive_path=$(ls *.tar.gz)" >> $GITHUB_OUTPUT - - - name: Publish collection to Galaxy - env: - ANSIBLE_GALAXY_API_KEY: ${{ secrets.ANSIBLE_GALAXY_API_KEY }} - run: ansible-galaxy collection publish --api-key ${{ secrets.ANSIBLE_GALAXY_API_KEY }} ${{ steps.build.outputs.archive_path }} - - release: - name: Create GitHub Release - runs-on: ubuntu-latest - needs: [publish] - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.10' - - - name: Install PyYaml - run: pip install pyyaml - - - name: Validate version is published to Galaxy - run: curl --head -s -f -o /dev/null https://galaxy.ansible.com/download/grafana-grafana-${{ github.event.inputs.version }}.tar.gz - - - name: Release - uses: softprops/action-gh-release@v1 - with: - tag_name: ${{ github.event.inputs.version }} diff --git a/ansible_collections/grafana/grafana/.github/workflows/roles-test.yml b/ansible_collections/grafana/grafana/.github/workflows/roles-test.yml deleted file mode 100644 index 9595505..0000000 --- a/ansible_collections/grafana/grafana/.github/workflows/roles-test.yml +++ /dev/null @@ -1,90 +0,0 @@ ---- -name: Roles Test - -# yamllint disable-line rule:truthy -on: - push: - branches: - - "main" - pull_request: - schedule: - - cron: '0 6 * * *' -env: - NAMESPACE: grafana - COLLECTION_NAME: grafana - -jobs: - - sanity: - name: Sanity (Ⓐ${{ matrix.ansible }}) - strategy: - matrix: - ansible: - - stable-2.12 - - stable-2.13 - - stable-2.14 - - devel - runs-on: ubuntu-20.04 - steps: - - - name: Check out code - uses: actions/checkout@v3 - with: - path: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: Set up Python - uses: actions/setup-python@v3 - with: - python-version: '3.10' - - - name: Install ansible-base (${{ matrix.ansible }}) - run: pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible }}.tar.gz --disable-pip-version-check - - - name: Run sanity tests - run: ansible-test sanity -v --docker --color --coverage - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - integration: - runs-on: ubuntu-20.04 - name: Integration (Ⓐ${{ matrix.ansible }}-py${{ matrix.python }}) - strategy: - fail-fast: true - max-parallel: 1 - matrix: - ansible: - - stable-2.13 - python: - - '3.10' - - steps: - - name: Check out code - uses: actions/checkout@v2 - with: - path: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} - - - name: create integration_config - working-directory: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}}/tests/integration - run: | - cat < integration_config.yml - stack_name: ${{ secrets.ANSIBLE_TEST_STACK_NAME }} - org_name: ${{ secrets.ANSIBLE_TEST_ORG_NAME }} - grafana_cloud_api_key: ${{ secrets.ANSIBLE_TEST_CLOUD_API_KEY }} - grafana_api_key: ${{ secrets.ANSIBLE_TEST_GRAFANA_API_KEY }} - grafana_url: ${{ secrets.ANSIBLE_GRAFANA_URL }} - test_stack_name: ${{ secrets.ANSIBLE_TEST_CI_STACK }} - EOF - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python }} - - - name: Install ansible-base (${{ matrix.ansible }}) - run: pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible }}.tar.gz --disable-pip-version-check - - - name: Install Requests - run: pip install requests - - - name: Test Roles - run: ansible-test integration -v molecule-grafana-alternative molecule-grafana-default --color --retry-on-error --continue-on-error --diff --python ${{ matrix.python }} --coverage --docker - working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}} diff --git a/ansible_collections/grafana/grafana/.gitignore b/ansible_collections/grafana/grafana/.gitignore deleted file mode 100644 index 9d1b555..0000000 --- a/ansible_collections/grafana/grafana/.gitignore +++ /dev/null @@ -1,237 +0,0 @@ -# Project -# --------------------------------------------------- -*.pyc -.vscode -.idea -hosts -*.log -yala - -# MacOS -# --------------------------------------------------- -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - - -# Windows -# --------------------------------------------------- -# Windows thumbnail cache files -Thumbs.db -Thumbs.db:encryptable -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts -*.lnk - - -# MS Office -# --------------------------------------------------- -*.tmp - -# Word temporary -~$*.doc* - -# Word Auto Backup File -Backup of *.doc* - -# Excel temporary -~$*.xls* - -# Excel Backup File -*.xlk - -# PowerPoint temporary -~$*.ppt* - -# Visio autosave temporary files -*.~vsd* - - -# VS Code -# --------------------------------------------------- -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ -*.app -.snapshots/* - - -# NodeJS -# --------------------------------------------------- -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* diff --git a/ansible_collections/grafana/grafana/.markdownlint.yaml b/ansible_collections/grafana/grafana/.markdownlint.yaml deleted file mode 100644 index f12a082..0000000 --- a/ansible_collections/grafana/grafana/.markdownlint.yaml +++ /dev/null @@ -1,261 +0,0 @@ ---- -# Example markdownlint YAML configuration with all properties set to their default value - -# Default state for all rules -default: true - -# Path to configuration file to extend -extends: null - -# MD001/heading-increment/header-increment - Heading levels should only increment by one level at a time -MD001: true - -# MD002/first-heading-h1/first-header-h1 - First heading should be a top-level heading -MD002: - # Heading level - level: 1 - -# MD003/heading-style/header-style - Heading style -MD003: - # Heading style - style: "consistent" - -# MD004/ul-style - Unordered list style -MD004: - # List style - style: "consistent" - -# MD005/list-indent - Inconsistent indentation for list items at the same level -MD005: true - -# MD006/ul-start-left - Consider starting bulleted lists at the beginning of the line -MD006: true - -# MD007/ul-indent - Unordered list indentation -MD007: - # Spaces for indent - indent: 2 - # Whether to indent the first level of the list - start_indented: false - # Spaces for first level indent (when start_indented is set) - start_indent: 2 - -# MD009/no-trailing-spaces - Trailing spaces -MD009: - # Spaces for line break - br_spaces: 2 - # Allow spaces for empty lines in list items - list_item_empty_lines: false - # Include unnecessary breaks - strict: false - -# MD010/no-hard-tabs - Hard tabs -MD010: - # Include code blocks - code_blocks: true - # Fenced code languages to ignore - ignore_code_languages: [] - # Number of spaces for each hard tab - spaces_per_tab: 2 - -# MD011/no-reversed-links - Reversed link syntax -MD011: true - -# MD012/no-multiple-blanks - Multiple consecutive blank lines -MD012: - # Consecutive blank lines - maximum: 1 - -# MD013/line-length - Line length -MD013: - # Number of characters - line_length: 150 - # Number of characters for headings - heading_line_length: 80 - # Number of characters for code blocks - code_block_line_length: 100 - # Include code blocks - code_blocks: true - # Include tables - tables: false - # Include headings - headings: true - # Include headings - headers: true - # Strict length checking - strict: false - # Stern length checking - stern: false - -# MD014/commands-show-output - Dollar signs used before commands without showing output -MD014: false - -# MD018/no-missing-space-atx - No space after hash on atx style heading -MD018: true - -# MD019/no-multiple-space-atx - Multiple spaces after hash on atx style heading -MD019: true - -# MD020/no-missing-space-closed-atx - No space inside hashes on closed atx style heading -MD020: true - -# MD021/no-multiple-space-closed-atx - Multiple spaces inside hashes on closed atx style heading -MD021: true - -# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines -MD022: - # Blank lines above heading - lines_above: 1 - # Blank lines below heading - lines_below: 1 - -# MD023/heading-start-left/header-start-left - Headings must start at the beginning of the line -MD023: true - -# MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content -MD024: false - -# MD025/single-title/single-h1 - Multiple top-level headings in the same document -MD025: - # Heading level - level: 1 - # RegExp for matching title in front matter - front_matter_title: "^\\s*title\\s*[:=]" - -# MD026/no-trailing-punctuation - Trailing punctuation in heading -MD026: - # Punctuation characters not allowed at end of headings - punctuation: ".,;:!。,;:!" - -# MD027/no-multiple-space-blockquote - Multiple spaces after blockquote symbol -MD027: true - -# MD028/no-blanks-blockquote - Blank line inside blockquote -MD028: true - -# MD029/ol-prefix - Ordered list item prefix -MD029: - # List style - style: "one_or_ordered" - -# MD030/list-marker-space - Spaces after list markers -MD030: - # Spaces for single-line unordered list items - ul_single: 3 - # Spaces for single-line ordered list items - ol_single: 2 - # Spaces for multi-line unordered list items - ul_multi: 3 - # Spaces for multi-line ordered list items - ol_multi: 2 - -# MD031/blanks-around-fences - Fenced code blocks should be surrounded by blank lines -MD031: - # Include list items - list_items: true - -# MD032/blanks-around-lists - Lists should be surrounded by blank lines -MD032: true - -# MD033/no-inline-html - Inline HTML -MD033: - # Allowed elements - allowed_elements: - - div - - br - - hr - -# MD034/no-bare-urls - Bare URL used -MD034: true - -# MD035/hr-style - Horizontal rule style -MD035: - # Horizontal rule style - style: "consistent" - -# MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading -MD036: false - -# MD037/no-space-in-emphasis - Spaces inside emphasis markers -MD037: true - -# MD038/no-space-in-code - Spaces inside code span elements -MD038: true - -# MD039/no-space-in-links - Spaces inside link text -MD039: true - -# MD040/fenced-code-language - Fenced code blocks should have a language specified -MD040: - # List of languages - allowed_languages: [] - # Require language only - language_only: false - -# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading -MD041: - # Heading level - level: 1 - # RegExp for matching title in front matter - front_matter_title: "^\\s*title\\s*[:=]" - -# MD042/no-empty-links - No empty links -MD042: true - -# MD043/required-headings/required-headers - Required heading structure -MD043: - # List of headings - headings: - - "*" - # List of headings - headers: [] - # Match case of headings - match_case: false - -# MD044/proper-names - Proper names should have the correct capitalization -MD044: - # List of proper names - names: [] - # Include code blocks - code_blocks: true - # Include HTML elements - html_elements: true - -# MD045/no-alt-text - Images should have alternate text (alt text) -MD045: true - -# MD046/code-block-style - Code block style -MD046: - # Block style - style: "consistent" - -# MD047/single-trailing-newline - Files should end with a single newline character -MD047: true - -# MD048/code-fence-style - Code fence style -MD048: - # Code fence style - style: "consistent" - -# MD049/emphasis-style - Emphasis style should be consistent -MD049: - # Emphasis style should be consistent - style: "consistent" - -# MD050/strong-style - Strong style should be consistent -MD050: - # Strong style should be consistent - style: "consistent" - -# MD051/link-fragments - Link fragments should be valid -MD051: false - -# MD052/reference-links-images - Reference links and images should use a label that is defined -MD052: true - -# MD053/link-image-reference-definitions - Link and image reference definitions should be needed -MD053: - # Ignored definitions - ignored_definitions: [ - "//" - ] diff --git a/ansible_collections/grafana/grafana/.shellcheckrc b/ansible_collections/grafana/grafana/.shellcheckrc deleted file mode 100644 index 9eac5ba..0000000 --- a/ansible_collections/grafana/grafana/.shellcheckrc +++ /dev/null @@ -1,7 +0,0 @@ -# Allow opening any 'source'd file, even if not specified as input -external-sources=true - -# some files are sourced which can make some areas appear unreachable -disable=SC2317 -disable=SC2250 -disable=SC2312 diff --git a/ansible_collections/grafana/grafana/.textlintrc b/ansible_collections/grafana/grafana/.textlintrc deleted file mode 100644 index 1ea8e9c..0000000 --- a/ansible_collections/grafana/grafana/.textlintrc +++ /dev/null @@ -1,187 +0,0 @@ -{ - "rules": { - "common-misspellings": true, - "no-todo": true, - "terminology": { - "defaultTerms": false, - "terms": [ - "Grafana", - ["GrafanaLabs", "Grafana Labs"], - ["GrafanaCloud", "Grafana Cloud"], - "Mimir", - "Loki", - "Phlare", - "Tempo", - "Faro", - "Raintank", - "Prometheus", - "PromQL", - ["(E|e)xamplars", "$1xemplars"], - ["(D|d)atasource", "$1ata source"], - "CData", - "Google", - "Amazon", - "RedHat", - "Azure", - "Airbnb", - "Android", - "AppleScript", - "AppVeyor", - "AVA", - "BrowserStack", - "Browsersync", - "Codecov", - "CodePen", - "CodeSandbox", - "DefinitelyTyped", - "EditorConfig", - "ESLint", - "GitHub", - "GraphQL", - "iOS", - "JavaScript", - "JetBrains", - "jQuery", - "LinkedIn", - "Lodash", - "MacBook", - "Markdown", - "OpenType", - "PayPal", - "PhpStorm", - "RubyMine", - "Sass", - "SemVer", - "TypeScript", - "UglifyJS", - "Wasm", - "WebAssembly", - "WebStorm", - "WordPress", - "YouTube", - ["Common[ .]js", "CommonJS"], - ["JSDocs?", "JSDoc"], - ["Nodejs", "Node.js"], - ["React[ .]js", "React"], - ["SauceLabs", "Sauce Labs"], - ["StackOverflow", "Stack Overflow"], - ["styled ?components", "styled-components"], - ["HTTP[ /]2(?:\\.0)?", "HTTP/2"], - ["OS X", "macOS"], - ["Mac ?OS", "macOS"], - ["a npm", "an npm"], - "ECMAScript", - ["ES2015", "ES6"], - ["ES7", "ES2016"], - "3D", - ["3-D", "3D"], - "Ajax", - "API", - ["API[']?s", "APIs"], - "CSS", - "GIF", - " HTML ", - "HTTPS", - "IoT", - "I/O", - ["I-O", "I/O"], - "JPEG", - "MIME", - "OK", - "PaaS", - " PDF ", - "PNG", - "SaaS", - "URL", - ["URL[']?s", "URLs"], - ["an URL", "a URL"], - ["wi[- ]?fi", "Wi-Fi"], - "McKenzie", - "McConnell", - [" id", " ID"], - ["id[']?s", "IDs"], - ["backwards compatible", "backward compatible"], - ["build system(s?)", "build tool$1"], - ["CLI tool(s?)", "command-line tool$1"], - ["he or she", "they"], - ["he/she", "they"], - ["\\(s\\)he", "they"], - ["repo\\b", "repository"], - ["smartphone(s?)", "mobile phone$1"], - ["web[- ]?site(s?)", "site$1"], - ["auto[- ]complete", "autocomplete"], - ["auto[- ]format", "autoformat"], - ["auto[- ]fix", "autofix"], - ["auto[- ]fixing", "autofixing"], - ["back[- ]end(\\w*)", "backend$1"], - ["bug[- ]fix(es?)", "bugfix$1"], - ["change[- ]log(s?)", "changelog$1"], - ["check[- ]box(es?)", "checkbox$1"], - ["code[- ]base(es?)", "codebase$1"], - ["co[- ]locate(d?)", "colocate$1"], - ["end[- ]point(s?)", "endpoint$1"], - ["e[- ]mail(s?)", "email$1"], - ["file[- ]name(s?)", "filename$1"], - ["front[- ]end(\\w*)", "frontend$1"], - ["hack[- ]a[- ]thon(s?)", "hackathon$1"], - ["host[- ]name(s?)", "hostname$1"], - ["hot[- ]key(s?)", "hotkey$1"], - ["life[- ]cycle", "lifecycle"], - ["life[- ]stream(s?)", "lifestream$1"], - ["lock[- ]file(s?)", "lockfile$1"], - ["mark-up", "markup"], - ["meta[- ]data", "metadata"], - ["micro[- ]service(s?)", "microservice$1"], - ["name[- ]space(s?)", "namespace$1"], - ["pre[- ]condition(s?)", "precondition$1"], - ["pre[- ]defined", "predefined"], - ["pre[- ]release(s?)", "prerelease$1"], - ["re[- ]write", "rewrite"], - ["run[- ]time", "runtime"], - ["screen[- ]shot(s?)", "screenshot$1"], - ["screen[- ]?snap(s?)", "screenshot$1"], - ["sub[- ]class((?:es|ing)?)", "subclass$1"], - ["sub[- ]tree(s?)", "subtree$1"], - ["time[- ]stamp(s?)", "timestamp$1"], - ["touch[- ]screen(s?)", "touchscreen$1"], - ["user[- ]name(s?)", "username$1"], - ["walk[- ]through", "walkthrough"], - ["white[- ]space", "whitespace"], - ["wild[- ]card(s?)", "wildcard$1"], - ["css-?in-?js", "CSS in JS"], - ["code-?review(s?)", "code review$1"], - ["code-?splitting", "code splitting"], - ["end-?user(s?)", "end user$1"], - ["file-?type(s?)", "file type$1"], - ["micro-?frontend(s?)", "micro frontend$1"], - ["open-?source(ed?)", "open source$1"], - ["regexp?(s?)", "regular expression$1"], - ["style-?guide(s?)", "style guide$1"], - ["tree-?shaking", "tree shaking"], - ["source-?map(s?)", "source map$1"], - ["style-?sheet(s?)", "style sheet$1"], - ["user-?base", "user base"], - ["web-?page(s?)", "web page$1"], - ["built ?in", "built-in"], - ["client ?side", "client-side"], - ["command ?line", "command-line"], - ["end ?to ?end", "end-to-end"], - ["error ?prone", "error-prone"], - ["higher ?order", "higher-order"], - ["key[/ ]?value", "key-value"], - ["server ?side", "server-side"], - ["two ?steps?", "two-step"], - ["2 ?steps?", "two-step"], - ["(\\w+[^.?!]\\)? )base64", "$1base64"], - ["(\\w+[^.?!]\\)? )internet", "$1internet"], - ["(\\w+[^.?!]\\)? )stylelint", "$1stylelint"], - ["(\\w+[^.?!]\\)? )webpack", "$1webpack"], - ["(\\w+[^.?!]\\)? )npm", "$1npm"], - ["environemnt(s?)", "environment$1"], - ["pacakge(s?)", "package$1"], - ["tilda", "tilde"], - ["falsey", "falsy"] - ] - } - } -} diff --git a/ansible_collections/grafana/grafana/.yamllint b/ansible_collections/grafana/grafana/.yamllint deleted file mode 100644 index 53231c4..0000000 --- a/ansible_collections/grafana/grafana/.yamllint +++ /dev/null @@ -1,15 +0,0 @@ ---- -yaml-files: - - "*.yaml" - - "*.yml" - - ".yamllint" - -ignore: - - node_modules - -extends: default - -rules: - line-length: - max: 150 - level: warning diff --git a/ansible_collections/grafana/grafana/CHANGELOG.rst b/ansible_collections/grafana/grafana/CHANGELOG.rst deleted file mode 100644 index 8ff5919..0000000 --- a/ansible_collections/grafana/grafana/CHANGELOG.rst +++ /dev/null @@ -1,695 +0,0 @@ -============================= -Grafana.Grafana Release Notes -============================= - -.. contents:: Topics - -v6.0.6 -====== - -Major Changes -------------- - -- Restore default listen address and port in Mimir by @56quarters in https://github.com/grafana/grafana-ansible-collection/pull/456 -- fix broken Grafana apt repository addition by @kleini in https://github.com/grafana/grafana-ansible-collection/pull/454 - -v6.0.5 -====== - -Major Changes -------------- - -- Fallback to empty dict in case grafana_ini is undefined by @root-expert in https://github.com/grafana/grafana-ansible-collection/pull/403 -- Fix Mimir config file validation task by @Windos in https://github.com/grafana/grafana-ansible-collection/pull/428 -- Fixes issue by @digiserg in https://github.com/grafana/grafana-ansible-collection/pull/421 -- Import custom dashboards only when directory exists by @mahendrapaipuri in https://github.com/grafana/grafana-ansible-collection/pull/430 -- Updated YUM repo urls from `packages.grafana.com` to `rpm.grafana.com` by @DejfCold in https://github.com/grafana/grafana-ansible-collection/pull/414 -- Use credentials from grafana_ini when importing dashboards by @root-expert in https://github.com/grafana/grafana-ansible-collection/pull/402 -- do not skip scrape latest github version even in check_mode by @cmehat in https://github.com/grafana/grafana-ansible-collection/pull/408 -- fix datasource documentation by @jeremad in https://github.com/grafana/grafana-ansible-collection/pull/437 -- fix mimir_download_url_deb & mimir_download_url_rpm by @germebl in https://github.com/grafana/grafana-ansible-collection/pull/400 -- update catalog info by @Duologic in https://github.com/grafana/grafana-ansible-collection/pull/434 -- use deb822 for newer debian versions by @Lukas-Heindl in https://github.com/grafana/grafana-ansible-collection/pull/440 - -v6.0.4 -====== - -Major Changes -------------- - -- Add SUSE support to Alloy role by @pozsa in https://github.com/grafana/grafana-ansible-collection/pull/423 -- Fixes to foldersFromFilesStructure option by @root-expert in https://github.com/grafana/grafana-ansible-collection/pull/351 -- Migrate RedHat install to ansible.builtin.package by @r65535 in https://github.com/grafana/grafana-ansible-collection/pull/431 -- add macOS support to alloy role by @l50 in https://github.com/grafana/grafana-ansible-collection/pull/418 -- replace None with [] for safe length checks by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/426 - -v6.0.3 -====== - -Major Changes -------------- - -- Bump ansible-lint from 24.9.2 to 25.6.1 by @dependabot[bot] in https://github.com/grafana/grafana-ansible-collection/pull/391 -- Bump brace-expansion from 1.1.11 to 1.1.12 in the npm_and_yarn group across 1 directory by @dependabot[bot] in https://github.com/grafana/grafana-ansible-collection/pull/396 -- Changes for issue -- Update Mimir README.md by @Gufderald in https://github.com/grafana/grafana-ansible-collection/pull/397 -- declare collection dependencies by @ishanjainn in https://github.com/grafana/grafana-ansible-collection/pull/390 -- declare collection dependencies by @kleini in https://github.com/grafana/grafana-ansible-collection/pull/392 -- ensure IP assert returns boolean result by @aardbol in https://github.com/grafana/grafana-ansible-collection/pull/398 -- improve mimir/alloy examples playbook by @smCloudInTheSky in https://github.com/grafana/grafana-ansible-collection/pull/369 -- store APT key with .asc extension by @derhuerst in https://github.com/grafana/grafana-ansible-collection/pull/394 - -v6.0.2 -====== - -Major Changes -------------- - -- Add delete protection by @KucicM in https://github.com/grafana/grafana-ansible-collection/pull/381 -- Don't override defaults by @56quarters in https://github.com/grafana/grafana-ansible-collection/pull/382 -- Don't use a proxy when doing Alloy readiness check by @benoitc-croesus in https://github.com/grafana/grafana-ansible-collection/pull/375 -- Fix Mimir URL verify task by @parcimonic in https://github.com/grafana/grafana-ansible-collection/pull/358 -- Fix some regression introduced by v6 by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/376 -- Update when statement to test for dashboard files found by @hal58th in https://github.com/grafana/grafana-ansible-collection/pull/363 -- Use become false in find task by @santilococo in https://github.com/grafana/grafana-ansible-collection/pull/368 -- alloy_readiness_check_use_https by @piotr-g in https://github.com/grafana/grafana-ansible-collection/pull/359 -- declare collection dependencies by @kleini in https://github.com/grafana/grafana-ansible-collection/pull/386 -- ensure alerting provisioning directory exists by @derhuerst in https://github.com/grafana/grafana-ansible-collection/pull/364 -- mark configuration deployment task with `no_log` by @kkantonop in https://github.com/grafana/grafana-ansible-collection/pull/380 -- properly validate config by @pieterlexis-tomtom in https://github.com/grafana/grafana-ansible-collection/pull/354 -- template ingester and querier section by @Gufderald in https://github.com/grafana/grafana-ansible-collection/pull/371 -- use ansible_facts instead of variables by @kleini in https://github.com/grafana/grafana-ansible-collection/pull/365 - -v6.0.1 -====== - -Minor Changes -------------- - -- Remove Node modules from Ansible Collection build - -v6.0.0 -====== - -Major Changes -------------- - -- Add foldersFromFilesStructure option by @root-expert in https://github.com/grafana/grafana-ansible-collection/pull/326 -- Add tempo role by @CSTDev in https://github.com/grafana/grafana-ansible-collection/pull/323 -- Do not log grafana.ini contents when setting facts by @root-expert in https://github.com/grafana/grafana-ansible-collection/pull/325 -- Fix loki_operational_config section not getting rendered in config.yml by @olegkaspersky in https://github.com/grafana/grafana-ansible-collection/pull/330 -- Fix sectionless items edge case by @santilococo in https://github.com/grafana/grafana-ansible-collection/pull/303 -- Fix tags Inherit default vars by @MJurayev in https://github.com/grafana/grafana-ansible-collection/pull/341 -- Fix the markdown code fences for install command by @benmatselby in https://github.com/grafana/grafana-ansible-collection/pull/306 -- Grafana fix facts in main.yml by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/315 -- Make dashboard imports more flexible by @torfbolt in https://github.com/grafana/grafana-ansible-collection/pull/308 -- Make systemd create /var/lib/otel-collector by @pieterlexis-tomtom in https://github.com/grafana/grafana-ansible-collection/pull/336 -- Validate config by @pieterlexis-tomtom in https://github.com/grafana/grafana-ansible-collection/pull/327 -- add catalog-info file for internal dev catalog by @theSuess in https://github.com/grafana/grafana-ansible-collection/pull/317 -- add publish step to GitHub Actions workflow for Ansible Galaxy by @thelooter in https://github.com/grafana/grafana-ansible-collection/pull/340 -- add user module to create/update/delete grafana users by @mvalois in https://github.com/grafana/grafana-ansible-collection/pull/178 -- force temporary directory even in check mode for dashboards.yml by @cmehat in https://github.com/grafana/grafana-ansible-collection/pull/339 -- integrate sles legacy init-script support by @floerica in https://github.com/grafana/grafana-ansible-collection/pull/184 -- management of the config.river with the conversion of the config.yaml by @lbrule in https://github.com/grafana/grafana-ansible-collection/pull/149 -- use ansible_facts instead of ansible_* variables by @kleini in https://github.com/grafana/grafana-ansible-collection/pull/296 - -v5.7.0 -====== - -Major Changes -------------- - -- Ability to set custom directory path for \*.alloy config files by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/294 -- Add tests and support version latest by @pieterlexis-tomtom in https://github.com/grafana/grafana-ansible-collection/pull/299 -- Fix 'dict object' has no attribute 'path' when running with --check by @JMLX42 in https://github.com/grafana/grafana-ansible-collection/pull/283 -- Update grafana template by @santilococo in https://github.com/grafana/grafana-ansible-collection/pull/300 -- add loki bloom support by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/298 -- grafana.ini yaml syntax by @intermittentnrg in https://github.com/grafana/grafana-ansible-collection/pull/232 - -v5.6.0 -====== - -Major Changes -------------- - -- Adding "distributor" section support to mimir config file by @HamzaKhait in https://github.com/grafana/grafana-ansible-collection/pull/247 -- Allow alloy_user_groups variable again by @pjezek in https://github.com/grafana/grafana-ansible-collection/pull/276 -- Alloy Role Improvements by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/281 -- Bump ansible-lint from 24.6.0 to 24.9.2 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/270 -- Bump pylint from 3.2.5 to 3.3.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/273 -- Ensure check-mode works for otel collector by @pieterlexis-tomtom in https://github.com/grafana/grafana-ansible-collection/pull/264 -- Fix message argument of dashboard task by @Nemental in https://github.com/grafana/grafana-ansible-collection/pull/256 -- Update Alloy variables to use the `grafana_alloy_` namespace so they are unique by @Aethylred in https://github.com/grafana/grafana-ansible-collection/pull/209 -- Update README.md by @aioue in https://github.com/grafana/grafana-ansible-collection/pull/272 -- Update README.md by @aioue in https://github.com/grafana/grafana-ansible-collection/pull/275 -- Update main.yml by @aioue in https://github.com/grafana/grafana-ansible-collection/pull/274 -- add grafana_plugins_ops to defaults and docs by @weakcamel in https://github.com/grafana/grafana-ansible-collection/pull/251 -- add option to populate google_analytics_4_id value by @copolycube in https://github.com/grafana/grafana-ansible-collection/pull/249 -- fix ansible-lint warnings on Forbidden implicit octal value "0640" by @copolycube in https://github.com/grafana/grafana-ansible-collection/pull/279 - -v5.5.1 -====== - -Bugfixes --------- - -- Add check_mode: false to Loki "Scrape GitHub" Task by @winsmith in https://github.com/grafana/grafana-ansible-collection/pull/262 - -v5.5.0 -====== - -Major Changes -------------- - -- add support for extra args by @harryfinbow in https://github.com/grafana/grafana-ansible-collection/pull/259 -- mimir molecule should use ansible core 2.16 by @GVengelen in https://github.com/grafana/grafana-ansible-collection/pull/254 - -v5.4.1 -====== - -Major Changes -------------- - -- Updated promtail arch map for aarch64 matching by @gianmarco-mameli in https://github.com/grafana/grafana-ansible-collection/pull/257 - -v5.4.0 -====== - -Major Changes -------------- - -- Use a variable to control uninstall behavior instead of tags by @dobbi84 in https://github.com/grafana/grafana-ansible-collection/pull/253 - -v5.3.0 -====== - -Major Changes -------------- - -- Add a config check before restarting mimir by @panfantastic in https://github.com/grafana/grafana-ansible-collection/pull/198 -- Add support for configuring feature_toggles in grafana role by @LexVar in https://github.com/grafana/grafana-ansible-collection/pull/173 -- Backport post-setup healthcheck from agent to alloy by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/213 -- Bump ansible-lint from 24.2.3 to 24.5.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/207 -- Bump ansible-lint from 24.5.0 to 24.6.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/216 -- Bump braces from 3.0.2 to 3.0.3 in the npm_and_yarn group across 1 directory by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/218 -- Bump pylint from 3.1.0 to 3.1.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/200 -- Bump pylint from 3.1.1 to 3.2.2 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/208 -- Bump pylint from 3.2.2 to 3.2.3 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/217 -- Bump pylint from 3.2.3 to 3.2.5 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/234 -- Change from config.river to config.alloy by @cardasac in https://github.com/grafana/grafana-ansible-collection/pull/225 -- Fix Grafana Configuration for Unified and Legacy Alerting Based on Version by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/215 -- Fix env file location by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/211 -- Support adding alloy user to extra groups by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/212 -- Updated result.json['message'] to result.json()['message'] by @CPreun in https://github.com/grafana/grafana-ansible-collection/pull/223 -- readme styling & language improvements by @tigattack in https://github.com/grafana/grafana-ansible-collection/pull/214 - -v5.2.0 -====== - -Major Changes -------------- - -- Add a new config part to configure KeyCloak based auth by @he0s in https://github.com/grafana/grafana-ansible-collection/pull/191 -- Add promtail role by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/197 -- Bump ansible-lint from 24.2.2 to 24.2.3 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/195 - -v5.1.0 -====== - -Major Changes -------------- - -- 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 Loki role by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/188 -- Add Grafana Mimir role by @GVengelen in https://github.com/grafana/grafana-ansible-collection/pull/183 - -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 -------------- - -- Apply correct uid + gid for imported dashboards by @hypery2k in https://github.com/grafana/grafana-ansible-collection/pull/167 -- Bump ansible-lint from 24.2.0 to 24.2.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/164 -- 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 -- Clarify grafana-server configuration in README by @VGerris in https://github.com/grafana/grafana-ansible-collection/pull/177 -- Update description to match module by @brmurphy in https://github.com/grafana/grafana-ansible-collection/pull/179 - -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 -====== - -Release Summary ---------------- - -Grafana and Agent Role bug fixes and security updates - -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 -- 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 -- Bump ansible-lint from 6.22.2 to 24.2.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/150 -- Bump jinja2 from 3.1.2 to 3.1.3 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/129 -- Bump pylint from 2.16.2 to 3.0.3 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/141 -- Bump yamllint from 1.29.0 to 1.33.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/140 -- Bump yamllint from 1.29.0 to 1.33.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/143 -- Bump yamllint from 1.33.0 to 1.34.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/151 -- Change handler to systemd by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/135 -- Fix links in grafana_agent/defaults/main.yaml by @PabloCastellano in https://github.com/grafana/grafana-ansible-collection/pull/134 -- Topic/grafana agent idempotency by @ohdearaugustin in https://github.com/grafana/grafana-ansible-collection/pull/147 - -v2.2.4 -====== - -Release Summary ---------------- - -Grafana and Agent Role bug fixes and security updates - -Minor Changes -------------- - -- Bump cryptography from 41.0.4 to 41.0.6 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/126 -- Drop curl check by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/120 -- Fix check mode for grafana role by @Boschung-Mecatronic-AG-Infrastructure in https://github.com/grafana/grafana-ansible-collection/pull/125 -- Fix check mode in Grafana Agent by @AmandaCameron in https://github.com/grafana/grafana-ansible-collection/pull/124 -- Update tags in README by @ishanjainn in https://github.com/grafana/grafana-ansible-collection/pull/121 - -v2.2.3 -====== - -Release Summary ---------------- - -Remove dependency on local-fs.target from Grafana Agent role - -Minor Changes -------------- - -- Remove dependency on local-fs.target from Grafana Agent role - -v2.2.2 -====== - -Release Summary ---------------- - -Grafana Role bug fixes and security updates - -Minor Changes -------------- - -- Bump cryptography from 41.0.3 to 41.0.4 -- Create missing notification directory in Grafana Role -- Remove check_mode from create local directory task in Grafana Role - -v2.2.1 -====== - -Release Summary ---------------- - -Allow alert resource provisioning in Grafana Role - -Minor Changes -------------- - -- Allow alert resource provisioning in Grafana Role - -v2.2.0 -====== - -Release Summary ---------------- - -Grafana Agent Role Updates - -Minor Changes -------------- - -- Use 'ansible_system' env variable to detect os typ in Grafana Agent Role -- hange grafana Agent Wal and Positions Directory in Grafana Agent Role - -v2.1.9 -====== - -Release Summary ---------------- - -Security Updates and Grafana Agent Version failure fixes - -Minor Changes -------------- - -- Add check for Curl and failure step if Agent Version is not retrieved -- Bump cryptography from 39.0.2 to 41.0.3 -- Bump semver from 5.7.1 to 5.7.2 -- Bump word-wrap from 1.2.3 to 1.2.5 -- Create local dashboard directory in check mode -- Update CI Testing -- Update Cloud Stack Module failures - -v2.1.8 -====== - -Release Summary ---------------- - -Fix grafana dashboard import in Grafana Role - -Minor Changes -------------- - -- Fix grafana dashboard import in Grafana Role - -v2.1.7 -====== - -Release Summary ---------------- - -YAML Fixes - -Minor Changes -------------- - -- YAML Fixes - -v2.1.6 -====== - -Release Summary ---------------- - -Grafana and Grafana Agent role updates - -Minor Changes -------------- - -- Add overrides.conf with CAP_NET_BIND_SERVICE for grafana-server unit -- Fix Grafana Dashboard Import for Grafana Role -- Make grafana_agent Idempotent -- Provisioning errors in YAML -- Use new standard to configure Grafana APT source for Grafana Role - -v2.1.5 -====== - -Release Summary ---------------- - -Update Grafana Agent Download varibale and ZIP file - -Minor Changes -------------- - -- Add Grafana Agent Version and CPU Arch to Downloaded ZIP in Grafana Agent Role -- Move _grafana_agent_base_download_url from /vars to /defaults in Grafana Agent Role - -v2.1.4 -====== - -Release Summary ---------------- - -Update Datasource Tests and minor fixes - -Minor Changes -------------- - -- Datasource test updates and minor fixes - -v2.1.3 -====== - -Release Summary ---------------- - -Update modules to fix failing Sanity Tests - -Minor Changes -------------- - -- indentation and Lint fixes to modules - -v2.1.2 -====== - -Release Summary ---------------- - -Idempotency Updates and minor api_url fixes - -Minor Changes -------------- - -- Fix Deleting datasources -- Fix alert_notification_policy failing on fresh instance -- Making Deleting folders idempotent -- Remove trailing slash automatically from grafana_url - -v2.1.1 -====== - -Release Summary ---------------- - -Update Download tasks in Grafana Agent Role - -Minor Changes -------------- - -- Update Download tasks in Grafana Agent Role - -v2.1.0 -====== - -Release Summary ---------------- - -Add Grafana Server role and plugins support on-prem Grafana - -Major Changes -------------- - -- Addition of Grafana Server role by @gardar -- Configurable agent user groups by @NormanJS -- Grafana Plugins support on-prem Grafana installation by @ishanjainn -- Updated Service for flow mode by @bentonam - -Minor Changes -------------- - -- Ability to configure date format in grafana server role by @RomainMou -- Avoid using shell for fetching latest version in Grafana Agent Role by @gardar -- Fix for invalid yaml with datasources list enclosed in quotes by @elkozmon -- Remove agent installation custom check by @VLZZZ -- Remove explicit user creation check by @v-zhuravlev - -v2.0.0 -====== - -Release Summary ---------------- - -Updated Grafana Agent Role - -Major Changes -------------- - -- Added Lint support -- Configs for server, metrics, logs, traces, and integrations -- Installation of the latest version -- Local installations when internet connection is not allowed -- Only download binary to controller once instead of hosts -- Skip install if the agent is already installed and the version is the same as the requested version -- Support for Grafana Agent Flow -- Validation of variables - -v1.1.1 -====== - -Release Summary ---------------- - -Updated return description and value for grafana.grafana.folder module - -Minor Changes -------------- - -- Updated the return message in grafana.grafana.folder module - -v1.1.0 -====== - -Release Summary ---------------- - -Added Role to deploy Grafana Agent on linux hosts - -Major Changes -------------- - -- Added Role for Grafana Agent - -v1.0.5 -====== - -Release Summary ---------------- - -Add Note to modules which don't support Idempotency - -Minor Changes -------------- - -- Added Note to datasource and dashboard module about not supporting Idempotency - -v1.0.4 -====== - -Release Summary ---------------- - -Bug fixes and idempotency fixes for modules - -Major Changes -------------- - -- All modules except dashboard and datasource modules now support idempotency - -Minor Changes -------------- - -- All modules use `missing_required_lib`` to compose the message for module.fail_json() when required library is missing from host - -Bugfixes --------- - -- Fixed cases where cloud_stack and alert_contact_point modules do not return a tuple when nothing in loop matches - -v1.0.3 -====== - -Minor Changes -------------- - -- Add a fail method to modules source code if `requests` library is not present -- Fixed markup for arg option in Documentation -- Updated Documentation with `notes` to specify if the check_mode feature is supported by modules -- removed `supports_check_mode=True` from source code of modules - -v1.0.2 -====== - -Release Summary ---------------- - -Documentation updates with updated description for modules - -v1.0.1 -====== - -Release Summary ---------------- - -Documentation updates with updated examples - -v1.0.0 -====== - -Release Summary ---------------- - -CI and testing improvements - -v0.0.7 -====== - -Release Summary ---------------- - -Documentation update for return values in `grafana.grafana.dashboard` - -v0.0.6 -====== - -Minor Changes -------------- - -- Idempotency updates to cloud_api_key and datasource modules - -v0.0.5 -====== - -Release Summary ---------------- - -Documentation update and code cleanup - -v0.0.4 -====== - -Bugfixes --------- - -- Fix an issue with `cloud_stack` idempotency - -v0.0.3 -====== - -Release Summary ---------------- - -Documentation update and code cleanup - -v0.0.2 -====== - -Release Summary ---------------- - -Updated input parameters description for all modules - -v0.0.1 -====== - -Release Summary ---------------- - -It's a release! First version to publish to Ansible Galaxy diff --git a/ansible_collections/grafana/grafana/CODEOWNERS b/ansible_collections/grafana/grafana/CODEOWNERS deleted file mode 100644 index 9074ce2..0000000 --- a/ansible_collections/grafana/grafana/CODEOWNERS +++ /dev/null @@ -1,8 +0,0 @@ -./ @ishanjainn -/roles/grafana @gardar @ishanjainn -/roles/grafana_agent @ishanjainn @v-zhuravlev @gardar -/roles/alloy @ishanjainn @v-zhuravlev @gardar @voidquark -/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 deleted file mode 100644 index 78da78b..0000000 --- a/ansible_collections/grafana/grafana/FILES.json +++ /dev/null @@ -1,2483 +0,0 @@ -{ - "files": [ - { - "name": ".", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": ".config", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": ".config/molecule", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": ".config/molecule/config.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "59790413f9b987046f0781a0fc8e3c9b145626024cd05a15424bd4bac19c3b29", - "format": 1 - }, - { - "name": "tools", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tools/setup.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "56b5525e62563c65e6b5b71f27c797d60c1561e3b66578f999c65642f4ec9049", - "format": 1 - }, - { - "name": "tools/lint-yaml.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "51c10eabc5c1360649fc5cab528151135f13d2bbc97cbe907d0e939d6e979e03", - "format": 1 - }, - { - "name": "tools/includes", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tools/includes/utils.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "16a2ebce5931f01510c8e0d7597b632d017a0f10154a83f42d538926913e6eb5", - "format": 1 - }, - { - "name": "tools/includes/logging.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "e90aa1f7b29d85263926e228f4321fa31304448f6ce2ff8d48a0e461d076474b", - "format": 1 - }, - { - "name": "tools/lint-shell.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "2d969bd175bfdf137539a5f4d97cfc2644dd5c81c677e2c40a40082af9333e36", - "format": 1 - }, - { - "name": "tools/lint-text.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "0c01a1e5d52ba8a65e4417d641d1958cfe129112562cb74e11131f8846e6db95", - "format": 1 - }, - { - "name": "tools/lint-ansible.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "87867490595fd8cb5fcd09337f90c8b9135dce7864c0af10c72960081ca0981d", - "format": 1 - }, - { - "name": "tools/lint-markdown.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "6f58c8dfd68ddf75eea250ea0f44ad9e9b567deeedacc70ea357f2cd4d92037c", - "format": 1 - }, - { - "name": "tools/lint-editorconfig.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "4c438197ed79286cc7ea91cebcbeaaa53ccd5a0b3f04dc66e38c998ebccad271", - "format": 1 - }, - { - "name": ".textlintrc", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "89110cd16e278a39577eae8098d6dd2f4d6ea094b164163e012e31d021ea301e", - "format": 1 - }, - { - "name": "LICENSE", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8b1ba204bb69a0ade2bfcf65ef294a920f6bb361b317dba43c7ef29d96332b9b", - "format": 1 - }, - { - "name": "requirements.txt", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "a135d423a3b683d3448f933e0ac4981cb9b53413fe13962dcef9d3cc15af5c4a", - "format": 1 - }, - { - "name": ".shellcheckrc", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "60a0a1e54cc805233096790628fd1ff4b629bf389eeef72d8194c331e7ae1912", - "format": 1 - }, - { - "name": "plugins", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "plugins/modules", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "plugins/modules/user.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "dbccfa5a0c89c3ea76b7e761a4f4ad05bcab76a4fa0884244659ee90bac14f03", - "format": 1 - }, - { - "name": "plugins/modules/cloud_api_key.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ebbfbeceb34bb531249efb27262ab75181a8900f5c36c6a87064af0ab50ceaa3", - "format": 1 - }, - { - "name": "plugins/modules/folder.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "1827a9e4437b4ee582854170071181a9f5a0c3d95638ea65e206377b4201e039", - "format": 1 - }, - { - "name": "plugins/modules/alert_contact_point.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "e2f809303c82d6cc8f7dbce84d89877af8adb7b4ce1e8ac6f8ef5937bcd966e8", - "format": 1 - }, - { - "name": "plugins/modules/cloud_stack.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "166f88bab2700a2583b1d81a5ca4013f59cdf46628225af9c7f2f8e8d0bd721c", - "format": 1 - }, - { - "name": "plugins/modules/datasource.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "0cd8f1463b943ba8c930ad5803a22a96a04bacc4f7cb30e452d6541b24e9e0a6", - "format": 1 - }, - { - "name": "plugins/modules/dashboard.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "85f1f71a5dadfbec6e8e76fe5e4ffc4fa160230ba2dd9e0531e1c3fac6a33ea0", - "format": 1 - }, - { - "name": "plugins/modules/cloud_plugin.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "0c43025843f1676aa318b51e7baeaf2287234a3d48ebd1390ea593f89a7eb49f", - "format": 1 - }, - { - "name": "plugins/modules/alert_notification_policy.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "08f8cb0771a570847101227438f631d71a84c8ac9622068ab3e4232fae1da381", - "format": 1 - }, - { - "name": "Makefile", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8be8db2081029f79bc49bca1f6d8f71a5be2ce62b8aa2e5d7c6782c60db284a4", - "format": 1 - }, - { - "name": "CODEOWNERS", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "1e09cf7162103a1689404cb3c5a9ca2b6a135168d6d563f5d08006075ec32c73", - "format": 1 - }, - { - "name": ".yamllint", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8a17bf0fc69dcfd57f1c2f0ab83dd0f276d7bb29edfbf6b7433f201f6abbeece", - "format": 1 - }, - { - "name": "tests", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/requirements.txt", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ec72420df5dfbdce4111f715c96338df3b7cb75f58e478d2449c9720e560de8c", - "format": 1 - }, - { - "name": "tests/integration/targets", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/create_cloud_stack", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/create_cloud_stack/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/create_cloud_stack/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "1f7c98fab7394b31039b9df11a55837b58730bf54d45f9d6e65998340189e64a", - "format": 1 - }, - { - "name": "tests/integration/targets/datasource", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/datasource/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/datasource/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "718567f42c8a703129aa43a1ff5e8e7753c1c10ada929dde5bde7a8597186bf5", - "format": 1 - }, - { - "name": "tests/integration/targets/delete_cloud_stack", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/delete_cloud_stack/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/delete_cloud_stack/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5d44026e2c68a4714eb678ae9a40478db8576cdf1969d689bf5b00d9dc7b147b", - "format": 1 - }, - { - "name": "tests/integration/targets/alert_contact_point", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/alert_contact_point/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/alert_contact_point/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "3321d37a53b34abef1f6f3993c10e4697fc04fd7c901e0876dce13daea0450cb", - "format": 1 - }, - { - "name": "tests/integration/targets/folder", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/folder/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/folder/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "eeada75fe04b1a9a7d5354aa0508fcbda37e82ea50a9a6cbf2645e65de25abfb", - "format": 1 - }, - { - "name": "tests/integration/targets/user", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/user/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/user/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "2a6e22b96daec82286b98fef5cdda70faff61e3c2037e2a7220bcd2e9cc59307", - "format": 1 - }, - { - "name": "tests/integration/targets/dashboard", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/dashboard/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/dashboard/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "606bda87aa90a67bdaf0cb03fb29fc02033c2b245b7f2f0fc993305c90397e78", - "format": 1 - }, - { - "name": "tests/integration/targets/molecule-grafana-alternative", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/molecule-grafana-alternative/runme.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "2879c89b4f2adf554de77e72bb21681933f1c3ffad0ff6097a11e40c97bd78c1", - "format": 1 - }, - { - "name": "tests/integration/targets/cloud_api_key", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/cloud_api_key/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/cloud_api_key/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "6ab83417398137412541c07bc2e4461435d1b2393b3a8108f6c7380dbee71944", - "format": 1 - }, - { - "name": "tests/integration/targets/alert_notification_policy", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/alert_notification_policy/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/alert_notification_policy/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "be57120a8025ae23e8715ba7063460f8556de076c97d65a7f3d6cd2d6c1d33bf", - "format": 1 - }, - { - "name": "tests/integration/targets/molecule-grafana-default", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/molecule-grafana-default/runme.sh", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "2879c89b4f2adf554de77e72bb21681933f1c3ffad0ff6097a11e40c97bd78c1", - "format": 1 - }, - { - "name": "tests/integration/targets/cloud_plugin", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/cloud_plugin/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/cloud_plugin/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "7eb8a48e85835bc5154d9e6cc867e22e8ec0aca3dbc6b43f385bb6f2370a4486", - "format": 1 - }, - { - "name": "meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "meta/runtime.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "47e045205cccf3dab2959ce5a559aaea3e4283d3ed07fb1fb0392d8fb70f4be5", - "format": 1 - }, - { - "name": "roles", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "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": "f394612587593187d93e3922eec14f3b5de21318a387731623fb3c014fccb9bd", - "format": 1 - }, - { - "name": "roles/loki/vars/Debian.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ac758b3fba0197537c49b009a6d26c289499e064740f6436f3d0033c5146c161", - "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": "d85303e200fcf7376c2370a091624ca5d7a44c37c1ec67316663ce9cbe49e071", - "format": 1 - }, - { - "name": "roles/loki/tasks/deploy.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "26c1495550cf3e9731bd04cb61cbb6dcd210283457037a78e2a528e0323777a4", - "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": "c4270cb7f8a7ec74555aea31bbd0c0f39967fd2be2b84ad995d59279b5231ac7", - "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": "facc42a3dbe7e34f8962f9b46284ecc093f592720eeca7d063cb3a21a7d45549", - "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": "0e9aabb9d0e1acc2c935d23f5bf527ab5ea1cd0570d7a29f24795387c0ba0f56", - "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": "fab3d42e3625c1bfcee019e62bcaf790ae1a05af8bf211456e99858faac9328b", - "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": "079093b3b6b2863893eaab7343eaa99ebf01a094961b18c15ed00ce462068d3e", - "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": "84b2c8f184b5c728e9034711c0847bd3360f8cbcecf8e4ff7eb9fdcfb56967d4", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/tasks/service.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b0854c515fcf0c91a3a91066163a4b6acf1f66daa226406926c17679b5367f81", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/tasks/install.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "669aeda05c6aeb21ece810252da30835521165de1b8751f73ffea34784693795", - "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": "bf47367cf80d78b306e11e15a767c44b2e2ac0f1062734c416a8c1ebf731b11e", - "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": "fee604a3e44317a009938d708f256cde9f2cba860674e6abf9cf03f3180a07d9", - "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": "4151782c8b320ddc7410d5ce653afcd874af2a2813f25a52c658e609232e7286", - "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/molecule", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/default-check-first", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/default-check-first/molecule.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "2e8726eb2a9a3387d1345bb52544cc84272e8fb05267f5b256943f38568d1fdc", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/default-check-first/tests", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/default-check-first/tests/test_default.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "0073627f68771e285d6d51cb85479c86096fe22605291fd234fb60750ec13156", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/default-check-first/converge.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "4fdc9f830f35247eba6a6e8483f9bcd4493309ad6392e12e50bc8ac146287152", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/default", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/default/molecule.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b2141fd5357e9fabdf337a73e6677bb2f9e5d738baedb728230b78c03c99fe0c", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/default/tests", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/default/tests/test_default.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b23d9f0cadf56c5409fb02ce9430078086e3d36b5ddb8c389537eab5833fc3fd", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/default/converge.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "4fdc9f830f35247eba6a6e8483f9bcd4493309ad6392e12e50bc8ac146287152", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/latest", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/latest/molecule.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b2141fd5357e9fabdf337a73e6677bb2f9e5d738baedb728230b78c03c99fe0c", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/latest/tests", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/latest/tests/test_default.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "0073627f68771e285d6d51cb85479c86096fe22605291fd234fb60750ec13156", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/latest/converge.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "0ea58dd65767b4070ec15d9a77d8a5e5479f57d47223861dff39c8f7348a9170", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/non-contrib", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/non-contrib/molecule.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b2141fd5357e9fabdf337a73e6677bb2f9e5d738baedb728230b78c03c99fe0c", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/non-contrib/tests", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/non-contrib/tests/test_default.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "05ae78fed5975b9aab9f5844e194d4bb2444543fa605359cb90a0d288eb1c86a", - "format": 1 - }, - { - "name": "roles/opentelemetry_collector/molecule/non-contrib/converge.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ad998bb682100df580346e77408f525f59ce8ec3a528b487b85a25835072c644", - "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": "a5e2367beaf276f16440801197e4de1df40edc2b88a8a8cb5c6327c74464dc84", - "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": "ffd027c9ae756e0728246dcfb93527af68d320c3095f53e4f90a8a0402b60818", - "format": 1 - }, - { - "name": "roles/mimir/tasks/deploy.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "410cb2562d865c98ba13304788d77ba7468330b4a932c63b7916a52ea7040dc7", - "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": "607c36ec13511951520a162f5d82f2005d9585ae38953a5c70fc289e4a9f0577", - "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": "212258f9434167e2133d610568ef7366dfce6de12513b756471d88e9c8dc9ca3", - "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": "99be8e0541edd984f68d746091912807256a1c7a0041652a3e30c3527d8809c1", - "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": "33a402aeb143628d337909481994f86e1f5a34f69f2a7c450e54a2183f685411", - "format": 1 - }, - { - "name": "roles/mimir/molecule", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "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/vars", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/alloy/vars/RedHat.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5eb6f619c3275fa5aa96867f74ff73e3a85aae9d9f6dee637e10edc08d4a29a2", - "format": 1 - }, - { - "name": "roles/alloy/vars/Suse.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5eb6f619c3275fa5aa96867f74ff73e3a85aae9d9f6dee637e10edc08d4a29a2", - "format": 1 - }, - { - "name": "roles/alloy/vars/Darwin.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "a1643c85df7377a8c97342c1646580694442b29ef23167504622b452d57b0b8f", - "format": 1 - }, - { - "name": "roles/alloy/vars/Debian.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "21aa98b24b68ca478a66eb83c577fa8c5efbf7176a20c27ad2a0795f271bf565", - "format": 1 - }, - { - "name": "roles/alloy/vars/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "863ec787d94796fc2ea7b1fa1f16d33a08e29f2448a3588e7c0a9480e8165d85", - "format": 1 - }, - { - "name": "roles/alloy/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/alloy/tasks/preflight.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "a6fe1a9ce9635cee542b477d6cdb0deb3615aa64036fba14bc0ec7742aa77146", - "format": 1 - }, - { - "name": "roles/alloy/tasks/uninstall.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "6d8347407212848dbfc83c4f0429eba633b4f3d7d614281ba4352002105461da", - "format": 1 - }, - { - "name": "roles/alloy/tasks/deploy.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8c5a1050e69b473c1ba5ce774cae689d1b15f3c70aad357889feb35a503093e9", - "format": 1 - }, - { - "name": "roles/alloy/tasks/setup-Debian.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "39c25d3aca1e019411d978d6cd24a47938ac733255d39871f81c54cf3a5189b6", - "format": 1 - }, - { - "name": "roles/alloy/tasks/setup-Darwin.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ac418849af311d6351d0ca3e5a632e0f6dac93980f058ccf65d2ae0062559666", - "format": 1 - }, - { - "name": "roles/alloy/tasks/setup-Suse.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8c1e50ac43b7873c04414b1e58807eae3ef06fdd13e7fdc895296033d40f9f6d", - "format": 1 - }, - { - "name": "roles/alloy/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b889117721a268ce6f7ff6fdfb9241be234495dfa11a1f70f0c4ebc00a885e26", - "format": 1 - }, - { - "name": "roles/alloy/tasks/setup-RedHat.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "c21142d2d8498ec1d8e459840538627486cc77aaedefed665b1d22bcc80aaf64", - "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": "1850078f19e0eb71a3685da37b19af7cdec2871b48f007fc68e18519f87d1e89", - "format": 1 - }, - { - "name": "roles/alloy/README.md", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "3ee3b0e5af6601f49cee6ec0904a71824a61c508b2a1f1538d380190b5809b01", - "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": "4c73e65c66e95bff83cfc0206d95edb787fcdf9369319e199b0f786ef2297776", - "format": 1 - }, - { - "name": "roles/alloy/templates", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/alloy/templates/override.conf.j2", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "c38b148ef1d5fece4b3a3a5875ce0a1b0b17da3231f668b5051b05a52cb46cf0", - "format": 1 - }, - { - "name": "roles/alloy/templates/config.alloy.j2", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "4cd49253f97d5dd4796a6f03c70a33608b5db9e48fa1ff1567a9af06789c62cd", - "format": 1 - }, - { - "name": "roles/alloy/templates/alloy.j2", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "68f77ac2f0c2d05d29a1466f233289238923d18e9eb0eb193b765b8d5c9664cb", - "format": 1 - }, - { - "name": "roles/alloy/molecule", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/alloy/molecule/default", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/alloy/molecule/default/molecule.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f2fb19d8e5973db9cd226780c4ecf9ae5947286626de40224c1228a6463b1114", - "format": 1 - }, - { - "name": "roles/alloy/molecule/default/converge.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f777298cd5e54cbbfed852027c8350e7a9c4d5462dc9b8dd51a7660ff6e9e339", - "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": "321bc645401b1d43881d14054ff6fdcb78b085af00ad6125f504bd0e696328b5", - "format": 1 - }, - { - "name": "roles/grafana_agent", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana_agent/vars", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana_agent/vars/main.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b79d04ea2a1b584531ec6a89bbeebd4490c8c52d50db2c1c58053218bf1a40a1", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/install", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/install/directories.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "58cac80f91405cd323266b7435e58e656a16740ad9ac27f31b7167a1e6de84dd", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/install/user-group.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "6c36f9389415ee98e51bb7727045d5f6fae4e24a31ea62a74d48922af84abfd1", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/install/download-install.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8771b974c8e7592292ee66941c5c68e49b196408ea4b5655b80b849802255770", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/install/local-install.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "73d7d9cb92f3f837ac941d160296ee510fe4598685c1c67303c9246f459268aa", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/ga-started.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "03c283e74fef8eac9f628c37cb795d87bdbdb4c804acb2f2924813fb31ce6b82", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/configure.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8f34f15d924d4d56f1f5a427e92b208da92a6e82cd8bfce162a1ad3491d4622f", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/main.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "bb0018dd15d6c1deb675428d0088213b3a6bbd3bbbc795e7c847a2346b05ab9d", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/install.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "aea56415837b4074ea9ec2e442bdc3eb509caf3b0574b54897c03b76b7eb190d", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/preflight.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "6518c23dabc92eb772132cd2dbb764ef381b93df8535ee59d7d5a4f0a39a24d4", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/preflight", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/preflight/download.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5e90c5e06f97a8d2fa8398c6ab4f18857ad73553249558dfacc28f382a53502e", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/preflight/vars.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "87d1a4c7f9a02423c6cecd4927e79c89e126287d5671d26ae391a70de9a34a1a", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/preflight/systemd.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "bb3204fcfd6122d33b27d0986fa80aca2536b1b4c6b237b0ca36c94a3bae95d5", - "format": 1 - }, - { - "name": "roles/grafana_agent/tasks/preflight/install.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "53c0a1d31af571b48eea830d1d53ca6f91d2e0149b98882af4240ba6a9e1e5bf", - "format": 1 - }, - { - "name": "roles/grafana_agent/meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana_agent/meta/main.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "00ec33a60eed132359ae684f2602eaafd80c67bc8dc8103d4558857b37a89df5", - "format": 1 - }, - { - "name": "roles/grafana_agent/README.md", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "db482b9928a877cd5622797a030a67f964f1dc3bc9a6d56291e16523c0260f90", - "format": 1 - }, - { - "name": "roles/grafana_agent/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana_agent/defaults/main.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8ae44ab181bd1825f041ec8d4048e21708d142965068ecb883793b5b696549ff", - "format": 1 - }, - { - "name": "roles/grafana_agent/templates", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana_agent/templates/EnvironmentFile.j2", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "84e17b3fe98509c19641c7ccc56b3fbd42d32892870350ca561b80b41734a063", - "format": 1 - }, - { - "name": "roles/grafana_agent/templates/config.yaml.j2", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "cfa09ee60dc6869ea28d6f4b81a10b8499ddc91b0c2715e863dd967927b18459", - "format": 1 - }, - { - "name": "roles/grafana_agent/templates/grafana-agent.service.j2", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "13e5dc455a1311ef9f11fb8aeeb2c2c7d990935a51cd267c7d532ddaa6a7c10a", - "format": 1 - }, - { - "name": "roles/grafana_agent/handlers", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana_agent/handlers/main.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f04d1539911e34d8d0b41ecb1148195bb6e05f7d8a01bd7d1737b15a201a8d25", - "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": "cc2aacac69f22ee310848d401b7233841de4fadac08429f4a2b27c801c242007", - "format": 1 - }, - { - "name": "roles/promtail/vars/Debian.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "cea2932d24a235426e1b46128d8f0ce172511cf5f37eb3f392a60d9b922da34e", - "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": "0d9ef472ec04e41aac9dccbfa984f3aa7fc0c602dc3d24648b2394ac6134128a", - "format": 1 - }, - { - "name": "roles/promtail/tasks/deploy.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "7e095b42e83e2ea4ef39b55241e2f4922780ca607b330b3721bdf10035a93b1a", - "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": "c8fed29064f297cc0a63ea4edf9dbb20124a3cb0b785f45f436495e806e7f94a", - "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": "d4ec50a7329970762cfdc2010a2310b23fc5b15e49e681bf1e4c9823227a6f41", - "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": "8301a0470be4434e88638c5840172a3b7bc76ba9144efc7c7a37d6a1357bbf82", - "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": "8417ab8f8c0400a8255599d7299f4ac9b2a93afcfd9012d300831a4bb9acdfe1", - "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": "755256d62289b14c360d0825818fb6430ac08862b0e58812bf17faafd5587141", - "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": "90dcad6dfb252014c1e5550c359a721d897aad56a4677b5d62329255c60a002e", - "format": 1 - }, - { - "name": "roles/grafana", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/vars", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/vars/distro", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/vars/distro/redhat.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "54082a7385b630fb01d158412031ccdb3ab724ec0920d2b938fc2abfe5f231b1", - "format": 1 - }, - { - "name": "roles/grafana/vars/distro/suse.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "9880f2ab2126a4409db3b69f70c44eb0bf0e2b8eb607ffbeff161fd04bed8f81", - "format": 1 - }, - { - "name": "roles/grafana/vars/distro/debian.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "14f9b18cb343938cd8e414361748140261c4a36ef6affa86d233912d99cd93d9", - "format": 1 - }, - { - "name": "roles/grafana/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/tasks/preflight.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "fa41682d8c796efc486c9560707616a4b2f06fb3c2c51ab211b3855365325fa8", - "format": 1 - }, - { - "name": "roles/grafana/tasks/configure.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "9f84da00a93af7fac6f7d88c42855c825fb6406f9e18db8f2d6fef0087eeccc0", - "format": 1 - }, - { - "name": "roles/grafana/tasks/dashboards.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f0bec3097daf078bc96aeefe6b415411a50c1b0859aedbaa371c90d6e10fe345", - "format": 1 - }, - { - "name": "roles/grafana/tasks/notifications.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "123f29864faaa40d8ea0f5ff4d4df7293b396910a800acc35d48760554d4b3ba", - "format": 1 - }, - { - "name": "roles/grafana/tasks/api_keys.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f061076854651264033730689cbd794dc41140d03c7967c5738d87e03eaddae1", - "format": 1 - }, - { - "name": "roles/grafana/tasks/plugins.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "3e4d9290510a14220bf2e258ab5d6c3c687949a28ac6f6b41547fa345713287c", - "format": 1 - }, - { - "name": "roles/grafana/tasks/datasources.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "41d770c41e6fe38119abbc30eb7023fcf7c88a0effffa692264b4d001d548b7f", - "format": 1 - }, - { - "name": "roles/grafana/tasks/install.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "3218ab4f0ed5def0759e8c8d63aafda028320e4c45ffc357daa2d00d94c85255", - "format": 1 - }, - { - "name": "roles/grafana/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "cd12254c292e9e58eb02f9b55e98d35ac0fccea11a6fd6eb04ffeb460401eda2", - "format": 1 - }, - { - "name": "roles/grafana/test-requirements.txt", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "bd70637dd6307a21c6084e83828c1ae13ac7818001bb9cffef2f8c0ea4e18b7b", - "format": 1 - }, - { - "name": "roles/grafana/meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/meta/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5d423f87d9e19d5e6891f793447b323055110a24390a884e98b8b2175515b08f", - "format": 1 - }, - { - "name": "roles/grafana/README.md", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "0faff6169a1080bfc70f33763aa1edb1c1a1f76e70bf845eb1c4a95475e4e15e", - "format": 1 - }, - { - "name": "roles/grafana/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/defaults/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "4dc47b40ef7cd700e1fbbc790b2461b8a84c3b10432f862bbbc0130da90fd399", - "format": 1 - }, - { - "name": "roles/grafana/templates", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/templates/grafana.ini.j2", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "0aaf3b482f772d23fa7c0f9273c4ebb73036dbc7cad402bcf998cb5dd3b90fa4", - "format": 1 - }, - { - "name": "roles/grafana/templates/ldap.toml.j2", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8eaf66b16c9bbb51b8365b86e17a6bfc4776f58a4a0cb3804702707281c99abd", - "format": 1 - }, - { - "name": "roles/grafana/templates/tmpfiles.j2", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "270716b0fbf8ed71d894661a5df761275f4081f2bee258093409b92276c60c9e", - "format": 1 - }, - { - "name": "roles/grafana/molecule", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/molecule/alternative", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/molecule/alternative/molecule.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f52d711103d50a437830c6fbcd04fb4bab49a0f82f6d26d1c791c6e8488dd090", - "format": 1 - }, - { - "name": "roles/grafana/molecule/alternative/tests", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/molecule/alternative/tests/test_alternative.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "38cb4a0397ae36a77d8db4471e725be59d74a15350ccf42cffac3b5e7c399898", - "format": 1 - }, - { - "name": "roles/grafana/molecule/alternative/converge.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "88a6d1ca5d3a4c7c09629e700dfcbbb1dc302ca321e71747dca8a3b6759674aa", - "format": 1 - }, - { - "name": "roles/grafana/molecule/default", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/molecule/default/molecule.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f52d711103d50a437830c6fbcd04fb4bab49a0f82f6d26d1c791c6e8488dd090", - "format": 1 - }, - { - "name": "roles/grafana/molecule/default/tests", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/molecule/default/tests/test_default.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "1f2d9786e6b222db39baa9259d1b420b46489595c74dec50804462ef3b1976a0", - "format": 1 - }, - { - "name": "roles/grafana/molecule/default/converge.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "7af480efbf26c3d329908d5afb54e56107255653aedede8f610cd5775efb5dff", - "format": 1 - }, - { - "name": "roles/grafana/handlers", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/grafana/handlers/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "58d24ea2c67751f3e7d2aa356bc26fc41327490a32c23c6ca0c1fa2f2975281f", - "format": 1 - }, - { - "name": "roles/tempo", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/tempo/vars", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/tempo/vars/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "448130606b153682770de55f8e460d25028c2d55875ec56f3eb44183a6c4f528", - "format": 1 - }, - { - "name": "roles/tempo/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/tempo/tasks/uninstall.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "e20324369f7695a846f9b14e12e76a7b146415018cc78b17007171552c45e072", - "format": 1 - }, - { - "name": "roles/tempo/tasks/deploy.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8dbb0c049770d470a6d24772bd9afd54c31629af66635b8c4aa9cf3859f665c2", - "format": 1 - }, - { - "name": "roles/tempo/tasks/setup-Debian.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "98c77bb45453df2997dcfe4f5cf5f82c98d860f34c04ccbdc4e4b83d822f7132", - "format": 1 - }, - { - "name": "roles/tempo/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "c07b5e0f7ada044d54ad87f73d32097f5da36c37eb1bbd676a3ad0f974fe0f20", - "format": 1 - }, - { - "name": "roles/tempo/tasks/setup-Redhat.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "2b1494a1333bd6bc277b8a78cd6b26f42d3535ba787760d5d728d4dc75d8c844", - "format": 1 - }, - { - "name": "roles/tempo/meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/tempo/meta/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "9b1df86ecf7a8f7ebaef2f018f1e859f37aa6a4539ff0214b1eabb76e1fa9f1d", - "format": 1 - }, - { - "name": "roles/tempo/README.md", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "4ccd3163b1ef40eeb3641a1a94988a6e4ea3c7a932d6d5f20e79d8445fdb62f7", - "format": 1 - }, - { - "name": "roles/tempo/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/tempo/defaults/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f56fec1b71b6401055ff5e9de70dd3ce253af52a7637341a2ae329897ba8127d", - "format": 1 - }, - { - "name": "roles/tempo/templates", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/tempo/templates/config.yml.j2", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "fea0382c2123f076798e765fd6eb0da681a9714dc311ad5729c16ed01dccc29f", - "format": 1 - }, - { - "name": "roles/tempo/molecule", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/tempo/molecule/default", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/tempo/molecule/default/molecule.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f2fb19d8e5973db9cd226780c4ecf9ae5947286626de40224c1228a6463b1114", - "format": 1 - }, - { - "name": "roles/tempo/molecule/default/converge.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5298aa93547d6e0fe0edbd44a22de537440814c179a84b1124d97b71eaf0e8ca", - "format": 1 - }, - { - "name": "roles/tempo/handlers", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "roles/tempo/handlers/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "53479f9f10a66ee23305713e79d17a5730ab98dffe28fbf8947208cf04f170c4", - "format": 1 - }, - { - "name": ".editorconfig", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f1c0a5b9b3d1b8330cb6b4f2efc2df0be1bfb76faf1f4d67c9f1b65decc97c22", - "format": 1 - }, - { - "name": "changelogs", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "changelogs/config.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "c3589ee373e4787fad20ff37228dfb90696a54ee0023c5f61ff5bf3abcf4b720", - "format": 1 - }, - { - "name": "changelogs/.plugin-cache.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ecb225f206a6cf765d85bdb0b86d03df8437b0e2549161721d2f3abb70d66e77", - "format": 1 - }, - { - "name": "changelogs/changelog.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "3eda7df24b1881c6afdddf50ecee1c50028d4605138dcd6f7f5df270c51bd4a6", - "format": 1 - }, - { - "name": "README.md", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5d1813750439efd015ce2216ab667916bc14b3334d7808a5429409426bc9209a", - "format": 1 - }, - { - "name": "Pipfile", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "bff84596ba119820dc1922243474b4af58efdf46dfd690389e922611078d46fe", - "format": 1 - }, - { - "name": "yarn.lock", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "1f1c2098461842c10bde3df88354ee158d308929af03ddaa1aa4c0f0865b943f", - "format": 1 - }, - { - "name": ".ansible-lint", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "04baf7f010586545cab0fe765309cc43f22c2a2cb63361480c74e37b878d8684", - "format": 1 - }, - { - "name": ".gitignore", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "a09430ce7bbf9c75791cc3bee42e6f47187a40b99461beaec5c1185fbd1a16b0", - "format": 1 - }, - { - "name": "package.json", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b2bb1491300328b7736ace99ef86cd6e7c97ffd9a36dd8303c0b76ef28cc4787", - "format": 1 - }, - { - "name": "examples", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "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-mode-flow-with-dynamic-conf.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8c6a11dd9a481dfcfb5d5ceb313b849e1541732899932419ee8c340b4d40b2ce", - "format": 1 - }, - { - "name": "examples/agent-basic-no-options.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "cda05d1f95640fbfc976b77d7fcf3a319e8fb0bf9ba5e514b49bc99e04ac1c11", - "format": 1 - }, - { - "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": "5a382e93b3a307cdf21a81d645677a4077e7c6d3b7cf538199cd2ef2a40164d3", - "format": 1 - }, - { - "name": "examples/agent-send-to-grafana-cloud.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "50b70488a9b4089b5add092fe3aeb7560ac172ce0fd1a08350564c05ec77bf6a", - "format": 1 - }, - { - "name": "examples/ansible.cfg", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b78e2db98e14c343e41120940b0e1c5e553a30f4b61b1978515b1bd8e74aadd0", - "format": 1 - }, - { - "name": "examples/alloy.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "62dd8f404e08d82596c4e67ecbcb3a8b83c181280fce6b42b321b0897545018f", - "format": 1 - }, - { - "name": "examples/promtail-multiple-logs.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "3b2be171ed1effad6eca589bdf37892d7e94f98be2a96d469f742caffcebb105", - "format": 1 - }, - { - "name": "examples/mimir-single-host.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f21cf1f3c4424b736f8534e1fc758ebd576dfefdc44234ce5423eef9046a3d2f", - "format": 1 - }, - { - "name": "ansible.cfg", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "2caa654e85c7e66be39d494d173f69f7565059c504b7201f2ee033173ab80df0", - "format": 1 - }, - { - "name": ".github", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": ".github/workflows", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": ".github/workflows/release.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "cd8f9a378120b2b02d023c621cecfc8f3d87df6d686fa82cb0f348fdb21de4a4", - "format": 1 - }, - { - "name": ".github/workflows/full-integration-test.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "22d2553954fd81ff4e395d58122959f39d93fa9a0654c6aea6c421f49d348df3", - "format": 1 - }, - { - "name": ".github/workflows/alloy-molecule.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "1a4b502ea8fdd28d289b477bb78edaf46b007a36c818c806f88631c1b4e92781", - "format": 1 - }, - { - "name": ".github/workflows/roles-test.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "6da36e4715b551f98fdbdcb578cc27b06b29f58b47f1e5cd8ac979e5c682089b", - "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": "7e3b0689bfb32e5eed91629fc5821e39481cc77e283f0f759bad69944c55bdd5", - "format": 1 - }, - { - "name": ".github/workflows/opentelemetry-collector-molecule.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "a9d0a4be85a774bf6d4df1ba327b2b6296661957cbcacc53696162e09a1c6379", - "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", - "chksum_sha256": "3355027fd55404c8c9b90118f8d3c8818c5f8eff4a2121bf7a8e5b03b7883193", - "format": 1 - }, - { - "name": ".github/workflows/modules-test.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "4077b0be0f8279e1cf8a34d1c0a7fae86ed91c5019a99023a36e0164ba867272", - "format": 1 - }, - { - "name": ".github/dependabot.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "04b7f69732d281e9a97d10e72202312b72cb45358cbd1f1514983b6e6923f5bf", - "format": 1 - }, - { - "name": "requirements.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "85c5d41624847de7aa4a49e6d8060fc60e71af5a610b21e75cff8391494ce65c", - "format": 1 - }, - { - "name": ".markdownlint.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "2d0b5ccb1e0c0105040a8c8fbe80b52f812951ff844f6b44ce8a8f8019debf5f", - "format": 1 - }, - { - "name": "CHANGELOG.rst", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "bd6fb2ccd317ab278bf45a26c2b736855f0cdcb9567e3c60c27ab8dcf36ce0ca", - "format": 1 - }, - { - "name": "Pipfile.lock", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "bad9f5d3e4a5d97c3a7c1a0a0e2454e88ba51e2137e822dd608b45dbf5057d54", - "format": 1 - }, - { - "name": "catalog-info.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "3ca812bb5e73e809034b62f5261529b2d2f9d420afe12248c802fdf6a5c909b7", - "format": 1 - } - ], - "format": 1 -} \ No newline at end of file diff --git a/ansible_collections/grafana/grafana/LICENSE b/ansible_collections/grafana/grafana/LICENSE deleted file mode 100644 index e72bfdd..0000000 --- a/ansible_collections/grafana/grafana/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/ansible_collections/grafana/grafana/MANIFEST.json b/ansible_collections/grafana/grafana/MANIFEST.json deleted file mode 100644 index 78027d2..0000000 --- a/ansible_collections/grafana/grafana/MANIFEST.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "collection_info": { - "namespace": "grafana", - "name": "grafana", - "version": "6.0.6", - "authors": [ - "Grafana Labs ", - "Ishan Jain ", - "Gerard van Engelen " - ], - "readme": "README.md", - "tags": [ - "grafana", - "observability", - "monitoring" - ], - "description": "Ansible collection to manage Grafana resources", - "license": [ - "GPL-3.0-or-later" - ], - "license_file": null, - "dependencies": { - "community.general": ">=8.2.0", - "community.grafana": ">=1.5.4", - "ansible.posix": ">=1.5.4" - }, - "repository": "https://github.com/grafana/grafana-ansible-collection", - "documentation": "https://docs.ansible.com/ansible/latest/collections/grafana/grafana/index.html", - "homepage": null, - "issues": "https://github.com/grafana/grafana-ansible-collection/issues" - }, - "file_manifest_file": { - "name": "FILES.json", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "80df907b5a9fb9307fe01b40e266d87f9c9f55c389a6692ef6677f5e08a5b5f4", - "format": 1 - }, - "format": 1 -} \ No newline at end of file diff --git a/ansible_collections/grafana/grafana/Makefile b/ansible_collections/grafana/grafana/Makefile deleted file mode 100644 index b999dbd..0000000 --- a/ansible_collections/grafana/grafana/Makefile +++ /dev/null @@ -1,86 +0,0 @@ -.DEFAULT_GOAL:= lint -PATH := ./node_modules/.bin:$(PATH) -SHELL := /bin/bash -args = $(filter-out $@, $(MAKECMDGOALS)) -.PHONY: all setup install clean reinstall build compile pdfs lint lint-sh lint-shell lint-md lint-markdown lint-txt lint-text pdf lint-yaml lint-yml lint-editorconfig lint-ec ci-lint ci-lint-shell ci-lint-markdown ci-lint-text ci-lint-yaml ci-lint-editorconfig lint-ansible ci-lint-ansible - -default: all - -all: install - -#################################################################### -# Installation / Setup # -#################################################################### -setup: - @./tools/setup.sh - -install: - yarn install - pipenv install - -# remove the build and log folders -clean: - rm -rf build node_modules - -# reinstall the node_modules and start with a fresh node build -reinstall: clean install - -#################################################################### -# Linting # -#################################################################### -lint: lint-shell lint-markdown lint-text lint-yaml lint-editorconfig lint-ansible - -# Note "|| true" is added to locally make lint can be ran and all linting is preformed, regardless of exit code - -# Shell Linting -lint-sh lint-shell: - @./tools/lint-shell.sh || true - -# Markdown Linting -lint-md lint-markdown: - @./tools/lint-markdown.sh || true - -# Text Linting -lint-txt lint-text: - @./tools/lint-text.sh || true - -# Yaml Linting -lint-yml lint-yaml: - @./tools/lint-yaml.sh || true - -# Editorconfig Linting -lint-ec lint-editorconfig: - @./tools/lint-editorconfig.sh || true - -# Ansible Linting -lint-ansible: - @./tools/lint-ansible.sh || true - -#################################################################### -# CI # -#################################################################### -ci-lint: ci-lint-shell ci-lint-markdown ci-lint-text ci-lint-yaml ci-lint-editorconfig ci-lint-ansible - -# Shell Linting -ci-lint-shell: - @./tools/lint-shell.sh - -# Markdown Linting -ci-lint-markdown: - @./tools/lint-markdown.sh - -# Text Linting -ci-lint-text: - @./tools/lint-text.sh - -# Yaml Linting -ci-lint-yaml: - @./tools/lint-yaml.sh - -# Editorconfig Linting -ci-lint-editorconfig: - @./tools/lint-editorconfig.sh - -# Ansible Linting -ci-lint-ansible: - @./tools/lint-ansible.sh diff --git a/ansible_collections/grafana/grafana/Pipfile b/ansible_collections/grafana/grafana/Pipfile deleted file mode 100644 index 8e4fcb2..0000000 --- a/ansible_collections/grafana/grafana/Pipfile +++ /dev/null @@ -1,14 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -yamllint = "==1.35.1" -ansible-lint = ">=6.13.1,<26.0.0" -pylint = ">=2.16.2,<4.0.0" - -[dev-packages] - -[requires] -python_version = "3.10" diff --git a/ansible_collections/grafana/grafana/Pipfile.lock b/ansible_collections/grafana/grafana/Pipfile.lock deleted file mode 100644 index 89f9bc1..0000000 --- a/ansible_collections/grafana/grafana/Pipfile.lock +++ /dev/null @@ -1,909 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "d803b04fc4ca6ceec39a226c518fc618049f8996dc9d14d09f42ab1b3471e085" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.10" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "ansible-compat": { - "hashes": [ - "sha256:c2b4bfeca6383b2047b2e1dea473cec4f1f9f2dd59beef71d6c47f632eaf97c9", - "sha256:cced722001bd7b617d418e54017e308c8b27ef3815f377843c00e020fa07165e" - ], - "markers": "python_version >= '3.10'", - "version": "==25.6.0" - }, - "ansible-core": { - "hashes": [ - "sha256:24fb30783fcd3e800b839b15a396a1f9d622c007bc358e98f2992156ace52671", - "sha256:cb74f3a148b77fa0c89a284e48e7515d13fda10ad8c789eb92274c72f017a9a0" - ], - "markers": "python_version >= '3.10'", - "version": "==2.17.12" - }, - "ansible-lint": { - "hashes": [ - "sha256:69fe294a3cc30d8819b5a30625a7e25225f48558cadb83ad3d4dec597c1b8c2c", - "sha256:6a1dd2b7a9f3f202c9e92a6c80296ff33ca863348c3acf978f80fb0d4536dce4" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==25.6.1" - }, - "astroid": { - "hashes": [ - "sha256:5eba185467253501b62a9f113c263524b4f5d55e1b30456370eed4cdbd6438fd", - "sha256:e73d0b62dd680a7c07cb2cd0ce3c22570b044dd01bd994bc3a2dd16c6cbba162" - ], - "markers": "python_full_version >= '3.9.0'", - "version": "==3.3.4" - }, - "attrs": { - "hashes": [ - "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", - "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b" - ], - "markers": "python_version >= '3.8'", - "version": "==25.3.0" - }, - "black": { - "hashes": [ - "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", - "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", - "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", - "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", - "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", - "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", - "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", - "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", - "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", - "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", - "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", - "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", - "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0", - "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", - "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", - "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", - "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355", - "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", - "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e", - "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", - "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", - "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f" - ], - "markers": "python_version >= '3.9'", - "version": "==25.1.0" - }, - "bracex": { - "hashes": [ - "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952", - "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6" - }, - "cffi": { - "hashes": [ - "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", - "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", - "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", - "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", - "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", - "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", - "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", - "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", - "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", - "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", - "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", - "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", - "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", - "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", - "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", - "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", - "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", - "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", - "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", - "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", - "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", - "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", - "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", - "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", - "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", - "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", - "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", - "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", - "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", - "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", - "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", - "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", - "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", - "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", - "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", - "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", - "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", - "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", - "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", - "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", - "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", - "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", - "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", - "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", - "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", - "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", - "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", - "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", - "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", - "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", - "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", - "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", - "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", - "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", - "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", - "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", - "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", - "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", - "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", - "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", - "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", - "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", - "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", - "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", - "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", - "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", - "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" - ], - "markers": "python_version >= '3.8'", - "version": "==1.17.1" - }, - "click": { - "hashes": [ - "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", - "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" - ], - "markers": "python_version >= '3.10'", - "version": "==8.2.1" - }, - "cryptography": { - "hashes": [ - "sha256:0339a692de47084969500ee455e42c58e449461e0ec845a34a6a9b9bf7df7fb8", - "sha256:03dbff8411206713185b8cebe31bc5c0eb544799a50c09035733716b386e61a4", - "sha256:06509dc70dd71fa56eaa138336244e2fbaf2ac164fc9b5e66828fccfd2b680d6", - "sha256:0cf13c77d710131d33e63626bd55ae7c0efb701ebdc2b3a7952b9b23a0412862", - "sha256:23b9c3ea30c3ed4db59e7b9619272e94891f8a3a5591d0b656a7582631ccf750", - "sha256:25eb4d4d3e54595dc8adebc6bbd5623588991d86591a78c2548ffb64797341e2", - "sha256:2882338b2a6e0bd337052e8b9007ced85c637da19ef9ecaf437744495c8c2999", - "sha256:3530382a43a0e524bc931f187fc69ef4c42828cf7d7f592f7f249f602b5a4ab0", - "sha256:425a9a6ac2823ee6e46a76a21a4e8342d8fa5c01e08b823c1f19a8b74f096069", - "sha256:46cf7088bf91bdc9b26f9c55636492c1cce3e7aaf8041bbf0243f5e5325cfb2d", - "sha256:4828190fb6c4bcb6ebc6331f01fe66ae838bb3bd58e753b59d4b22eb444b996c", - "sha256:49fe9155ab32721b9122975e168a6760d8ce4cffe423bcd7ca269ba41b5dfac1", - "sha256:4ca0f52170e821bc8da6fc0cc565b7bb8ff8d90d36b5e9fdd68e8a86bdf72036", - "sha256:51dfbd4d26172d31150d84c19bbe06c68ea4b7f11bbc7b3a5e146b367c311349", - "sha256:5f31e6b0a5a253f6aa49be67279be4a7e5a4ef259a9f33c69f7d1b1191939872", - "sha256:627ba1bc94f6adf0b0a2e35d87020285ead22d9f648c7e75bb64f367375f3b22", - "sha256:680806cf63baa0039b920f4976f5f31b10e772de42f16310a6839d9f21a26b0d", - "sha256:6a3511ae33f09094185d111160fd192c67aa0a2a8d19b54d36e4c78f651dc5ad", - "sha256:6a5bf57554e80f75a7db3d4b1dacaa2764611ae166ab42ea9a72bcdb5d577637", - "sha256:6b613164cb8425e2f8db5849ffb84892e523bf6d26deb8f9bb76ae86181fa12b", - "sha256:7405ade85c83c37682c8fe65554759800a4a8c54b2d96e0f8ad114d31b808d57", - "sha256:7aad98a25ed8ac917fdd8a9c1e706e5a0956e06c498be1f713b61734333a4507", - "sha256:7bedbe4cc930fa4b100fc845ea1ea5788fcd7ae9562e669989c11618ae8d76ee", - "sha256:7ef2dde4fa9408475038fc9aadfc1fb2676b174e68356359632e980c661ec8f6", - "sha256:817ee05c6c9f7a69a16200f0c90ab26d23a87701e2a284bd15156783e46dbcc8", - "sha256:944e9ccf67a9594137f942d5b52c8d238b1b4e46c7a0c2891b7ae6e01e7c80a4", - "sha256:964bcc28d867e0f5491a564b7debb3ffdd8717928d315d12e0d7defa9e43b723", - "sha256:96d4819e25bf3b685199b304a0029ce4a3caf98947ce8a066c9137cc78ad2c58", - "sha256:a77c6fb8d76e9c9f99f2f3437c1a4ac287b34eaf40997cfab1e9bd2be175ac39", - "sha256:b0a97c927497e3bc36b33987abb99bf17a9a175a19af38a892dc4bbb844d7ee2", - "sha256:b97737a3ffbea79eebb062eb0d67d72307195035332501722a9ca86bab9e3ab2", - "sha256:bbc505d1dc469ac12a0a064214879eac6294038d6b24ae9f71faae1448a9608d", - "sha256:c22fe01e53dc65edd1945a2e6f0015e887f84ced233acecb64b4daadb32f5c97", - "sha256:ce1678a2ccbe696cf3af15a75bb72ee008d7ff183c9228592ede9db467e64f1b", - "sha256:e00a6c10a5c53979d6242f123c0a97cff9f3abed7f064fc412c36dc521b5f257", - "sha256:eaa3e28ea2235b33220b949c5a0d6cf79baa80eab2eb5607ca8ab7525331b9ff", - "sha256:f3fe7a5ae34d5a414957cc7f457e2b92076e72938423ac64d215722f6cf49a9e" - ], - "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==45.0.4" - }, - "dill": { - "hashes": [ - "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a", - "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c" - ], - "markers": "python_version < '3.11'", - "version": "==0.3.9" - }, - "filelock": { - "hashes": [ - "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", - "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de" - ], - "markers": "python_version >= '3.9'", - "version": "==3.18.0" - }, - "importlib-metadata": { - "hashes": [ - "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", - "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd" - ], - "markers": "python_version >= '3.9'", - "version": "==8.7.0" - }, - "isort": { - "hashes": [ - "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109", - "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6" - ], - "markers": "python_full_version >= '3.8.0'", - "version": "==5.13.2" - }, - "jinja2": { - "hashes": [ - "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", - "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.6" - }, - "jsonschema": { - "hashes": [ - "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", - "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d" - ], - "markers": "python_version >= '3.9'", - "version": "==4.24.0" - }, - "jsonschema-specifications": { - "hashes": [ - "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", - "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608" - ], - "markers": "python_version >= '3.9'", - "version": "==2025.4.1" - }, - "lazy-object-proxy": { - "hashes": [ - "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382", - "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82", - "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9", - "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494", - "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46", - "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30", - "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63", - "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4", - "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae", - "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be", - "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701", - "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd", - "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006", - "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a", - "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586", - "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8", - "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821", - "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07", - "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b", - "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171", - "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b", - "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2", - "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7", - "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4", - "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8", - "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e", - "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f", - "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda", - "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4", - "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e", - "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671", - "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11", - "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455", - "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734", - "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb", - "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59" - ], - "markers": "python_version >= '3.7'", - "version": "==1.9.0" - }, - "markdown-it-py": { - "hashes": [ - "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", - "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "markupsafe": { - "hashes": [ - "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", - "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", - "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", - "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", - "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", - "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", - "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", - "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", - "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", - "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", - "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", - "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", - "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", - "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", - "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", - "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", - "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", - "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", - "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", - "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", - "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", - "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", - "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", - "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", - "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", - "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", - "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", - "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", - "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", - "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", - "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", - "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", - "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", - "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", - "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", - "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", - "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", - "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", - "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", - "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", - "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", - "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", - "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", - "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", - "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", - "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", - "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", - "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", - "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", - "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", - "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", - "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", - "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", - "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", - "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", - "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", - "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", - "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", - "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", - "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", - "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" - ], - "markers": "python_version >= '3.9'", - "version": "==3.0.2" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mdurl": { - "hashes": [ - "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", - "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" - ], - "markers": "python_version >= '3.7'", - "version": "==0.1.2" - }, - "mypy-extensions": { - "hashes": [ - "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", - "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" - ], - "markers": "python_version >= '3.8'", - "version": "==1.1.0" - }, - "packaging": { - "hashes": [ - "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", - "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" - ], - "markers": "python_version >= '3.8'", - "version": "==25.0" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "platformdirs": { - "hashes": [ - "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", - "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" - ], - "markers": "python_version >= '3.9'", - "version": "==4.3.8" - }, - "pycparser": { - "hashes": [ - "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", - "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" - ], - "markers": "python_version >= '3.8'", - "version": "==2.22" - }, - "pygments": { - "hashes": [ - "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" - ], - "markers": "python_version >= '3.8'", - "version": "==2.18.0" - }, - "pylint": { - "hashes": [ - "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9", - "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e" - ], - "index": "pypi", - "markers": "python_full_version >= '3.9.0'", - "version": "==3.3.1" - }, - "pyyaml": { - "hashes": [ - "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", - "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", - "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", - "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", - "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", - "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", - "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", - "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", - "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", - "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", - "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", - "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", - "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", - "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", - "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", - "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", - "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", - "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", - "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", - "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", - "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", - "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", - "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", - "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", - "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", - "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", - "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", - "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", - "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", - "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", - "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", - "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", - "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", - "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", - "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", - "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", - "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", - "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", - "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", - "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", - "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", - "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", - "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", - "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", - "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", - "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", - "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", - "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", - "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", - "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", - "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", - "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", - "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.0.2" - }, - "referencing": { - "hashes": [ - "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", - "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0" - ], - "markers": "python_version >= '3.9'", - "version": "==0.36.2" - }, - "resolvelib": { - "hashes": [ - "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309", - "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf" - ], - "version": "==1.0.1" - }, - "rich": { - "hashes": [ - "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06", - "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==13.8.1" - }, - "rpds-py": { - "hashes": [ - "sha256:0317177b1e8691ab5879f4f33f4b6dc55ad3b344399e23df2e499de7b10a548d", - "sha256:036ded36bedb727beeabc16dc1dad7cb154b3fa444e936a03b67a86dc6a5066e", - "sha256:048893e902132fd6548a2e661fb38bf4896a89eea95ac5816cf443524a85556f", - "sha256:0701942049095741a8aeb298a31b203e735d1c61f4423511d2b1a41dcd8a16da", - "sha256:083a9513a33e0b92cf6e7a6366036c6bb43ea595332c1ab5c8ae329e4bcc0a9c", - "sha256:09eab132f41bf792c7a0ea1578e55df3f3e7f61888e340779b06050a9a3f16e9", - "sha256:0e6a327af8ebf6baba1c10fadd04964c1965d375d318f4435d5f3f9651550f4a", - "sha256:0eb90e94f43e5085623932b68840b6f379f26db7b5c2e6bcef3179bd83c9330f", - "sha256:114a07e85f32b125404f28f2ed0ba431685151c037a26032b213c882f26eb908", - "sha256:115874ae5e2fdcfc16b2aedc95b5eef4aebe91b28e7e21951eda8a5dc0d3461b", - "sha256:140f61d9bed7839446bdd44852e30195c8e520f81329b4201ceead4d64eb3a9f", - "sha256:1521031351865e0181bc585147624d66b3b00a84109b57fcb7a779c3ec3772cd", - "sha256:1c0c434a53714358532d13539272db75a5ed9df75a4a090a753ac7173ec14e11", - "sha256:1d1fadd539298e70cac2f2cb36f5b8a65f742b9b9f1014dd4ea1f7785e2470bf", - "sha256:1de336a4b164c9188cb23f3703adb74a7623ab32d20090d0e9bf499a2203ad65", - "sha256:1ee3e26eb83d39b886d2cb6e06ea701bba82ef30a0de044d34626ede51ec98b0", - "sha256:245550f5a1ac98504147cba96ffec8fabc22b610742e9150138e5d60774686d7", - "sha256:2a40046a529cc15cef88ac5ab589f83f739e2d332cb4d7399072242400ed68c9", - "sha256:2c2cd1a4b0c2b8c5e31ffff50d09f39906fe351389ba143c195566056c13a7ea", - "sha256:2cb9e5b5e26fc02c8a4345048cd9998c2aca7c2712bd1b36da0c72ee969a3523", - "sha256:33358883a4490287e67a2c391dfaea4d9359860281db3292b6886bf0be3d8692", - "sha256:35634369325906bcd01577da4c19e3b9541a15e99f31e91a02d010816b49bfda", - "sha256:35a8d1a24b5936b35c5003313bc177403d8bdef0f8b24f28b1c4a255f94ea992", - "sha256:3af5b4cc10fa41e5bc64e5c198a1b2d2864337f8fcbb9a67e747e34002ce812b", - "sha256:3bcce0edc1488906c2d4c75c94c70a0417e83920dd4c88fec1078c94843a6ce9", - "sha256:3c5b317ecbd8226887994852e85de562f7177add602514d4ac40f87de3ae45a8", - "sha256:3c6564c0947a7f52e4792983f8e6cf9bac140438ebf81f527a21d944f2fd0a40", - "sha256:3ebd879ab996537fc510a2be58c59915b5dd63bccb06d1ef514fee787e05984a", - "sha256:3f0b1798cae2bbbc9b9db44ee068c556d4737911ad53a4e5093d09d04b3bbc24", - "sha256:401ca1c4a20cc0510d3435d89c069fe0a9ae2ee6495135ac46bdd49ec0495763", - "sha256:454601988aab2c6e8fd49e7634c65476b2b919647626208e376afcd22019eeb8", - "sha256:4593c4eae9b27d22df41cde518b4b9e4464d139e4322e2127daa9b5b981b76be", - "sha256:45e484db65e5380804afbec784522de84fa95e6bb92ef1bd3325d33d13efaebd", - "sha256:48d64155d02127c249695abb87d39f0faf410733428d499867606be138161d65", - "sha256:4fbb0dbba559959fcb5d0735a0f87cdbca9e95dac87982e9b95c0f8f7ad10255", - "sha256:4fd52d3455a0aa997734f3835cbc4c9f32571345143960e7d7ebfe7b5fbfa3b2", - "sha256:50f2c501a89c9a5f4e454b126193c5495b9fb441a75b298c60591d8a2eb92e1b", - "sha256:58f77c60956501a4a627749a6dcb78dac522f249dd96b5c9f1c6af29bfacfb66", - "sha256:5a3ddb74b0985c4387719fc536faced33cadf2172769540c62e2a94b7b9be1c4", - "sha256:5c4a128527fe415d73cf1f70a9a688d06130d5810be69f3b553bf7b45e8acf79", - "sha256:5d473be2b13600b93a5675d78f59e63b51b1ba2d0476893415dfbb5477e65b31", - "sha256:5d9e40f32745db28c1ef7aad23f6fc458dc1e29945bd6781060f0d15628b8ddf", - "sha256:5f048bbf18b1f9120685c6d6bb70cc1a52c8cc11bdd04e643d28d3be0baf666d", - "sha256:605ffe7769e24b1800b4d024d24034405d9404f0bc2f55b6db3362cd34145a6f", - "sha256:6099263f526efff9cf3883dfef505518730f7a7a93049b1d90d42e50a22b4793", - "sha256:659d87430a8c8c704d52d094f5ba6fa72ef13b4d385b7e542a08fc240cb4a559", - "sha256:666fa7b1bd0a3810a7f18f6d3a25ccd8866291fbbc3c9b912b917a6715874bb9", - "sha256:68f6f060f0bbdfb0245267da014d3a6da9be127fe3e8cc4a68c6f833f8a23bb1", - "sha256:6d273f136e912aa101a9274c3145dcbddbe4bac560e77e6d5b3c9f6e0ed06d34", - "sha256:6d50841c425d16faf3206ddbba44c21aa3310a0cebc3c1cdfc3e3f4f9f6f5728", - "sha256:771c16060ff4e79584dc48902a91ba79fd93eade3aa3a12d6d2a4aadaf7d542b", - "sha256:785ffacd0ee61c3e60bdfde93baa6d7c10d86f15655bd706c89da08068dc5038", - "sha256:796ad874c89127c91970652a4ee8b00d56368b7e00d3477f4415fe78164c8000", - "sha256:79dc317a5f1c51fd9c6a0c4f48209c6b8526d0524a6904fc1076476e79b00f98", - "sha256:7c9409b47ba0650544b0bb3c188243b83654dfe55dcc173a86832314e1a6a35d", - "sha256:7d779b325cc8238227c47fbc53964c8cc9a941d5dbae87aa007a1f08f2f77b23", - "sha256:816568614ecb22b18a010c7a12559c19f6fe993526af88e95a76d5a60b8b75fb", - "sha256:8378fa4a940f3fb509c081e06cb7f7f2adae8cf46ef258b0e0ed7519facd573e", - "sha256:85608eb70a659bf4c1142b2781083d4b7c0c4e2c90eff11856a9754e965b2540", - "sha256:85fc223d9c76cabe5d0bff82214459189720dc135db45f9f66aa7cffbf9ff6c1", - "sha256:88ec04afe0c59fa64e2f6ea0dd9657e04fc83e38de90f6de201954b4d4eb59bd", - "sha256:8960b6dac09b62dac26e75d7e2c4a22efb835d827a7278c34f72b2b84fa160e3", - "sha256:89706d0683c73a26f76a5315d893c051324d771196ae8b13e6ffa1ffaf5e574f", - "sha256:89c24300cd4a8e4a51e55c31a8ff3918e6651b241ee8876a42cc2b2a078533ba", - "sha256:8c742af695f7525e559c16f1562cf2323db0e3f0fbdcabdf6865b095256b2d40", - "sha256:8dbd586bfa270c1103ece2109314dd423df1fa3d9719928b5d09e4840cec0d72", - "sha256:8eb8c84ecea987a2523e057c0d950bcb3f789696c0499290b8d7b3107a719d78", - "sha256:921954d7fbf3fccc7de8f717799304b14b6d9a45bbeec5a8d7408ccbf531faf5", - "sha256:9a46c2fb2545e21181445515960006e85d22025bd2fe6db23e76daec6eb689fe", - "sha256:9c006f3aadeda131b438c3092124bd196b66312f0caa5823ef09585a669cf449", - "sha256:9ceca1cf097ed77e1a51f1dbc8d174d10cb5931c188a4505ff9f3e119dfe519b", - "sha256:9e5fc7484fa7dce57e25063b0ec9638ff02a908304f861d81ea49273e43838c1", - "sha256:9f2f48ab00181600ee266a095fe815134eb456163f7d6699f525dee471f312cf", - "sha256:9fca84a15333e925dd59ce01da0ffe2ffe0d6e5d29a9eeba2148916d1824948c", - "sha256:a49e1d7a4978ed554f095430b89ecc23f42014a50ac385eb0c4d163ce213c325", - "sha256:a58d1ed49a94d4183483a3ce0af22f20318d4a1434acee255d683ad90bf78129", - "sha256:a61d0b2c7c9a0ae45732a77844917b427ff16ad5464b4d4f5e4adb955f582890", - "sha256:a714bf6e5e81b0e570d01f56e0c89c6375101b8463999ead3a93a5d2a4af91fa", - "sha256:a7b74e92a3b212390bdce1d93da9f6488c3878c1d434c5e751cbc202c5e09500", - "sha256:a8bd2f19e312ce3e1d2c635618e8a8d8132892bb746a7cf74780a489f0f6cdcb", - "sha256:b0be9965f93c222fb9b4cc254235b3b2b215796c03ef5ee64f995b1b69af0762", - "sha256:b24bf3cd93d5b6ecfbedec73b15f143596c88ee249fa98cefa9a9dc9d92c6f28", - "sha256:b5ffe453cde61f73fea9430223c81d29e2fbf412a6073951102146c84e19e34c", - "sha256:bc120d1132cff853ff617754196d0ac0ae63befe7c8498bd67731ba368abe451", - "sha256:bd035756830c712b64725a76327ce80e82ed12ebab361d3a1cdc0f51ea21acb0", - "sha256:bffcf57826d77a4151962bf1701374e0fc87f536e56ec46f1abdd6a903354042", - "sha256:c2013ee878c76269c7b557a9a9c042335d732e89d482606990b70a839635feb7", - "sha256:c4feb9211d15d9160bc85fa72fed46432cdc143eb9cf6d5ca377335a921ac37b", - "sha256:c8980cde3bb8575e7c956a530f2c217c1d6aac453474bf3ea0f9c89868b531b6", - "sha256:c98f126c4fc697b84c423e387337d5b07e4a61e9feac494362a59fd7a2d9ed80", - "sha256:ccc6f3ddef93243538be76f8e47045b4aad7a66a212cd3a0f23e34469473d36b", - "sha256:ccfa689b9246c48947d31dd9d8b16d89a0ecc8e0e26ea5253068efb6c542b76e", - "sha256:cda776f1967cb304816173b30994faaf2fd5bcb37e73118a47964a02c348e1bc", - "sha256:ce4c8e485a3c59593f1a6f683cf0ea5ab1c1dc94d11eea5619e4fb5228b40fbd", - "sha256:d3c10228d6cf6fe2b63d2e7985e94f6916fa46940df46b70449e9ff9297bd3d1", - "sha256:d4ca54b9cf9d80b4016a67a0193ebe0bcf29f6b0a96f09db942087e294d3d4c2", - "sha256:d4cb2b3ddc16710548801c6fcc0cfcdeeff9dafbc983f77265877793f2660309", - "sha256:d50e4864498a9ab639d6d8854b25e80642bd362ff104312d9770b05d66e5fb13", - "sha256:d74ec9bc0e2feb81d3f16946b005748119c0f52a153f6db6a29e8cd68636f295", - "sha256:d8222acdb51a22929c3b2ddb236b69c59c72af4019d2cba961e2f9add9b6e634", - "sha256:db58483f71c5db67d643857404da360dce3573031586034b7d59f245144cc192", - "sha256:dc3c1ff0abc91444cd20ec643d0f805df9a3661fcacf9c95000329f3ddf268a4", - "sha256:dd326a81afe332ede08eb39ab75b301d5676802cdffd3a8f287a5f0b694dc3f5", - "sha256:dec21e02e6cc932538b5203d3a8bd6aa1480c98c4914cb88eea064ecdbc6396a", - "sha256:e1dafef8df605fdb46edcc0bf1573dea0d6d7b01ba87f85cd04dc855b2b4479e", - "sha256:e2f6a2347d3440ae789505693a02836383426249d5293541cd712e07e7aecf54", - "sha256:e37caa8cdb3b7cf24786451a0bdb853f6347b8b92005eeb64225ae1db54d1c2b", - "sha256:e43a005671a9ed5a650f3bc39e4dbccd6d4326b24fb5ea8be5f3a43a6f576c72", - "sha256:e5e2f7280d8d0d3ef06f3ec1b4fd598d386cc6f0721e54f09109a8132182fbfe", - "sha256:e87798852ae0b37c88babb7f7bbbb3e3fecc562a1c340195b44c7e24d403e380", - "sha256:ee86d81551ec68a5c25373c5643d343150cc54672b5e9a0cafc93c1870a53954", - "sha256:f251bf23deb8332823aef1da169d5d89fa84c89f67bdfb566c49dea1fccfd50d", - "sha256:f3d86373ff19ca0441ebeb696ef64cb58b8b5cbacffcda5a0ec2f3911732a194", - "sha256:f4ad628b5174d5315761b67f212774a32f5bad5e61396d38108bd801c0a8f5d9", - "sha256:f70316f760174ca04492b5ab01be631a8ae30cadab1d1081035136ba12738cfa", - "sha256:f73ce1512e04fbe2bc97836e89830d6b4314c171587a99688082d090f934d20a", - "sha256:ff7c23ba0a88cb7b104281a99476cccadf29de2a0ef5ce864959a52675b1ca83" - ], - "markers": "python_version >= '3.9'", - "version": "==0.25.1" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", - "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7" - ], - "markers": "python_version >= '3.8'", - "version": "==0.18.14" - }, - "ruamel.yaml.clib": { - "hashes": [ - "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b", - "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", - "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", - "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5", - "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", - "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", - "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6", - "sha256:2c59aa6170b990d8d2719323e628aaf36f3bfbc1c26279c0eeeb24d05d2d11c7", - "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", - "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", - "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da", - "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", - "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", - "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", - "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519", - "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", - "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", - "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", - "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", - "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", - "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd", - "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", - "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", - "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", - "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", - "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a", - "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969", - "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28", - "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", - "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", - "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45", - "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", - "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12", - "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", - "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", - "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", - "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285", - "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed", - "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", - "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7", - "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", - "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", - "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", - "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76", - "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987", - "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df" - ], - "markers": "python_version >= '3.9'", - "version": "==0.2.12" - }, - "setuptools": { - "hashes": [ - "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", - "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" - ], - "markers": "python_version >= '3.8'", - "version": "==69.0.3" - }, - "subprocess-tee": { - "hashes": [ - "sha256:21942e976715af4a19a526918adb03a8a27a8edab959f2d075b777e3d78f532d", - "sha256:91b2b4da3aae9a7088d84acaf2ea0abee3f4fd9c0d2eae69a9b9122a71476590" - ], - "markers": "python_version >= '3.8'", - "version": "==0.4.2" - }, - "tomli": { - "hashes": [ - "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", - "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", - "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", - "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", - "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", - "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", - "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", - "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", - "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", - "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", - "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", - "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", - "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", - "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", - "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", - "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", - "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", - "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", - "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", - "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", - "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", - "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", - "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", - "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", - "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", - "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", - "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", - "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", - "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", - "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", - "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", - "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.1" - }, - "tomlkit": { - "hashes": [ - "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", - "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.2" - }, - "typing-extensions": { - "hashes": [ - "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", - "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af" - ], - "markers": "python_version >= '3.9'", - "version": "==4.14.0" - }, - "wcmatch": { - "hashes": [ - "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a", - "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af" - ], - "markers": "python_version >= '3.9'", - "version": "==10.1" - }, - "wrapt": { - "hashes": [ - "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0", - "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420", - "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a", - "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c", - "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079", - "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923", - "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f", - "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1", - "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8", - "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86", - "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0", - "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364", - "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e", - "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c", - "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e", - "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c", - "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727", - "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff", - "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e", - "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29", - "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7", - "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72", - "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475", - "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a", - "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317", - "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2", - "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd", - "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640", - "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98", - "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248", - "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e", - "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d", - "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec", - "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1", - "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e", - "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9", - "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92", - "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb", - "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094", - "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46", - "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29", - "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd", - "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705", - "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8", - "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975", - "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb", - "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e", - "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b", - "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418", - "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019", - "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1", - "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba", - "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6", - "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2", - "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3", - "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7", - "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752", - "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416", - "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f", - "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1", - "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc", - "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145", - "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee", - "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a", - "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7", - "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b", - "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653", - "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0", - "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90", - "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29", - "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6", - "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034", - "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09", - "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559", - "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639" - ], - "markers": "python_version < '3.11'", - "version": "==1.15.0" - }, - "yamllint": { - "hashes": [ - "sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3", - "sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.35.1" - }, - "zipp": { - "hashes": [ - "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", - "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166" - ], - "markers": "python_version >= '3.9'", - "version": "==3.23.0" - } - }, - "develop": {} -} diff --git a/ansible_collections/grafana/grafana/README.md b/ansible_collections/grafana/grafana/README.md deleted file mode 100644 index 5c36aac..0000000 --- a/ansible_collections/grafana/grafana/README.md +++ /dev/null @@ -1,159 +0,0 @@ -# Ansible Collection for Grafana - -[![Grafana](https://img.shields.io/badge/grafana-%23F46800.svg?&logo=grafana&logoColor=white)](https://grafana.com) -[![Ansible Collection](https://img.shields.io/badge/grafana.grafana-orange)](https://galaxy.ansible.com/ui/repo/published/grafana/grafana/) -[![GitHub tag](https://img.shields.io/github/tag/grafana/grafana-ansible-collection.svg)](https://github.com/grafana/grafana-ansible-collection/tags) -[![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) - -This collection (`grafana.grafana`) contains modules and roles to assist in automating the management of resources in **Grafana**, **Grafana Agent**, **OpenTelemetry Collector**, **Loki**, **Mimir**, **Alloy**, and **Promtail** with Ansible. - -- [Ansible collection Documentation](https://docs.ansible.com/ansible/latest/collections/grafana/grafana/) -- [Grafana](https://grafana.com) -- [Grafana Cloud](https://grafana.com/products/cloud/) - -## Ansible version compatibility - -The collection is tested and supported with: `ansible >= 2.9` - -## Installing the collection - -Before using the Grafana collection, you need to install it using the below command: - -```shell -ansible-galaxy collection install grafana.grafana -``` - -You can also include it in a `requirements.yml` file and install it via `ansible-galaxy collection install -r requirements.yml`, using the format: - -```yaml ---- -collections: - - name: grafana.grafana -``` - -A specific version of the collection can be installed by using the version keyword in the `requirements.yml` file: - -```yaml ---- -collections: - - name: grafana.grafana - version: 1.0.0 -``` - -## Roles included in the collection - -This collection includes the following roles to help set up and manage Grafana, Grafana Agent, Alloy, 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. -- **Alloy**: The replacement for Grafana Agent and Promtail. Alloy can be used to collect traces, metrics, and logs. -- **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`: - -```yaml -- name: Using grafana collection - hosts: localhost - tasks: - - name: Create a Grafana Cloud stack - grafana.grafana.cloud_stack: - name: mystack - stack_slug: mystack - org_slug: myorg - cloud_api_key: "{{ cloud_api_key }}" - region: eu - state: present -``` - -or you can add full namespace and collection name in the `collections` element in your playbook - -```yaml -- name: Using grafana collection - hosts: localhost - collection: - - grafana.grafana - tasks: - - name: Create a Grafana Cloud stack - cloud_stack: - name: mystack - stack_slug: mystack - org_slug: myorg - cloud_api_key: "{{ cloud_api_key }}" - region: eu - state: present -``` - -## Contributing - -We are accepting GitHub pull requests and issues. There are many ways in which you can participate in the project, for example: - -- Submit bugs and feature requests, and help us verify them -- Submit and review source code changes in GitHub pull requests -- Add new modules for more Grafana resources - -## Testing and Development - -If you want to develop new content for this collection or improve what is already -here, the easiest way to work on the collection is to clone it into one of the configured -[`COLLECTIONS_PATHS`](https://docs.ansible.com/ansible/latest/reference_appendices/config.html#collections-paths), -and work on it there. - -### Testing with `ansible-test` - -We use `ansible-test` for sanity. - -## Commands - -| Command | Description | -| :--- | :----------- | -| `make setup` | Checks to see if necessary tools are installed | -| `make install` | Installs project dependencies | -| `make lint` | Performs all linting commands | -| `make lint-sh` / `make lint-shell` | Performs shell script linting | -| `make lint-md` / `make lint-markdown` | Performs Markdown linting | -| `make lint-txt` / `make lint-text` | Performs text linting | -| `make lint-yml` / `make lint-yaml` | Performs Yaml linting | -| `make lint-ec` / `make lint-editorconfig` | Performs EditorConfig Checks | -| `make lint-ansible` | Performs Ansible linting | -| `make clean` | Removes the `./node_modules` and `./build` directories | -| `make reinstall` | Shortcut to `make clean` and `make install` | - -## Releasing, Versioning and Deprecation - -This collection follows [Semantic Versioning](https://semver.org/). More details on versioning can be found [in the Ansible docs](https://docs.ansible.com/ansible/latest/dev_guide/developing_collections.html#collection-versions). - -We plan to regularly release new minor or bugfix versions once new features or bugfixes have been implemented. - -Releasing the current major version on GitHub happens from the `main` branch by the -[GitHub Release Workflow](https://github.com/grafana/grafana-ansible-collection/blob/main/.github/workflows/release.yml). -Before the [GitHub Release Workflow](https://github.com/grafana/grafana-ansible-collection/blob/main/.github/workflows/release.yml) -is run, Contributors should push the new version on Ansible Galaxy Manually. - -To generate changelogs for a new release, Refer [Generating Changelogs](https://docs.ansible.com/ansible/latest/dev_guide/developing_collections_changelogs.html#generating-changelogs) or run `antsibull-changelog generate`and `antsibull-changelog lint-changelog-yaml changelogs/changelog.yaml` to validate the YAML file. - -To generate the tarball to be uploaded on Ansible Galaxy, Refer [Building collection tarball](https://docs.ansible.com/ansible/latest/dev_guide/developing_collections_distributing.html#building-your-collection-tarball) - -## Code of Conduct - -This collection follows the Ansible project's [Code of Conduct](https://docs.ansible.com/ansible/devel/community/code_of_conduct.html). -Please read and familiarize yourself with this doc - -## More information - -- [Maintainer guidelines](https://docs.ansible.com/ansible/devel/community/maintainers.html) -- Subscribe to the [news-for-maintainers](https://github.com/ansible-collections/news-for-maintainers) repository and track announcements there. -- [Ansible Collection overview](https://github.com/ansible-collections/overview) -- [Ansible User guide](https://docs.ansible.com/ansible/latest/user_guide/index.html) -- [Ansible Developer guide](https://docs.ansible.com/ansible/latest/dev_guide/index.html) -- [Ansible Collection Developer Guide](https://docs.ansible.com/ansible/devel/dev_guide/developing_collections.html) -- [Ansible Community code of conduct](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html) - -## License - -GPL-3.0-or-later diff --git a/ansible_collections/grafana/grafana/ansible.cfg b/ansible_collections/grafana/grafana/ansible.cfg deleted file mode 100644 index fecf5b6..0000000 --- a/ansible_collections/grafana/grafana/ansible.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[defaults] -collections_paths = ./ diff --git a/ansible_collections/grafana/grafana/catalog-info.yaml b/ansible_collections/grafana/grafana/catalog-info.yaml deleted file mode 100644 index de02c6a..0000000 --- a/ansible_collections/grafana/grafana/catalog-info.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: grafana-ansible-collection - title: grafana-ansible-collection - description: | - This collection (grafana.grafana) contains modules and roles to assist in automating the management of resources in Grafana, Grafana Agent, OpenTelemetry Collector, Loki, Mimir, Alloy, and Promtail with Ansible. - tags: - - gitops - links: - - title: "Internal Slack Channel #ansible-collection" - url: https://grafanalabs.enterprise.slack.com/archives/C04T7GX8C69 - annotations: - backstage.io/techdocs-ref: dir:. - github.com/project-slug: grafana/grafana-ansible-collection -spec: - type: tool - owner: group:default/devex - lifecycle: production diff --git a/ansible_collections/grafana/grafana/changelogs/.plugin-cache.yaml b/ansible_collections/grafana/grafana/changelogs/.plugin-cache.yaml deleted file mode 100644 index 1fc6190..0000000 --- a/ansible_collections/grafana/grafana/changelogs/.plugin-cache.yaml +++ /dev/null @@ -1,59 +0,0 @@ -objects: - role: {} -plugins: - become: {} - cache: {} - callback: {} - cliconf: {} - connection: {} - filter: {} - httpapi: {} - inventory: {} - lookup: {} - module: - alert_contact_point: - description: Manage Alerting Contact points in Grafana - name: alert_contact_point - namespace: '' - version_added: 0.0.1 - alert_notification_policy: - description: Manage Alerting Policies points in Grafana - name: alert_notification_policy - namespace: '' - version_added: 0.0.1 - cloud_api_key: - description: Manage Grafana Cloud API keys - name: cloud_api_key - namespace: '' - version_added: 0.0.1 - cloud_plugin: - description: Manage Grafana Cloud Plugins - name: cloud_plugin - namespace: '' - version_added: 0.0.1 - cloud_stack: - description: Manage Grafana Cloud stack - name: cloud_stack - namespace: '' - version_added: 0.0.1 - dashboard: - description: Manage Dashboards in Grafana - name: dashboard - namespace: '' - version_added: 0.0.1 - datasource: - description: Manage Data sources in Grafana - name: datasource - namespace: '' - version_added: 0.0.1 - folder: - description: Manage Folders in Grafana - name: folder - namespace: '' - version_added: 0.0.1 - netconf: {} - shell: {} - strategy: {} - test: {} - vars: {} -version: 6.2.0 diff --git a/ansible_collections/grafana/grafana/changelogs/changelog.yaml b/ansible_collections/grafana/grafana/changelogs/changelog.yaml deleted file mode 100644 index 22a21e2..0000000 --- a/ansible_collections/grafana/grafana/changelogs/changelog.yaml +++ /dev/null @@ -1,442 +0,0 @@ -ancestor: null -releases: - 0.0.1: - changes: - release_summary: It's a release! First version to publish to Ansible Galaxy - release_date: '2022-08-09' - 0.0.2: - changes: - release_summary: Updated input parameters description for all modules - release_date: '2022-08-10' - 0.0.3: - changes: - release_summary: Documentation update and code cleanup - release_date: '2022-08-10' - 0.0.4: - changes: - bugfixes: - - Fix an issue with `cloud_stack` idempotency - release_date: '2022-08-10' - 0.0.5: - changes: - release_summary: Documentation update and code cleanup - release_date: '2022-08-10' - 0.0.6: - changes: - minor_changes: - - Idempotency updates to cloud_api_key and datasource modules - release_date: '2022-08-10' - 0.0.7: - changes: - release_summary: Documentation update for return values in `grafana.grafana.dashboard` - release_date: '2022-08-11' - 1.0.0: - changes: - release_summary: CI and testing improvements - release_date: '2022-08-16' - 1.0.1: - changes: - release_summary: Documentation updates with updated examples - release_date: '2022-08-23' - 1.0.2: - changes: - release_summary: Documentation updates with updated description for modules - release_date: '2022-08-30' - 1.0.3: - changes: - minor_changes: - - Add a fail method to modules source code if `requests` library is not present - - Fixed markup for arg option in Documentation - - Updated Documentation with `notes` to specify if the check_mode feature is - supported by modules - - removed `supports_check_mode=True` from source code of modules - release_date: '2022-10-20' - 1.0.4: - changes: - bugfixes: - - Fixed cases where cloud_stack and alert_contact_point modules do not return - a tuple when nothing in loop matches - major_changes: - - All modules except dashboard and datasource modules now support idempotency - minor_changes: - - All modules use `missing_required_lib`` to compose the message for module.fail_json() - when required library is missing from host - release_summary: Bug fixes and idempotency fixes for modules - release_date: '2022-11-01' - 1.0.5: - changes: - minor_changes: - - Added Note to datasource and dashboard module about not supporting Idempotency - release_summary: Add Note to modules which don't support Idempotency - release_date: '2022-11-10' - 1.1.0: - changes: - major_changes: - - Added Role for Grafana Agent - release_summary: Added Role to deploy Grafana Agent on linux hosts - release_date: '2022-11-22' - 1.1.1: - changes: - minor_changes: - - Updated the return message in grafana.grafana.folder module - release_summary: Updated return description and value for grafana.grafana.folder - module - release_date: '2023-02-08' - 2.0.0: - changes: - major_changes: - - Added Lint support - - Configs for server, metrics, logs, traces, and integrations - - Installation of the latest version - - Local installations when internet connection is not allowed - - Only download binary to controller once instead of hosts - - Skip install if the agent is already installed and the version is the same - as the requested version - - Support for Grafana Agent Flow - - Validation of variables - release_summary: Updated Grafana Agent Role - release_date: '2023-03-27' - 2.1.0: - changes: - major_changes: - - Addition of Grafana Server role by @gardar - - Configurable agent user groups by @NormanJS - - Grafana Plugins support on-prem Grafana installation by @ishanjainn - - Updated Service for flow mode by @bentonam - minor_changes: - - Ability to configure date format in grafana server role by @RomainMou - - Avoid using shell for fetching latest version in Grafana Agent Role by @gardar - - Fix for invalid yaml with datasources list enclosed in quotes by @elkozmon - - Remove agent installation custom check by @VLZZZ - - Remove explicit user creation check by @v-zhuravlev - release_summary: Add Grafana Server role and plugins support on-prem Grafana - release_date: '2023-06-26' - 2.1.1: - changes: - minor_changes: - - Update Download tasks in Grafana Agent Role - release_summary: Update Download tasks in Grafana Agent Role - release_date: '2023-06-26' - 2.1.2: - changes: - minor_changes: - - Fix Deleting datasources - - Fix alert_notification_policy failing on fresh instance - - Making Deleting folders idempotent - - Remove trailing slash automatically from grafana_url - release_summary: Idempotency Updates and minor api_url fixes - release_date: '2023-06-27' - 2.1.3: - changes: - minor_changes: - - indentation and Lint fixes to modules - release_summary: Update modules to fix failing Sanity Tests - release_date: '2023-06-27' - 2.1.4: - changes: - minor_changes: - - Datasource test updates and minor fixes - release_summary: Update Datasource Tests and minor fixes - release_date: '2023-06-27' - 2.1.5: - changes: - minor_changes: - - Add Grafana Agent Version and CPU Arch to Downloaded ZIP in Grafana Agent - Role - - Move _grafana_agent_base_download_url from /vars to /defaults in Grafana Agent - Role - release_summary: Update Grafana Agent Download varibale and ZIP file - release_date: '2023-08-10' - 2.1.6: - changes: - minor_changes: - - Add overrides.conf with CAP_NET_BIND_SERVICE for grafana-server unit - - Fix Grafana Dashboard Import for Grafana Role - - Make grafana_agent Idempotent - - Provisioning errors in YAML - - Use new standard to configure Grafana APT source for Grafana Role - release_summary: Grafana and Grafana Agent role updates - release_date: '2023-09-11' - 2.1.7: - changes: - minor_changes: - - YAML Fixes - release_summary: YAML Fixes - release_date: '2023-09-11' - 2.1.8: - changes: - minor_changes: - - Fix grafana dashboard import in Grafana Role - release_summary: Fix grafana dashboard import in Grafana Role - release_date: '2023-09-12' - 2.1.9: - changes: - minor_changes: - - Add check for Curl and failure step if Agent Version is not retrieved - - Bump cryptography from 39.0.2 to 41.0.3 - - Bump semver from 5.7.1 to 5.7.2 - - Bump word-wrap from 1.2.3 to 1.2.5 - - Create local dashboard directory in check mode - - Update CI Testing - - Update Cloud Stack Module failures - release_summary: Security Updates and Grafana Agent Version failure fixes - release_date: '2023-09-19' - 2.2.0: - changes: - minor_changes: - - Use 'ansible_system' env variable to detect os typ in Grafana Agent Role - - hange grafana Agent Wal and Positions Directory in Grafana Agent Role - release_summary: Grafana Agent Role Updates - release_date: '2023-09-20' - 2.2.1: - changes: - minor_changes: - - Allow alert resource provisioning in Grafana Role - release_summary: Allow alert resource provisioning in Grafana Role - release_date: '2023-09-27' - 2.2.2: - changes: - minor_changes: - - Bump cryptography from 41.0.3 to 41.0.4 - - Create missing notification directory in Grafana Role - - Remove check_mode from create local directory task in Grafana Role - release_summary: Grafana Role bug fixes and security updates - release_date: '2023-09-29' - 2.2.3: - changes: - minor_changes: - - Remove dependency on local-fs.target from Grafana Agent role - release_summary: Remove dependency on local-fs.target from Grafana Agent role - release_date: '2023-10-05' - 2.2.4: - changes: - minor_changes: - - Bump cryptography from 41.0.4 to 41.0.6 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/126 - - Drop curl check by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/120 - - Fix check mode for grafana role by @Boschung-Mecatronic-AG-Infrastructure - in https://github.com/grafana/grafana-ansible-collection/pull/125 - - Fix check mode in Grafana Agent by @AmandaCameron in https://github.com/grafana/grafana-ansible-collection/pull/124 - - Update tags in README by @ishanjainn in https://github.com/grafana/grafana-ansible-collection/pull/121 - release_summary: Grafana and Agent Role bug fixes and security updates - release_date: '2023-12-08' - 2.2.5: - 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 - - 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 - - Bump ansible-lint from 6.22.2 to 24.2.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/150 - - Bump jinja2 from 3.1.2 to 3.1.3 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/129 - - Bump pylint from 2.16.2 to 3.0.3 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/141 - - Bump yamllint from 1.29.0 to 1.33.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/140 - - Bump yamllint from 1.29.0 to 1.33.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/143 - - Bump yamllint from 1.33.0 to 1.34.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/151 - - Change handler to systemd by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/135 - - Fix links in grafana_agent/defaults/main.yaml by @PabloCastellano in https://github.com/grafana/grafana-ansible-collection/pull/134 - - 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 - - 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: - - 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' - 5.3.0: - changes: - major_changes: - - Add support for configuring feature_toggles in grafana role by @LexVar in https://github.com/grafana/grafana-ansible-collection/pull/173 - - Bump pylint from 3.1.0 to 3.1.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/200 - - Add a config check before restarting mimir by @panfantastic in https://github.com/grafana/grafana-ansible-collection/pull/198 - - Bump pylint from 3.1.1 to 3.2.2 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/208 - - Bump ansible-lint from 24.2.3 to 24.5.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/207 - - Fix env file location by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/211 - - Support adding alloy user to extra groups by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/212 - - Backport post-setup healthcheck from agent to alloy by @v-zhuravlev in https://github.com/grafana/grafana-ansible-collection/pull/213 - - readme styling & language improvements by @tigattack in https://github.com/grafana/grafana-ansible-collection/pull/214 - - Bump ansible-lint from 24.5.0 to 24.6.0 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/216 - - Bump pylint from 3.2.2 to 3.2.3 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/217 - - Bump braces from 3.0.2 to 3.0.3 in the npm_and_yarn group across 1 directory by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/218 - - Change from config.river to config.alloy by @cardasac in https://github.com/grafana/grafana-ansible-collection/pull/225 - - Updated result.json['message'] to result.json()['message'] by @CPreun in https://github.com/grafana/grafana-ansible-collection/pull/223 - - Bump pylint from 3.2.3 to 3.2.5 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/234 - - Fix Grafana Configuration for Unified and Legacy Alerting Based on Version by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/215 - release_date: '2024-07-12' - 5.4.0: - changes: - major_changes: - - Use a variable to control uninstall behavior instead of tags by @dobbi84 in https://github.com/grafana/grafana-ansible-collection/pull/253 - release_date: '2024-08-09' - 5.4.1: - changes: - major_changes: - - Updated promtail arch map for aarch64 matching by @gianmarco-mameli in https://github.com/grafana/grafana-ansible-collection/pull/257 - release_date: '2024-08-13' - 5.5.0: - changes: - major_changes: - - mimir molecule should use ansible core 2.16 by @GVengelen in https://github.com/grafana/grafana-ansible-collection/pull/254 - - add support for extra args by @harryfinbow in https://github.com/grafana/grafana-ansible-collection/pull/259 - release_date: '2024-08-16' - 5.5.1: - changes: - bugfixes: - - 'Add check_mode: false to Loki "Scrape GitHub" Task by @winsmith in https://github.com/grafana/grafana-ansible-collection/pull/262' - release_date: '2024-09-13' - 5.6.0: - changes: - major_changes: - - Update Alloy variables to use the `grafana_alloy_` namespace so they are unique by @Aethylred in https://github.com/grafana/grafana-ansible-collection/pull/209 - - Allow alloy_user_groups variable again by @pjezek in https://github.com/grafana/grafana-ansible-collection/pull/276 - - Update README.md by @aioue in https://github.com/grafana/grafana-ansible-collection/pull/275 - - Update main.yml by @aioue in https://github.com/grafana/grafana-ansible-collection/pull/274 - - Update README.md by @aioue in https://github.com/grafana/grafana-ansible-collection/pull/272 - - Ensure check-mode works for otel collector by @pieterlexis-tomtom in https://github.com/grafana/grafana-ansible-collection/pull/264 - - Bump pylint from 3.2.5 to 3.3.1 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/273 - - Bump ansible-lint from 24.6.0 to 24.9.2 by @dependabot in https://github.com/grafana/grafana-ansible-collection/pull/270 - - Alloy Role Improvements by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/281 - - Fix message argument of dashboard task by @Nemental in https://github.com/grafana/grafana-ansible-collection/pull/256 - - add grafana_plugins_ops to defaults and docs by @weakcamel in https://github.com/grafana/grafana-ansible-collection/pull/251 - - fix ansible-lint warnings on Forbidden implicit octal value "0640" by @copolycube in https://github.com/grafana/grafana-ansible-collection/pull/279 - - add option to populate google_analytics_4_id value by @copolycube in https://github.com/grafana/grafana-ansible-collection/pull/249 - - Adding "distributor" section support to mimir config file by @HamzaKhait in https://github.com/grafana/grafana-ansible-collection/pull/247 - release_date: '2024-10-21' - 5.7.0: - changes: - major_changes: - - Fix 'dict object' has no attribute 'path' when running with --check by @JMLX42 in https://github.com/grafana/grafana-ansible-collection/pull/283 - - Ability to set custom directory path for \*.alloy config files by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/294 - - grafana.ini yaml syntax by @intermittentnrg in https://github.com/grafana/grafana-ansible-collection/pull/232 - - Update grafana template by @santilococo in https://github.com/grafana/grafana-ansible-collection/pull/300 - - Add tests and support version latest by @pieterlexis-tomtom in https://github.com/grafana/grafana-ansible-collection/pull/299 - - add loki bloom support by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/298 - release_date: '2024-12-05' - 6.0.0: - changes: - major_changes: - - use ansible_facts instead of ansible_* variables by @kleini in https://github.com/grafana/grafana-ansible-collection/pull/296 - - Fix the markdown code fences for install command by @benmatselby in https://github.com/grafana/grafana-ansible-collection/pull/306 - - Grafana fix facts in main.yml by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/315 - - add catalog-info file for internal dev catalog by @theSuess in https://github.com/grafana/grafana-ansible-collection/pull/317 - - Fix sectionless items edge case by @santilococo in https://github.com/grafana/grafana-ansible-collection/pull/303 - - Fix loki_operational_config section not getting rendered in config.yml by @olegkaspersky in https://github.com/grafana/grafana-ansible-collection/pull/330 - - Fix tags Inherit default vars by @MJurayev in https://github.com/grafana/grafana-ansible-collection/pull/341 - - add publish step to GitHub Actions workflow for Ansible Galaxy by @thelooter in https://github.com/grafana/grafana-ansible-collection/pull/340 - - force temporary directory even in check mode for dashboards.yml by @cmehat in https://github.com/grafana/grafana-ansible-collection/pull/339 - - Make systemd create /var/lib/otel-collector by @pieterlexis-tomtom in https://github.com/grafana/grafana-ansible-collection/pull/336 - - Validate config by @pieterlexis-tomtom in https://github.com/grafana/grafana-ansible-collection/pull/327 - - Add foldersFromFilesStructure option by @root-expert in https://github.com/grafana/grafana-ansible-collection/pull/326 - - Do not log grafana.ini contents when setting facts by @root-expert in https://github.com/grafana/grafana-ansible-collection/pull/325 - - Add tempo role by @CSTDev in https://github.com/grafana/grafana-ansible-collection/pull/323 - - Make dashboard imports more flexible by @torfbolt in https://github.com/grafana/grafana-ansible-collection/pull/308 - - integrate sles legacy init-script support by @floerica in https://github.com/grafana/grafana-ansible-collection/pull/184 - - add user module to create/update/delete grafana users by @mvalois in https://github.com/grafana/grafana-ansible-collection/pull/178 - - management of the config.river with the conversion of the config.yaml by @lbrule in https://github.com/grafana/grafana-ansible-collection/pull/149 - release_date: '2025-04-24' - 6.0.1: - changes: - minor_changes: - - Remove Node modules from Ansible Collection build - release_date: '2025-05-06' - 6.0.2: - changes: - major_changes: - - Update when statement to test for dashboard files found by @hal58th in https://github.com/grafana/grafana-ansible-collection/pull/363 - - Fix Mimir URL verify task by @parcimonic in https://github.com/grafana/grafana-ansible-collection/pull/358 - - properly validate config by @pieterlexis-tomtom in https://github.com/grafana/grafana-ansible-collection/pull/354 - - alloy_readiness_check_use_https by @piotr-g in https://github.com/grafana/grafana-ansible-collection/pull/359 - - use ansible_facts instead of variables by @kleini in https://github.com/grafana/grafana-ansible-collection/pull/365 - - Use become false in find task by @santilococo in https://github.com/grafana/grafana-ansible-collection/pull/368 - - Don't use a proxy when doing Alloy readiness check by @benoitc-croesus in https://github.com/grafana/grafana-ansible-collection/pull/375 - - mark configuration deployment task with `no_log` by @kkantonop in https://github.com/grafana/grafana-ansible-collection/pull/380 - - Don't override defaults by @56quarters in https://github.com/grafana/grafana-ansible-collection/pull/382 - - Add delete protection by @KucicM in https://github.com/grafana/grafana-ansible-collection/pull/381 - - declare collection dependencies by @kleini in https://github.com/grafana/grafana-ansible-collection/pull/386 - - Fix some regression introduced by v6 by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/376 - - template ingester and querier section by @Gufderald in https://github.com/grafana/grafana-ansible-collection/pull/371 - - ensure alerting provisioning directory exists by @derhuerst in https://github.com/grafana/grafana-ansible-collection/pull/364 - release_date: '2025-06-23' - 6.0.3: - changes: - major_changes: - - declare collection dependencies by @ishanjainn in https://github.com/grafana/grafana-ansible-collection/pull/390 - - improve mimir/alloy examples playbook by @smCloudInTheSky in https://github.com/grafana/grafana-ansible-collection/pull/369 - - Changes for issue #383. Added alloy_github_api_url varaible. by @ILikePhysics in https://github.com/grafana/grafana-ansible-collection/pull/393 - - store APT key with .asc extension by @derhuerst in https://github.com/grafana/grafana-ansible-collection/pull/394 - - declare collection dependencies by @kleini in https://github.com/grafana/grafana-ansible-collection/pull/392 - - Bump ansible-lint from 24.9.2 to 25.6.1 by @dependabot[bot] in https://github.com/grafana/grafana-ansible-collection/pull/391 - - Bump brace-expansion from 1.1.11 to 1.1.12 in the npm_and_yarn group across 1 directory by @dependabot[bot] in https://github.com/grafana/grafana-ansible-collection/pull/396 - - ensure IP assert returns boolean result by @aardbol in https://github.com/grafana/grafana-ansible-collection/pull/398 - - Update Mimir README.md by @Gufderald in https://github.com/grafana/grafana-ansible-collection/pull/397 - release_date: '2025-07-29' - 6.0.4: - changes: - major_changes: - - Fixes to foldersFromFilesStructure option by @root-expert in https://github.com/grafana/grafana-ansible-collection/pull/351 - - add macOS support to alloy role by @l50 in https://github.com/grafana/grafana-ansible-collection/pull/418 - - replace None with [] for safe length checks by @voidquark in https://github.com/grafana/grafana-ansible-collection/pull/426 - - Add SUSE support to Alloy role by @pozsa in https://github.com/grafana/grafana-ansible-collection/pull/423 - - Migrate RedHat install to ansible.builtin.package by @r65535 in https://github.com/grafana/grafana-ansible-collection/pull/431 - release_date: '2025-09-27' - 6.0.5: - changes: - major_changes: - - Fixes issue by @digiserg in https://github.com/grafana/grafana-ansible-collection/pull/421 - - use deb822 for newer debian versions by @Lukas-Heindl in https://github.com/grafana/grafana-ansible-collection/pull/440 - - fix datasource documentation by @jeremad in https://github.com/grafana/grafana-ansible-collection/pull/437 - - update catalog info by @Duologic in https://github.com/grafana/grafana-ansible-collection/pull/434 - - Fix Mimir config file validation task by @Windos in https://github.com/grafana/grafana-ansible-collection/pull/428 - - Import custom dashboards only when directory exists by @mahendrapaipuri in https://github.com/grafana/grafana-ansible-collection/pull/430 - - fix mimir_download_url_deb & mimir_download_url_rpm by @germebl in https://github.com/grafana/grafana-ansible-collection/pull/400 - - Use credentials from grafana_ini when importing dashboards by @root-expert in https://github.com/grafana/grafana-ansible-collection/pull/402 - - Fallback to empty dict in case grafana_ini is undefined by @root-expert in https://github.com/grafana/grafana-ansible-collection/pull/403 - - do not skip scrape latest github version even in check_mode by @cmehat in https://github.com/grafana/grafana-ansible-collection/pull/408 - - Updated YUM repo urls from `packages.grafana.com` to `rpm.grafana.com` by @DejfCold in https://github.com/grafana/grafana-ansible-collection/pull/414 - release_date: '2025-10-11' - 6.0.6: - changes: - major_changes: - - Restore default listen address and port in Mimir by @56quarters in https://github.com/grafana/grafana-ansible-collection/pull/456 - - fix broken Grafana apt repository addition by @kleini in https://github.com/grafana/grafana-ansible-collection/pull/454 - release_date: '2025-10-22' \ No newline at end of file diff --git a/ansible_collections/grafana/grafana/changelogs/config.yaml b/ansible_collections/grafana/grafana/changelogs/config.yaml deleted file mode 100644 index 8710b51..0000000 --- a/ansible_collections/grafana/grafana/changelogs/config.yaml +++ /dev/null @@ -1,33 +0,0 @@ ---- -changelog_filename_template: ../CHANGELOG.rst -changelog_filename_version_depth: 0 -changes_file: changelog.yaml -changes_format: combined -ignore_other_fragment_extensions: true -keep_fragments: false -mention_ancestor: true -new_plugins_after_name: removed_features -notesdir: fragments -prelude_section_name: release_summary -prelude_section_title: Release Summary -sanitize_changelog: true -sections: - - - major_changes - - Major Changes - - - minor_changes - - Minor Changes - - - breaking_changes - - Breaking Changes / Porting Guide - - - deprecated_features - - Deprecated Features - - - removed_features - - Removed Features (previously deprecated) - - - security_fixes - - Security Fixes - - - bugfixes - - Bugfixes - - - known_issues - - Known Issues -title: Grafana.Grafana -trivial_section_name: trivial -use_fqcn: true diff --git a/ansible_collections/grafana/grafana/examples/agent-basic-no-options.yaml b/ansible_collections/grafana/grafana/examples/agent-basic-no-options.yaml deleted file mode 100644 index 7ccc5fb..0000000 --- a/ansible_collections/grafana/grafana/examples/agent-basic-no-options.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -- hosts: all - become: true - # pre_tasks happen before roles are executed / applied - pre_tasks: [] - # roles are ran after pre_tasks - roles: - - grafana_agent - # tasks are ran after roles - tasks: [] diff --git a/ansible_collections/grafana/grafana/examples/agent-mode-flow-with-dynamic-conf.yaml b/ansible_collections/grafana/grafana/examples/agent-mode-flow-with-dynamic-conf.yaml deleted file mode 100644 index be469d0..0000000 --- a/ansible_collections/grafana/grafana/examples/agent-mode-flow-with-dynamic-conf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -- hosts: all - tasks: - - name: Install Grafana Agent - ansible.builtin.include_role: - name: grafana.grafana.grafana_agent - vars: - grafana_agent_mode: flow - # Change config file on the host to .river - grafana_agent_config_filename: config.river - # Remove default flags - grafana_agent_flags_extra: - server.http.listen-addr: '0.0.0.0:12345' \ No newline at end of file diff --git a/ansible_collections/grafana/grafana/examples/agent-send-to-grafana-cloud.yaml b/ansible_collections/grafana/grafana/examples/agent-send-to-grafana-cloud.yaml deleted file mode 100644 index f90dda9..0000000 --- a/ansible_collections/grafana/grafana/examples/agent-send-to-grafana-cloud.yaml +++ /dev/null @@ -1,95 +0,0 @@ ---- -- hosts: all - become: true - vars: - grafana_agent_metrics_config: - global: - external_labels: - datacenter: primary - cluster: my-cluster - instance: "{{ ansible_host }}" - remote_write: - - url: https://prometheus-.grafana.net/api/prom/push - basic_auth: - username: "1234567" # your username / instanceID - password: "..." # your grafana.com token - configs: - - name: local - scrape_configs: - # scrape a an application on the localhost - - job_name: my-app - metrics_path: /metrics - static_configs: - - targets: - - localhost:8080 - relabel_configs: [] - metric_relabel_configs: [] - - grafana_agent_logs_config: - global: - clients: - - url: https://logs-.grafana.net/loki/api/v1/push - basic_auth: - username: "1234567" # your username / instanceID - password: "..." # your grafana.com token - configs: - - name: local - positions: - filename: /tmp/positions.yaml - target_config: - sync_period: 10s - scrape_configs: - # scrape all of the log files in /var/log on the localhost - - job_name: log-files - static_configs: - - targets: - - localhost - labels: - job: var-logs - instance: "{{ ansible_host }}" - __path__: /var/log/*.log - # scrape all of the journal logs on localhost - - job_name: systemd-journal - journal: - max_age: 12h - labels: - job: systemd-journal - relabel_configs: - - source_labels: - - __journal__systemd_unit - target_label: systemd_unit - - source_labels: - - __journal__hostname - target_label: hostname - - source_labels: - - __journal_syslog_identifier - target_label: syslog_identifier - - source_labels: - - __journal__pid - target_label: pid - - source_labels: - - __journal__uid - target_label: uid - - source_labels: - - __journal__transport - target_label: transport - grafana_agent_integrations_config: - scrape_integrations: true - # get metrics about the agent - agent: - enabled: true - relabel_configs: [] - metric_relabel_configs: [] - # get node exporter metrics - node_exporter: - enabled: true - relabel_configs: [] - metric_relabel_configs: [] - - # pre_tasks happen before roles are executed / applied - pre_tasks: [] - # roles are ran after pre_tasks - roles: - - grafana_agent - # tasks are ran after roles - tasks: [] diff --git a/ansible_collections/grafana/grafana/examples/alloy.yaml b/ansible_collections/grafana/grafana/examples/alloy.yaml deleted file mode 100644 index cd156a8..0000000 --- a/ansible_collections/grafana/grafana/examples/alloy.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- -- name: Deploy alloy - hosts: all - become: true - roles: - - role: grafana.grafana.alloy - vars: - alloy_config: | - prometheus.scrape "default" { - targets = [{"__address__" = "127.0.0.1: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/examples/ansible.cfg b/ansible_collections/grafana/grafana/examples/ansible.cfg deleted file mode 100644 index f0e70e2..0000000 --- a/ansible_collections/grafana/grafana/examples/ansible.cfg +++ /dev/null @@ -1,32 +0,0 @@ -[defaults] -# (string) Sets the macro for the 'ansible_managed' variable available for :ref:`ansible_collections.ansible.builtin.template_module` and :ref:`ansible_collections.ansible.windows.win_template_module`. This is only relevant for those two modules. -ansible_managed="Ansible managed file. Be wary of possible overwrites." - -# (boolean) Toggle to control the showing of deprecation warnings -deprecation_warnings=False - -# (boolean) Set this to "False" if you want to avoid host key checking by the underlying tools Ansible uses to connect to the host -host_key_checking=False - -# (pathlist) Comma separated list of Ansible inventory sources -inventory=hosts - -# (pathspec) Colon separated paths in which Ansible will search for Modules. -library=../plugins/modules - -# (path) File to which Ansible will log on the controller. When empty logging is disabled. -log_path=./ansible.log - -# (pathspec) Colon separated paths in which Ansible will search for Roles. -roles_path=../roles - -[ssh_connection] - -# ssh arguments to use -# Leaving off ControlPersist will result in poor performance, so use -# paramiko on older platforms rather than removing it -ssh_args = -o ControlMaster=auto -o ControlPersist=60s - -# if True, make ansible use scp if the connection type is ssh -# (default is sftp) -scp_if_ssh = True diff --git a/ansible_collections/grafana/grafana/examples/loki-basic-no-options.yml b/ansible_collections/grafana/grafana/examples/loki-basic-no-options.yml deleted file mode 100644 index cda128d..0000000 --- a/ansible_collections/grafana/grafana/examples/loki-basic-no-options.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -- 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 deleted file mode 100644 index f377188..0000000 --- a/ansible_collections/grafana/grafana/examples/loki-local-filesystem-with-retention-and-alert.yml +++ /dev/null @@ -1,70 +0,0 @@ ---- -- 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 deleted file mode 100644 index a5ff185..0000000 --- a/ansible_collections/grafana/grafana/examples/mimir-3-hosts.yaml +++ /dev/null @@ -1,32 +0,0 @@ -- 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/mimir-single-host.yaml b/ansible_collections/grafana/grafana/examples/mimir-single-host.yaml deleted file mode 100644 index 36915f8..0000000 --- a/ansible_collections/grafana/grafana/examples/mimir-single-host.yaml +++ /dev/null @@ -1,34 +0,0 @@ -- name: Install mimir - hosts: monitoring-node - become: true - - tasks: - - name: Install mimir - ansible.builtin.include_role: - name: grafana.grafana.mimir - vars: - mimir_storage: - storage: - backend: s3 - s3: - endpoint: "{{ s3_endpoint }}" - access_key_id: "{{ vault_s3_access }}" - secret_access_key: "{{ vault_s3_secret }}" - bucket_name: your-mimir-bucket - - # Blocks storage requires a prefix when using a common object storage bucket. - mimir_blocks_storage: - storage_prefix: blocks - tsdb: - dir: "{{ mimir_working_path}}/ingester" - - mimir_limits: - # set metrics retenion to 30d - compactor_blocks_retention_period: 30d - max_label_names_per_series: 100 - - # this setting is required to prevent mimir from attempting - # to make quorum - mimir_ingester: - ring: - replication_factor: 1 diff --git a/ansible_collections/grafana/grafana/examples/monitor-multiple-instance-otel.md b/ansible_collections/grafana/grafana/examples/monitor-multiple-instance-otel.md deleted file mode 100644 index 89762ca..0000000 --- a/ansible_collections/grafana/grafana/examples/monitor-multiple-instance-otel.md +++ /dev/null @@ -1,193 +0,0 @@ -# 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: # Example - eyJrIjoiYjI3NjI5MGQxZTcyOTIxYTc0MDgzMGVhNDhlODNhYzA5OTk2Y2U5YiIsIm4iOiJhbnNpYmxldGVzdCIsImlkIjo2NTI5 - metrics_username: # Example - 825019 - logs_username: # Example - 411478 - prometheus_url: # Example - https://prometheus-us-central1.grafana.net/api/prom/push - loki_url: # Example - https://logs-prod-017.grafana.net/loki/api/v1/push - tempo_url: # Example - tempo-prod-04-prod-us-east-0.grafana.net:443 - traces_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-agent.md b/ansible_collections/grafana/grafana/examples/monitor-multiple-instances-agent.md deleted file mode 100644 index d624c7e..0000000 --- a/ansible_collections/grafana/grafana/examples/monitor-multiple-instances-agent.md +++ /dev/null @@ -1,184 +0,0 @@ -# Monitoring multiple Linux hosts with Grafana Agent Role - -Monitoring with Grafana Agents across multiple Linux hosts can be difficult. -To make it easier, you can use the Grafana Agent role with the Grafana Ansible collection. -This guide shows how to use the `grafana_agent` Ansible role to deploy and manage Grafana Agents across multiple Linux hosts so you can monitor them in Grafana. - -## Before you begin - -Before you begin, you should have: - -- Linux hosts -- SSH access to the Linux hosts -- Account permissions sufficient to install and use Grafana Agent on the Linux 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:2.0.0 -``` - -## 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 Grafana Agent Ansible role - -Next you will create an Ansible playbook that calls the `grafana_agent` role from the `grafana.grafana` Ansible collection. - -To use the Grafana Agent Ansible role: - -1. Create a file named `deploy-agent.yml` in the same directory as `ansible.cfg` and `inventory` and add the configuration below. - - ```yaml - - name: Install Grafana Agent - hosts: all - become: true - - vars: - grafana_cloud_api_key: # Example - eyJrIjoiYjI3NjI5MGQxZTcyOTIxYTc0MDgzMGVhNDhlODNhYzA5OTk2Y2U5YiIsIm4iOiJhbnNpYmxldGVzdCIsImlkIjo2NTI5 - metrics_username: # Example - 825019 - logs_username: # Example - 411478 - prometheus_url: # Example - https://prometheus-us-central1.grafana.net/api/prom/push - loki_url: # Example - https://logs-prod-017.grafana.net/loki/api/v1/push - tasks: - - name: Install Grafana Agent - ansible.builtin.include_role: - name: grafana.grafana.grafana_agent - vars: - grafana_agent_metrics_config: - configs: - - name: integrations - remote_write: - - basic_auth: - password: "{{ grafana_cloud_api_key }}" - username: "{{ metrics_username }}" - url: "{{ prometheus_url }}" - - global: - scrape_interval: 60s - wal_directory: /tmp/grafana-agent-wal - - grafana_agent_logs_config: - configs: - - name: default - clients: - - basic_auth: - password: "{{ grafana_cloud_api_key }}" - username: "{{ logs_username }}" - url: "{{ loki_url }}" - positions: - filename: /tmp/positions.yaml - target_config: - sync_period: 10s - scrape_configs: - - job_name: varlogs - static_configs: - - targets: [localhost] - labels: - instance: ${HOSTNAME:-default} - job: varlogs - __path__: /var/log/*log - grafana_agent_integrations_config: - node_exporter: - enabled: true - instance: ${HOSTNAME:-default} - prometheus_remote_write: - - basic_auth: - password: "{{ grafana_cloud_api_key }}" - username: "{{ metrics_username }}" - url: "{{ prometheus_url }}" - ``` - - The playbook calls the `grafana_agent` role from the `grafana.grafana` Ansible collection. - The Agent configuration in this playbook send metrics and logs from the linux hosts to your Prometheus and Loki data sources. - - Refer to the [Grafana Ansible documentation](https://github.com/grafana/grafana-ansible-collection/tree/main/roles/grafana_agent#role-variables) to understand the other variables you can pass to the `grafana_agent` role. - - When deploying the Agent across multiple instances for monitoring them, It is essential that the Agent is able to auto-detect the hostname for ease in monitoring. - Notice that the label `instance` has been set to the value `${HOSTNAME:-default}`, which is substituted by the value of the HOSTNAME environment variable in the Linux host. - To read more about the variable substitution, refer to the Grafana Agent [node_exporter_config](https://grafana.com/docs/agent/latest/configuration/integrations/node-exporter-config/) documentation. - -1. To run the playbook, run this command: - - ``` - ansible-playbook deploy-agent.yml - ``` - - > **Note:** You can place the `deploy-agent.yml`, `ansible.cfg` and `inventory` files in different directories based on your needs. - -## Check that logs and metrics are being ingested into Prometheus and Loki - -Logs and metrics will soon be available in Grafana if your Promtheus and Loki datasources are added. -To test this, use the Explore feature. -Click the Explore icon (compass icon) in the vertical navigation bar. - -### Check logs - -To check logs: - -1. Use the dropdown menu at the top of the page to select your Loki logs data source. - -1. In the log browser, run the query `{instance="centos-01"}` where centos-01 is the hostname of one of the Linux hosts. - - If you see log lines (shown in the example below), logs are being received. - - ![Logs](https://grafana.com/static/assets/img/blog/ansible-to-manage-agent1.png) - - If no log lines appear, logs are not being collected. - -### Check metrics - -To check metrics: - -1. Use the dropdown menu at the top of the page to select your Prometheus data source. - -1. Run the query `{instance="centos-01"}` where centos-01 is the hostname of one of the Linux hosts. - - If you see a metrics graph and table (shown in the example below), metrics are being received. - - ![Metrics](https://grafana.com/static/assets/img/blog/ansible-to-manage-agent2.png) - - If no metrics appear, metrics are not being collected. - -### View dashboards - -Now that you have logs and metrics in Grafana, you can use dashboards to view them. -Here's an example of one of the prebuilt dashboards included with the Linux integration in Grafana Cloud: - -![Dashboard](https://grafana.com/static/assets/img/blog/ansible-to-manage-agent3.png) - -Using the **Instance** dropdown in the dashboard, you can select from the hostnames where you deployed Grafana Agent and start monitoring them. diff --git a/ansible_collections/grafana/grafana/examples/opentelemetry-collector.yml b/ansible_collections/grafana/grafana/examples/opentelemetry-collector.yml deleted file mode 100644 index 445a3a2..0000000 --- a/ansible_collections/grafana/grafana/examples/opentelemetry-collector.yml +++ /dev/null @@ -1,43 +0,0 @@ -- 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 deleted file mode 100644 index ffef30d..0000000 --- a/ansible_collections/grafana/grafana/examples/promtail-multiple-logs.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -- 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_facts['fqdn'] }}" - __path__: /var/log/messages - - targets: - - localhost - labels: - job: nginx - instance: "{{ ansible_facts['fqdn'] }}" - __path__: /var/log/nginx/*.log diff --git a/ansible_collections/grafana/grafana/meta/runtime.yml b/ansible_collections/grafana/grafana/meta/runtime.yml deleted file mode 100644 index 08867fa..0000000 --- a/ansible_collections/grafana/grafana/meta/runtime.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -requires_ansible: ">=2.12.0,<3.0.0" diff --git a/ansible_collections/grafana/grafana/package.json b/ansible_collections/grafana/grafana/package.json deleted file mode 100644 index 556b3f2..0000000 --- a/ansible_collections/grafana/grafana/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "grafana-ansible-collection", - "version": "2.1.4", - "description": "", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/grafana/grafana-ansible-collection.git" - }, - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/grafana/grafana-ansible-collection/issues" - }, - "homepage": "https://github.com/grafana/grafana-ansible-collection#readme", - "dependencies": { - "editorconfig-checker": "^5.0.1", - "markdownlint-cli2": "^0.6.0", - "textlint": "^12.5.1", - "textlint-rule-common-misspellings": "^1.0.1", - "textlint-rule-no-todo": "^2.0.1", - "textlint-rule-terminology": "^3.0.4" - } -} diff --git a/ansible_collections/grafana/grafana/plugins/modules/alert_contact_point.py b/ansible_collections/grafana/grafana/plugins/modules/alert_contact_point.py deleted file mode 100644 index 9b9a1ca..0000000 --- a/ansible_collections/grafana/grafana/plugins/modules/alert_contact_point.py +++ /dev/null @@ -1,257 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: (c) 2021, Ishan Jain (@ishanjainn) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import (absolute_import, division, print_function) - -DOCUMENTATION = ''' ---- -module: alert_contact_point -author: - - Ishan Jain (@ishanjainn) -version_added: "0.0.1" -short_description: Manage Alerting Contact points in Grafana -description: - - Create, Update and delete Contact points using Ansible. -requirements: [ "requests >= 1.0.0" ] -notes: - - Does not support C(check_mode). -options: - name: - description: - - Sets the name of the contact point. - type: str - required: true - uid: - description: - - Sets the UID of the Contact point. - type: str - required: true - type: - description: - - Sets Contact point type. - type: str - required: true - settings: - description: - - Sets Contact point settings. - type: dict - required: true - disableResolveMessage: - description: - - When set to C(true), Disables the resolve message [OK] that is sent when alerting state returns to C(false). - type: bool - default: false - grafana_api_key: - description: - - Grafana API Key used to authenticate with Grafana. - type: str - required : true - grafana_url: - description: - - URL of the Grafana instance. - type: str - required: true - state: - description: - - State for the Grafana Alert Contact Point. - choices: [ present, absent ] - type: str - default: present -''' - -EXAMPLES = ''' -- name: Create/Update Alerting contact point - grafana.grafana.alert_contact_point: - name: ops-email - uid: opsemail - type: email - settings: - addresses: "ops@mydomain.com,devs@mydomain.com" - grafana_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: present - -- name: Delete Alerting contact point - grafana.grafana.alert_contact_point: - name: ops-email - uid: opsemail - type: email - settings: - addresses: "ops@mydomain.com,devs@mydomain.com" - grafana_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: absent -''' - -RETURN = r''' -output: - description: Dict object containing Contact point information information. - returned: On success - type: dict - contains: - disableResolveMessage: - description: When set to True, Disables the resolve message [OK] that is sent when alerting state returns to false. - returned: state is present and on success - type: bool - sample: false - name: - description: The name for the contact point. - returned: state is present and on success - type: str - sample: ops-email - settings: - description: Contains contact point settings. - returned: state is present and on success - type: dict - sample: { - addresses: "ops@mydomain.com,devs@mydomain.com" - } - uid: - description: The UID for the contact point. - returned: state is present and on success - type: str - sample: opsemail - type: - description: The type of contact point. - returned: state is present and on success - type: str - sample: email -''' - -from ansible.module_utils.basic import AnsibleModule, missing_required_lib -try: - import requests - HAS_REQUESTS = True -except ImportError: - HAS_REQUESTS = False - -__metaclass__ = type - - -def present_alert_contact_point(module): - body = { - 'Name': module.params['name'], - 'UID': module.params['uid'], - 'type': module.params['type'], - 'settings': module.params['settings'], - 'DisableResolveMessage': module.params['disableResolveMessage'] - } - - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - api_url = module.params['grafana_url'] + '/api/v1/provisioning/contact-points' - - headers = { - 'Authorization': 'Bearer ' + module.params['grafana_api_key'], - 'User-Agent': 'grafana-ansible-collection', - } - result = requests.post(api_url, json=body, headers=headers) - - if result.status_code == 202: - return False, True, result.json() - elif result.status_code == 500: - sameConfig = False - contactPointInfo = {} - - api_url = module.params['grafana_url'] + '/api/v1/provisioning/contact-points' - - result = requests.get(api_url, headers=headers) - - for contact_points in result.json(): - if contact_points['uid'] == module.params['uid']: - if (contact_points['name'] == module.params['name'] and contact_points['type'] == module.params['type'] and contact_points['settings'] - and contact_points['settings'] == module.params['settings'] - and contact_points['disableResolveMessage'] == module.params['disableResolveMessage']): - - sameConfig = True - contactPointInfo = contact_points - if sameConfig: - return False, False, contactPointInfo - else: - api_url = module.params['grafana_url'] + '/api/v1/provisioning/contact-points/' + module.params['uid'] - - result = requests.put(api_url, json=body, headers=headers) - - if result.status_code == 202: - api_url = module.params['grafana_url'] + '/api/v1/provisioning/contact-points' - - result = requests.get(api_url, headers=headers) - - for contact_points in result.json(): - if contact_points['uid'] == module.params['uid']: - return False, True, contact_points - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def absent_alert_contact_point(module): - already_exists = False - - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - api_url = module.params['grafana_url'] + '/api/v1/provisioning/contact-points' - headers = { - 'Authorization': 'Bearer ' + module.params['grafana_api_key'], - 'User-Agent': 'grafana-ansible-collection', - } - - result = requests.get(api_url, headers=headers) - - for contact_points in result.json(): - if contact_points['uid'] == module.params['uid']: - already_exists = True - if already_exists: - api_url = module.params['grafana_url'] + '/api/v1/provisioning/contact-points/' + module.params['uid'] - - result = requests.delete(api_url, headers=headers) - - if result.status_code == 202: - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - else: - return True, False, "Alert Contact point does not exist" - - -def main(): - module_args = dict( - name=dict(type='str', required=True), - uid=dict(type='str', required=True), - type=dict(type='str', required=True), - settings=dict(type='dict', required=True), - disableResolveMessage=dict(type='bool', required=False, default=False), - grafana_url=dict(type='str', required=True), - grafana_api_key=dict(type='str', required=True, no_log=True), - state=dict(type='str', required=False, default='present', choices=['present', 'absent']) - ) - - choice_map = { - "present": present_alert_contact_point, - "absent": absent_alert_contact_point, - } - - module = AnsibleModule( - argument_spec=module_args - ) - - if not HAS_REQUESTS: - module.fail_json(msg=missing_required_lib('requests')) - - is_error, has_changed, result = choice_map.get( - module.params['state'])(module) - - if not is_error: - module.exit_json(changed=has_changed, output=result) - else: - module.fail_json(msg=result) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/grafana/grafana/plugins/modules/alert_notification_policy.py b/ansible_collections/grafana/grafana/plugins/modules/alert_notification_policy.py deleted file mode 100644 index 779bae3..0000000 --- a/ansible_collections/grafana/grafana/plugins/modules/alert_notification_policy.py +++ /dev/null @@ -1,242 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: (c) 2021, Ishan Jain (@ishanjainn) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import (absolute_import, division, print_function) - -DOCUMENTATION = ''' ---- -module: alert_notification_policy -author: - - Ishan Jain (@ishanjainn) -version_added: "0.0.1" -short_description: Manage Alerting Policies points in Grafana -description: - - Set the notification policy tree using Ansible. -requirements: [ "requests >= 1.0.0" ] -notes: - - Does not support C(check_mode). -options: - Continue: - description: - - Continue matching subsequent sibling nodes if set to C(true). - type: bool - default: false - groupByStr: - description: - - List of string. - - Group alerts when you receive a notification based on labels. If empty it will be inherited from the parent policy. - type: list - default: [] - elements: str - muteTimeIntervals: - description: - - List of string. - - Sets the mute timing for the notfification policy. - type: list - default: [] - elements: str - rootPolicyReceiver: - description: - - Sets the name of the contact point to be set as the default receiver. - type: str - default: grafana-default-email - routes: - description: - - List of objects - - Sets the Route that contains definitions of how to handle alerts. - type: list - required: true - elements: dict - groupInterval: - description: - - Sets the wait time to send a batch of new alerts for that group after the first notification was sent. Inherited from the parent policy if empty. - type: str - default: 5m - groupWait: - description: - - Sets the wait time until the initial notification is sent for a new group created by an incoming alert. Inherited from the parent policy if empty. - type: str - default: 30s - objectMatchers: - description: - - Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet. - type: list - default: [] - elements: dict - repeatInterval: - description: - - Sets the waiting time to resend an alert after they have successfully been sent. - type: str - default: 4h - grafana_url: - description: - - URL of the Grafana instance. - type: str - required: true - grafana_api_key: - description: - - Grafana API Key used to authenticate with Grafana. - type: str - required : true -''' - -EXAMPLES = ''' -- name: Set Notification policy tree - grafana.grafana.alert_notification_policy: - grafana_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - routes: [ - { - receiver: myReceiver, - object_matchers: [["env", "=", "Production"]], - } - ] - -- name: Set nested Notification policies - grafana.grafana.alert_notification_policy: - routes: [ - { - receiver: myReceiver, - object_matchers: [["env", "=", "Production"],["team", "=", "ops"]], - routes: [ - { - receiver: myReceiver2, - object_matchers: [["region", "=", "eu"]], - } - ] - }, - { - receiver: myReceiver3, - object_matchers: [["env", "=", "Staging"]] - } - ] - grafana_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" -''' - -RETURN = r''' -output: - description: Dict object containing Notification tree information. - returned: On success - type: dict - contains: - group_interval: - description: The waiting time to send a batch of new alerts for that group after the first notification was sent. This is of the parent policy. - returned: on success - type: str - sample: "5m" - group_wait: - description: The waiting time until the initial notification is sent for a new group created by an incoming alert. This is of the parent policy. - returned: on success - type: str - sample: "30s" - receiver: - description: The name of the default contact point. - returned: state is present and on success - type: str - sample: "grafana-default-email" - repeat_interval: - description: The waiting time to resend an alert after they have successfully been sent. This is of the parent policy - returned: on success - type: str - sample: "4h" - routes: - description: The entire notification tree returned as a list. - returned: on success - type: list - sample: [ - { - "object_matchers": [ - [ - "env", - "=", - "Production" - ] - ], - "receiver": "grafana-default-email" - } - ] -''' - -from ansible.module_utils.basic import AnsibleModule, missing_required_lib -try: - import requests - HAS_REQUESTS = True -except ImportError: - HAS_REQUESTS = False - -__metaclass__ = type - - -def alert_notification_policy(module): - body = {'routes': module.params['routes'], 'Continue': module.params['Continue'], - 'groupByStr': module.params['groupByStr'], 'muteTimeIntervals': module.params['muteTimeIntervals'], - 'receiver': module.params['rootPolicyReceiver'], 'group_interval': module.params['groupInterval'], - 'group_wait': module.params['groupWait'], 'object_matchers': module.params['objectMatchers'], - 'repeat_interval': module.params['repeatInterval']} - - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - api_url = module.params['grafana_url'] + '/api/v1/provisioning/policies' - headers = { - 'Authorization': 'Bearer ' + module.params['grafana_api_key'], - 'User-Agent': 'grafana-ansible-collection', - } - result = requests.get(api_url, headers=headers) - - if 'routes' not in result.json(): - api_url = module.params['grafana_url'] + '/api/v1/provisioning/policies' - result = requests.put(api_url, json=body, headers=headers) - - if result.status_code == 202: - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - elif (result.json()['receiver'] == module.params['rootPolicyReceiver'] and result.json()['routes'] == module.params['routes'] - and result.json()['group_wait'] == module.params['groupWait'] and result.json()['group_interval'] == module.params['groupInterval'] - and result.json()['repeat_interval'] == module.params['repeatInterval']): - return False, False, result.json() - else: - api_url = module.params['grafana_url'] + '/api/v1/provisioning/policies' - - result = requests.put(api_url, json=body, headers=headers) - - if result.status_code == 202: - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def main(): - - module_args = dict(Continue=dict(type='bool', required=False, default=False), - groupByStr=dict(type='list', required=False, default=[], elements='str'), - muteTimeIntervals=dict(type='list', required=False, default=[], elements='str'), - rootPolicyReceiver=dict(type='str', required=False, default='grafana-default-email'), - routes=dict(type='list', required=True, elements='dict'), - groupInterval=dict(type='str', required=False, default='5m'), - groupWait=dict(type='str', required=False, default='30s'), - repeatInterval=dict(type='str', required=False, default='4h'), - objectMatchers=dict(type='list', required=False, default=[], elements='dict'), - grafana_url=dict(type='str', required=True), - grafana_api_key=dict(type='str', required=True, no_log=True), ) - - module = AnsibleModule(argument_spec=module_args) - - if not HAS_REQUESTS: - module.fail_json(msg=missing_required_lib('requests')) - - is_error, has_changed, result = alert_notification_policy(module) - - if not is_error: - module.exit_json(changed=has_changed, output=result) - else: - module.fail_json(msg='Status code is ' + str(result['status']), output=result['response']) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/grafana/grafana/plugins/modules/cloud_api_key.py b/ansible_collections/grafana/grafana/plugins/modules/cloud_api_key.py deleted file mode 100644 index 6ff6f0c..0000000 --- a/ansible_collections/grafana/grafana/plugins/modules/cloud_api_key.py +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: (c) 2021, Ishan Jain (@ishanjainn) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import (absolute_import, division, print_function) - -DOCUMENTATION = ''' ---- -module: cloud_api_key -author: - - Ishan Jain (@ishanjainn) -version_added: "0.0.1" -short_description: Manage Grafana Cloud API keys -description: - - Create and delete Grafana Cloud API keys using Ansible. -requirements: [ "requests >= 1.0.0" ] -notes: - - Does not support C(check_mode). -options: - name: - description: - - Sets the name of the Grafana Cloud API key. - type: str - required: true - role: - description: - - Sets the role to be associated with the Cloud API key. - type: str - required: true - choices: [Admin, Viewer, Editor, MetricsPublisher] - org_slug: - description: - - Name of the Grafana Cloud organization in which Cloud API key will be created. - type: str - required: true - existing_cloud_api_key: - description: - - Cloud API Key to authenticate with Grafana Cloud. - type: str - required : true - fail_if_already_created: - description: - - If set to C(true), the task will fail if the API key with same name already exists in the Organization. - type: bool - default: True - state: - description: - - State for the Grafana Cloud API Key. - type: str - default: present - choices: [ present, absent ] -''' - -EXAMPLES = ''' -- name: Create Grafana Cloud API key - grafana.grafana.cloud_api_key: - name: key_name - role: Admin - org_slug: "{{ org_slug }}" - existing_cloud_api_key: "{{ grafana_cloud_api_key }}" - fail_if_already_created: False - state: present - -- name: Delete Grafana Cloud API key - grafana.grafana.cloud_api_key: - name: key_name - org_slug: "{{ org_slug }}" - existing_cloud_api_key: "{{ grafana_cloud_api_key }}" - state: absent -''' - -from ansible.module_utils.basic import AnsibleModule, missing_required_lib -try: - import requests - HAS_REQUESTS = True -except ImportError: - HAS_REQUESTS = False - -__metaclass__ = type - - -def present_cloud_api_key(module): - body = { - 'name': module.params['name'], - 'role': module.params['role'] - } - - api_url = 'https://grafana.com/api/orgs/' + module.params['org_slug'] + '/api-keys' - - result = requests.post(api_url, json=body, headers={ - "Authorization": 'Bearer ' + module.params['existing_cloud_api_key'], - 'User-Agent': 'grafana-ansible-collection', - }) - - if result.status_code == 200: - return False, True, result.json() - elif result.status_code == 409: - return module.params['fail_if_already_created'], False, "A Cloud API key with the same name already exists" - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def absent_cloud_api_key(module): - api_url = 'https://grafana.com/api/orgs/' + module.params['org_slug'] + '/api-keys/' + module.params['name'] - - result = requests.delete(api_url, headers={ - "Authorization": 'Bearer ' + module.params['existing_cloud_api_key'], - 'User-Agent': 'grafana-ansible-collection', - }) - - if result.status_code == 200: - return False, True, "Cloud API key is deleted" - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def main(): - - module_args = dict( - name=dict(type='str', required=True), - role=dict(type='str', required=True, choices=['Admin', 'Viewer', 'Editor', 'MetricsPublisher']), - org_slug=dict(type='str', required=True), - existing_cloud_api_key=dict(type='str', required=True, no_log=True), - fail_if_already_created=dict(type='bool', required=False, default='True'), - state=dict(type='str', required=False, default='present', choices=['present', 'absent']) - ) - - choice_map = { - "present": present_cloud_api_key, - "absent": absent_cloud_api_key, - } - - module = AnsibleModule( - argument_spec=module_args - ) - - if not HAS_REQUESTS: - module.fail_json(msg=missing_required_lib('requests')) - - is_error, has_changed, result = choice_map.get( - module.params['state'])(module) - - if not is_error: - module.exit_json(changed=has_changed, output=result) - else: - module.fail_json(msg=result) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/grafana/grafana/plugins/modules/cloud_plugin.py b/ansible_collections/grafana/grafana/plugins/modules/cloud_plugin.py deleted file mode 100644 index bd29c66..0000000 --- a/ansible_collections/grafana/grafana/plugins/modules/cloud_plugin.py +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: (c) 2021, Ishan Jain (@ishanjainn) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import (absolute_import, division, print_function) - -DOCUMENTATION = ''' ---- -module: cloud_plugin -author: - - Ishan Jain (@ishanjainn) -version_added: "0.0.1" -short_description: Manage Grafana Cloud Plugins -description: - - Create, Update and delete Grafana Cloud plugins using Ansible. -requirements: [ "requests >= 1.0.0" ] -notes: - - Does not support C(check_mode). -options: - name: - description: - - Name of the plugin, e.g. grafana-github-datasource. - type: str - required: true - version: - description: - - Version of the plugin to install. - type: str - default: latest - stack_slug: - description: - - Name of the Grafana Cloud stack to which the plugin will be added. - type: str - required: true - cloud_api_key: - description: - - Cloud API Key to authenticate with Grafana Cloud. - type: str - required : true - state: - description: - - State for the Grafana Cloud Plugin. - type: str - default: present - choices: [ present, absent ] -''' - -EXAMPLES = ''' -- name: Create/Update a plugin - grafana.grafana.cloud_plugin: - name: grafana-github-datasource - version: 1.0.14 - stack_slug: "{{ stack_slug }}" - cloud_api_key: "{{ grafana_cloud_api_key }}" - state: present - -- name: Delete a Grafana Cloud stack - grafana.grafana.cloud_plugin: - name: grafana-github-datasource - stack_slug: "{{ stack_slug }}" - cloud_api_key: "{{ grafana_cloud_api_key }}" - state: absent -''' - -RETURN = r''' - current_version: - description: Current version of the plugin. - returned: On success - type: str - sample: "1.0.14" - latest_version: - description: Latest version available for the plugin. - returned: On success - type: str - sample: "1.0.15" - pluginId: - description: Id for the Plugin. - returned: On success - type: int - sample: 663 - pluginName: - description: Name of the plugin. - returned: On success - type: str - sample: "GitHub" - pluginSlug: - description: Slug for the Plugin. - returned: On success - type: str - sample: "grafana-github-datasource" -''' - -from ansible.module_utils.basic import AnsibleModule, missing_required_lib -try: - import requests - HAS_REQUESTS = True -except ImportError: - HAS_REQUESTS = False - -__metaclass__ = type - - -def present_cloud_plugin(module): - body = { - 'plugin': module.params['name'], - 'version': module.params['version'] - } - - api_url = 'https://grafana.com/api/instances/' + module.params['stack_slug'] + '/plugins' - headers = { - 'Authorization': 'Bearer ' + module.params['grafana_api_key'], - 'User-Agent': 'grafana-ansible-collection', - } - - result = requests.post(api_url, json=body, headers=headers) - - if result.status_code == 200: - return False, True, result.json() - elif result.status_code == 409: - api_url = 'https://grafana.com/api/instances/' + module.params['stack_slug'] + '/plugins/' + module.params['name'] - result = requests.get(api_url, headers=headers) - - if result.json()['pluginSlug'] == module.params['name'] and result.json()['version'] == module.params['version']: - return False, False, result.json() - else: - api_url = 'https://grafana.com/api/instances/' + module.params['stack_slug'] + '/plugins/' + module.params[ - 'name'] - result = requests.post(api_url, json={'version': module.params['version']}, - headers=headers) - - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def absent_cloud_plugin(module): - api_url = 'https://grafana.com/api/instances/' + module.params['stack_slug'] + '/plugins/' + module.params['name'] - - result = requests.delete(api_url, headers={ - "Authorization": 'Bearer ' + module.params['cloud_api_key'], - 'User-Agent': 'grafana-ansible-collection', - }) - - if result.status_code == 200: - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def main(): - - module_args = dict( - name=dict(type='str', required=True), - version=dict(type='str', required=False, default='latest'), - stack_slug=dict(type='str', required=True), - cloud_api_key=dict(type='str', required=True, no_log=True), - state=dict(type='str', required=False, default='present', choices=['present', 'absent']) - ) - - choice_map = { - "present": present_cloud_plugin, - "absent": absent_cloud_plugin, - } - - module = AnsibleModule( - argument_spec=module_args - ) - - if not HAS_REQUESTS: - module.fail_json(msg=missing_required_lib('requests')) - - is_error, has_changed, result = choice_map.get( - module.params['state'])(module) - - if not is_error: - module.exit_json(changed=has_changed, - pluginId=result['pluginId'], - pluginName=result['pluginName'], - pluginSlug=result['pluginSlug'], - current_version=result['version'], - latest_version=result['latestVersion']) - else: - module.fail_json(msg=result) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/grafana/grafana/plugins/modules/cloud_stack.py b/ansible_collections/grafana/grafana/plugins/modules/cloud_stack.py deleted file mode 100644 index 690e465..0000000 --- a/ansible_collections/grafana/grafana/plugins/modules/cloud_stack.py +++ /dev/null @@ -1,259 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: (c) 2021, Ishan Jain (@ishanjainn) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import (absolute_import, division, print_function) - -DOCUMENTATION = ''' ---- -module: cloud_stack -author: - - Ishan Jain (@ishanjainn) -version_added: "0.0.1" -short_description: Manage Grafana Cloud stack -description: - - Create and delete Grafana Cloud stacks using Ansible. -requirements: [ "requests >= 1.0.0" ] -notes: - - Does not support C(check_mode). -options: - name: - description: - - Sets the name of stack. Conventionally matches the URL of the instance. For example, C(stackslug.grafana.net). - type: str - required: true - stack_slug: - description: - - Sets the subdomain of the Grafana instance. For example, if slug is B(stackslug), the instance URL will be C(https://stackslug.grafana.net). - type: str - required: true - cloud_api_key: - description: - - Cloud API Key to authenticate with Grafana Cloud. - type: str - required : true - region: - description: - - Sets the region for the Grafana Cloud stack. - type: str - default: us - choices: [ us, us-azure, eu, au, eu-azure, prod-ap-southeast-0, prod-gb-south-0, prod-eu-west-3] - url: - description: - - If you use a custom domain for the instance, you can provide it here. If not provided, Will be set to C(https://stackslug.grafana.net). - type: str - org_slug: - description: - - Name of the organization under which Cloud stack is created. - type: str - required: true - delete_protection: - description: - - Enables or disables deletion protection for the Cloud stack. - - When set to true, the stack cannot be deleted unless this flag is explicitly disabled. - type: bool - default: true - required: false - state: - description: - - State for the Grafana Cloud stack. - type: str - default: present - choices: [ present, absent ] -''' - -EXAMPLES = ''' -- name: Create a Grafana Cloud stack - grafana.grafana.cloud_stack: - name: stack_name - stack_slug: stack_name - cloud_api_key: "{{ grafana_cloud_api_key }}" - region: eu - url: https://grafana.company_name.com - org_slug: org_name - delete_protection: true - state: present - -- name: Delete a Grafana Cloud stack - grafana.grafana.cloud_stack: - name: stack_name - slug: stack_name - cloud_api_key: "{{ grafana_cloud_api_key }}" - org_slug: org_name - state: absent -''' - -RETURN = r''' - alertmanager_name: - description: Name of the alertmanager instance. - returned: always - type: str - sample: "stackname-alerts" - alertmanager_url: - description: URL of the alertmanager instance. - returned: always - type: str - sample: "https://alertmanager-eu-west-0.grafana.net" - cluster_slug: - description: Slug for the cluster where the Grafana stack is deployed. - returned: always - type: str - sample: "prod-eu-west-0" - id: - description: ID of the Grafana Cloud stack. - returned: always - type: int - sample: 458182 - loki_url: - description: URl for the Loki instance. - returned: always - type: str - sample: "https://logs-prod-eu-west-0.grafana.net" - orgID: - description: ID of the Grafana Cloud organization. - returned: always - type: int - sample: 652992 - prometheus_url: - description: URl for the Prometheus instance. - returned: always - type: str - sample: "https://prometheus-prod-01-eu-west-0.grafana.net" - tempo_url: - description: URl for the Tempo instance. - returned: always - type: str - sample: "https://tempo-eu-west-0.grafana.net" - url: - description: URL of the Grafana Cloud stack. - returned: always - type: str - sample: "https://stackname.grafana.net" - delete_protection: - description: - - Enables or disables deletion protection for the Cloud stack. - - When set to true, the stack cannot be deleted unless this flag is explicitly disabled. - returned: always - type: bool - sample: true -''' - -from ansible.module_utils.basic import AnsibleModule, missing_required_lib -try: - import requests - HAS_REQUESTS = True -except ImportError: - HAS_REQUESTS = False - -__metaclass__ = type - - -def present_cloud_stack(module): - if not module.params['url']: - module.params['url'] = 'https://' + module.params['stack_slug'] + '.grafana.net' - - body = { - 'name': module.params['name'], - 'slug': module.params['stack_slug'], - 'region': module.params['region'], - 'url': module.params['url'], - 'deleteProtection': module.params.get('delete_protection', True), - } - api_url = 'https://grafana.com/api/instances' - headers = { - "Authorization": 'Bearer ' + module.params['cloud_api_key'], - 'User-Agent': 'grafana-ansible-collection', - } - - result = requests.post(api_url, json=body, headers=headers) - if result.status_code == 200: - return False, True, result.json() - elif result.status_code in [409, 403] and result.json()['message'] in ["That URL has already been taken, please try an alternate URL", "Hosted instance limit reached"]: - stack_found = False - if result.json()['message'] == "That URL has already been taken, please try an alternate URL": - api_url = 'https://grafana.com/api/orgs/' + module.params['org_slug'] + '/instances' - result = requests.get(api_url, headers=headers) - stackInfo = {} - for stack in result.json()['items']: - if stack['slug'] == module.params['stack_slug']: - stack_found = True - stackInfo = stack - if stack_found: - if body['deleteProtection'] == stackInfo['deleteProtection']: - return False, False, stackInfo - api_url = f'https://grafana.com/api/instances/{stackInfo["id"]}' - result = requests.post(api_url, json={'deleteProtection': body['deleteProtection']}, headers=headers) - if result.status_code != 200: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - return False, True, result.json() - else: - return True, False, "Stack is not found under your org" - elif result.json()['message'] == "Hosted instance limit reached": - return True, False, "You have reached Maximum number of Cloud Stacks in your Org." - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def absent_cloud_stack(module): - api_url = 'https://grafana.com/api/instances/' + module.params['stack_slug'] - - result = requests.delete(api_url, headers={ - "Authorization": 'Bearer ' + module.params['cloud_api_key'], - 'User-Agent': 'grafana-ansible-collection', - }) - - if result.status_code == 200: - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def main(): - - module_args = dict( - name=dict(type='str', required=True), - stack_slug=dict(type='str', required=True), - cloud_api_key=dict(type='str', required=True, no_log=True), - region=dict(type='str', required=False, default='us', - choices=['us', 'us-azure', 'eu', 'au', 'eu-azure', 'prod-ap-southeast-0', 'prod-gb-south-0', - 'prod-eu-west-3']), - url=dict(type='str', required=False), - org_slug=dict(type='str', required=True), - state=dict(type='str', required=False, default='present', choices=['present', 'absent']), - delete_protection=dict(type=bool, required=False), - ) - - choice_map = { - "present": present_cloud_stack, - "absent": absent_cloud_stack, - } - - module = AnsibleModule( - argument_spec=module_args - ) - - if not HAS_REQUESTS: - module.fail_json(msg=missing_required_lib('requests')) - - is_error, has_changed, result = choice_map.get( - module.params['state'])(module) - - if not is_error: - module.exit_json(changed=has_changed, - alertmanager_name=result['amInstanceName'], - url=result['url'], id=result['id'], - cluster_slug=result['clusterName'], - orgID=result['orgId'], - loki_url=result['hlInstanceUrl'], - prometheus_url=result['hmInstancePromUrl'], - tempo_url=result['htInstanceUrl'], - alertmanager_url=result['amInstanceUrl'], - delete_protection=result['deleteProtection']) - else: - module.fail_json(msg=result) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/grafana/grafana/plugins/modules/dashboard.py b/ansible_collections/grafana/grafana/plugins/modules/dashboard.py deleted file mode 100644 index b11c860..0000000 --- a/ansible_collections/grafana/grafana/plugins/modules/dashboard.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: (c) 2021, Ishan Jain (@ishanjainn) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import (absolute_import, division, print_function) - -DOCUMENTATION = ''' ---- -module: dashboard -author: - - Ishan Jain (@ishanjainn) -version_added: "0.0.1" -short_description: Manage Dashboards in Grafana -description: - - Create, Update and delete Dashboards using Ansible. -requirements: [ "requests >= 1.0.0" ] -notes: - - Does not support C(check_mode). - - Does not support C(Idempotency). -options: - dashboard: - description: - - JSON source code for dashboard. - type: dict - required: true - grafana_url: - description: - - URL of the Grafana instance. - type: str - required: true - grafana_api_key: - description: - - Grafana API Key to authenticate with Grafana Cloud. - type: str - required : true - state: - description: - - State for the Grafana Dashboard. - choices: [ present, absent ] - default: present - type: str -''' - -EXAMPLES = ''' -- name: Create/Update a dashboard - grafana.grafana.dashboard: - dashboard: "{{ lookup('ansible.builtin.file', 'dashboard.json') }}" - grafana_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: present - -- name: Delete dashboard - grafana.grafana.dashboard: - dashboard: "{{ lookup('ansible.builtin.file', 'dashboard.json') }}" - grafana_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: absent -''' - -RETURN = r''' -output: - description: Dict object containing folder information. - returned: On success - type: dict - contains: - id: - description: The ID for the dashboard. - returned: on success - type: int - sample: 17 - slug: - description: The slug for the dashboard. - returned: state is present and on success - type: str - sample: ansible-integration-test - status: - description: The status of the dashboard. - returned: state is present and on success - type: str - sample: success - uid: - description: The UID for the dashboard. - returned: state is present and on success - type: str - sample: "test1234" - url: - description: The endpoint for the dashboard. - returned: state is present and on success - type: str - sample: "/d/test1234/ansible-integration-test" - version: - description: The version of the dashboard. - returned: state is present and on success - type: int - sample: 2 - message: - description: The message returned after the operation on the dashboard. - returned: state is absent and on success - type: str - sample: "Dashboard Ansible Integration Test deleted" - title: - description: The name of the dashboard. - returned: state is absent and on success - type: str - sample: "Ansible Integration Test" -''' - -from ansible.module_utils.basic import AnsibleModule, missing_required_lib -try: - import requests - HAS_REQUESTS = True -except ImportError: - HAS_REQUESTS = False - - -__metaclass__ = type - - -def present_dashboard(module): - - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - api_url = module.params['grafana_url'] + '/api/dashboards/db' - - result = requests.post(api_url, json=module.params['dashboard'], headers={ - "Authorization": 'Bearer ' + module.params['grafana_api_key'], - 'User-Agent': 'grafana-ansible-collection', - }) - - if result.status_code == 200: - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def absent_dashboard(module): - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - if 'uid' not in module.params['dashboard']['dashboard']: - return True, False, "UID is not defined in the the Dashboard configuration" - - api_url = api_url = module.params['grafana_url'] + '/api/dashboards/uid/' + module.params['dashboard']['dashboard']['uid'] - - result = requests.delete(api_url, headers={ - "Authorization": 'Bearer ' + module.params['grafana_api_key'], - 'User-Agent': 'grafana-ansible-collection', - }) - - if result.status_code == 200: - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def main(): - - module_args = dict( - dashboard=dict(type='dict', required=True), - grafana_url=dict(type='str', required=True), - grafana_api_key=dict(type='str', required=True, no_log=True), - state=dict(type='str', required=False, default='present', choices=['present', 'absent']) - ) - - choice_map = { - "present": present_dashboard, - "absent": absent_dashboard, - } - - module = AnsibleModule( - argument_spec=module_args - ) - - if not HAS_REQUESTS: - module.fail_json(msg=missing_required_lib('requests')) - - is_error, has_changed, result = choice_map.get( - module.params['state'])(module) - - if not is_error: - module.exit_json(changed=has_changed, output=result) - else: - module.fail_json(msg=result) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/grafana/grafana/plugins/modules/datasource.py b/ansible_collections/grafana/grafana/plugins/modules/datasource.py deleted file mode 100644 index 748ad40..0000000 --- a/ansible_collections/grafana/grafana/plugins/modules/datasource.py +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: (c) 2021, Ishan Jain (@ishanjainn) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import (absolute_import, division, print_function) - -DOCUMENTATION = ''' ---- -module: datasource -author: - - Ishan Jain (@ishanjainn) -version_added: "0.0.1" -short_description: Manage Data sources in Grafana -description: - - Create, Update and delete Data sources using Ansible. -requirements: [ "requests >= 1.0.0" ] -notes: - - Does not support C(check_mode). - - Does not support C(Idempotency). -options: - dataSource: - description: - - JSON source code for the Data source. - type: dict - required: true - grafana_url: - description: - - URL of the Grafana instance. - type: str - required: true - grafana_api_key: - description: - - Grafana API Key to authenticate with Grafana Cloud. - type: str - required : true - state: - description: - - State for the Grafana Datasource. - choices: [ present, absent ] - default: present - type: str -''' - -EXAMPLES = ''' -- name: Create/Update Data sources - grafana.grafana.datasource: - dataSource: - name: Prometheus - type: prometheus - access: proxy - url: http://localhost:9090 - jsonData: - httpMethod: POST - manageAlerts: true - prometheusType: Prometheus - cacheLevel: High - grafana_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: present - -- name: Delete Data sources - grafana.grafana.datasource: - dataSource: "{{ lookup('ansible.builtin.file', 'datasource.json') | to_yaml }}" - grafana_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: absent -''' - -RETURN = r''' -output: - description: Dict object containing Data source information. - returned: On success - type: dict - contains: - datasource: - description: The response body content for the data source configuration. - returned: state is present and on success - type: dict - sample: { - "access": "proxy", - "basicAuth": false, - "basicAuthUser": "", - "database": "db-name", - "id": 20, - "isDefault": false, - "jsonData": {}, - "name": "ansible-integration", - "orgId": 1, - "readOnly": false, - "secureJsonFields": { - "password": true - }, - "type": "influxdb", - "typeLogoUrl": "", - "uid": "ansibletest", - "url": "https://grafana.github.com/grafana-ansible-collection", - "user": "user", - "version": 1, - "withCredentials": false - } - id: - description: The ID assigned to the data source. - returned: on success - type: int - sample: 20 - name: - description: The name of the data source defined in the JSON source code. - returned: state is present and on success - type: str - sample: "ansible-integration" - message: - description: The message returned after the operation on the Data source. - returned: on success - type: str - sample: "Datasource added" -''' - -from ansible.module_utils.basic import AnsibleModule, missing_required_lib -try: - import requests - HAS_REQUESTS = True -except ImportError: - HAS_REQUESTS = False - -__metaclass__ = type - - -def present_datasource(module): - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - api_url = module.params['grafana_url'] + '/api/datasources' - - headers = { - "Authorization": 'Bearer ' + module.params['grafana_api_key'], - 'User-Agent': 'grafana-ansible-collection', - } - result = requests.post(api_url, json=module.params['dataSource'], headers=headers) - - if result.status_code == 200: - return False, True, result.json() - elif result.status_code == 409: - get_id_url = requests.get(module.params['grafana_url'] + '/api/datasources/id/' + module.params['dataSource']['name'], - headers=headers) - - api_url = module.params['grafana_url'] + '/api/datasources/' + str(get_id_url.json()['id']) - - result = requests.put(api_url, json=module.params['dataSource'], headers=headers) - - if result.status_code == 200: - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def absent_datasource(module): - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - api_url = module.params['grafana_url'] + '/api/datasources/name/' + module.params['dataSource']['name'] - - result = requests.delete(api_url, headers={ - "Authorization": 'Bearer ' + module.params['grafana_api_key'], - 'User-Agent': 'grafana-ansible-collection', - }) - - if result.status_code == 200: - return False, True, {"status": result.status_code, 'response': result.json()['message']} - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def main(): - - module_args = dict( - dataSource=dict(type='dict', required=True), - grafana_url=dict(type='str', required=True), - grafana_api_key=dict(type='str', required=True, no_log=True), - state=dict(type='str', required=False, default='present', choices=['present', 'absent']) - ) - - choice_map = { - "present": present_datasource, - "absent": absent_datasource, - } - - module = AnsibleModule( - argument_spec=module_args - ) - - if not HAS_REQUESTS: - module.fail_json(msg=missing_required_lib('requests')) - - is_error, has_changed, result = choice_map.get( - module.params['state'])(module) - - if not is_error: - module.exit_json(changed=has_changed, output=result) - else: - module.fail_json(msg=result) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/grafana/grafana/plugins/modules/folder.py b/ansible_collections/grafana/grafana/plugins/modules/folder.py deleted file mode 100644 index 09e99e3..0000000 --- a/ansible_collections/grafana/grafana/plugins/modules/folder.py +++ /dev/null @@ -1,280 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: (c) 2021, Ishan Jain (@ishanjainn) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import (absolute_import, division, print_function) - -DOCUMENTATION = ''' ---- -module: folder -author: - - Ishan Jain (@ishanjainn) -version_added: "0.0.1" -short_description: Manage Folders in Grafana -description: - - Create, Update and delete Folders via Ansible. -requirements: [ "requests >= 1.0.0" ] -notes: - - Does not support C(check_mode). -options: - title: - description: - - Sets the title of the folder. - type: str - required: true - uid: - description: - - Sets the UID for your folder. - type: str - required: true - overwrite: - description: - - Set to C(false) if you dont want to overwrite existing folder with newer version. - type: bool - required: false - default: true - grafana_api_key: - description: - - Grafana API Key to authenticate with Grafana. - type: str - required : true - grafana_url: - description: - - URL of the Grafana instance. - type: str - required: true - state: - description: - - State for the Grafana Folder. - choices: [ present, absent ] - default: present - type: str -''' - -EXAMPLES = ''' -- name: Create/Update a Folder in Grafana - grafana.grafana.folder: - title: folder_name - uid: folder_name - overwrite: true - grafana_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: present - -- name: Delete a Folder in Grafana - grafana.grafana.folder: - uid: folder_name - grafana_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: absent -''' - -RETURN = r''' -output: - description: Dict object containing folder information. - returned: On success - type: dict - contains: - canAdmin: - description: Boolean value specifying if current user can admin in folder. - returned: state is present and on success - type: bool - sample: true - canDelete: - description: Boolean value specifying if current user can delete the folder. - returned: state is present and on success - type: bool - sample: true - canEdit: - description: Boolean value specifying if current user can edit in folder. - returned: state is present and on success - type: bool - sample: true - canSave: - description: Boolean value specifying if current user can save in folder. - returned: state is present and on success - type: bool - sample: true - created: - description: The date when folder was created. - returned: state is present and on success - type: str - sample: "2022-10-20T09:31:53Z" - createdBy: - description: The name of the user who created the folder. - returned: state is present and on success - type: str - sample: "Anonymous" - hasAcl: - description: Boolean value specifying if folder has acl. - returned: state is present and on success - type: bool - sample: true - id: - description: The ID for the folder. - returned: state is present and on success - type: int - sample: 18 - title: - description: The name of the folder. - returned: on success - type: str - sample: foldername - uid: - description: The UID for the folder. - returned: state is present and on success - type: str - sample: foldername - updated: - description: The date when the folder was last updated. - returned: state is present and on success - type: str - sample: "2022-10-20T09:31:53Z" - updatedBy: - description: The name of the user who last updated the folder. - returned: state is present and on success - type: str - sample: "Anonymous" - url: - description: The URl for the folder. - returned: state is present and on success - type: str - sample: "/dashboards/f/foldername/foldername" - version: - description: The version of the folder. - returned: state is present and on success - type: int - sample: 1 - message: - description: The message returned after the operation on the folder. - returned: state is absent and on success - type: str - sample: "Folder has been succesfuly deleted" -''' - -from ansible.module_utils.basic import AnsibleModule, missing_required_lib -try: - import requests - HAS_REQUESTS = True -except ImportError: - HAS_REQUESTS = False - -__metaclass__ = type - - -def present_folder(module): - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - body = { - 'uid': module.params['uid'], - 'title': module.params['title'], - } - api_url = module.params['grafana_url'] + '/api/folders' - - headers = { - "Authorization": 'Bearer ' + module.params['grafana_api_key'], - 'User-Agent': 'grafana-ansible-collection', - } - - result = requests.post(api_url, json=body, headers=headers) - - if result.status_code == 200: - return False, True, result.json() - elif result.status_code == 412: - sameConfig = False - folderInfo = {} - - api_url = module.params['grafana_url'] + '/api/folders' - result = requests.get(api_url, headers=headers) - - for folder in result.json(): - if folder['uid'] == module.params['uid'] and folder['title'] == module.params['title']: - sameConfig = True - folderInfo = folder - - if sameConfig: - return False, False, folderInfo - else: - body = { - 'uid': module.params['uid'], - 'title': module.params['title'], - 'overwrite': module.params['overwrite'] - } - api_url = module.params['grafana_url'] + '/api/folders/' + module.params['uid'] - - result = requests.put(api_url, json=body, headers=headers) - - if result.status_code == 200: - return False, True, result.json() - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - else: - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def absent_folder(module): - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - sameConfig = False - - api_url = module.params['grafana_url'] + '/api/folders' - headers = { - "Authorization": 'Bearer ' + module.params['grafana_api_key'], - 'User-Agent': 'grafana-ansible-collection', - } - result = requests.get(api_url, headers=headers) - - for folder in result.json(): - if folder['uid'] == module.params['uid'] and folder['title'] == module.params['title']: - sameConfig = True - if sameConfig is True: - api_url = module.params['grafana_url'] + '/api/folders/' + module.params['uid'] - - result = requests.delete(api_url, headers=headers) - - if result.status_code == 200: - return False, True, {"status": result.status_code, 'response': "Folder has been succesfuly deleted"} - else: - return True, False, {"status": result.status_code, 'response': "Error deleting folder"} - else: - return False, True, {"status": 200, 'response': "Folder does not exist"} - - -def main(): - - module_args = dict( - title=dict(type='str', required=True), - uid=dict(type='str', required=True), - overwrite=dict(type='bool', required=False, default=True), - grafana_url=dict(type='str', required=True), - grafana_api_key=dict(type='str', required=True, no_log=True), - state=dict(type='str', required=False, default='present', choices=['present', 'absent']) - ) - - choice_map = { - "present": present_folder, - "absent": absent_folder, - } - - module = AnsibleModule( - argument_spec=module_args - ) - - if not HAS_REQUESTS: - module.fail_json(msg=missing_required_lib('requests')) - - is_error, has_changed, result = choice_map.get( - module.params['state'])(module) - - if not is_error: - module.exit_json(changed=has_changed, output=result) - else: - module.fail_json(msg=result) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/grafana/grafana/plugins/modules/user.py b/ansible_collections/grafana/grafana/plugins/modules/user.py deleted file mode 100644 index 177eb73..0000000 --- a/ansible_collections/grafana/grafana/plugins/modules/user.py +++ /dev/null @@ -1,284 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: (c) 2024, téïcée (www.teicee.com) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import (absolute_import, division, print_function) -from ansible.module_utils.basic import AnsibleModule, missing_required_lib - -DOCUMENTATION = ''' ---- -module: user -author: - - Mathieu Valois, téïcée -version_added: "0.0.1" -short_description: Manage Users in Grafana -description: - - Create, Update and delete Users using Ansible. -requirements: [ "requests >= 1.0.0" ] -notes: - - Does not support C(check_mode). - - Does not support C(Idempotency). -options: - grafana_url: - description: - - URL of the Grafana instance. - type: str - required: true - admin_name: - description: - - Grafana admin username - type: str - required : true - admin_password: - description: - - Grafana admin password - type: str - required : true - login: - description: - - Login of the user - type: str - required : true - password: - description: - - Password of the user. Should be provided if state=present - type: str - required : false - name: - description: - - Name of the user. - type: str - required : false - email: - description: - - Email address of the user. - type: str - required : false - state: - description: - - State for the Grafana User. - choices: [ present, absent ] - default: present - type: str -''' - -EXAMPLES = ''' -- name: Create/Update a user - grafana.grafana.user: - login: "grafana_user" - password: "{{ lookup('ansible.builtin.password') }}" - email: "grafana_user@localhost.local - name: "grafana user" - grafana_url: "{{ grafana_url }}" - admin_name: "admin" - admin_password: "admin" - state: present - -- name: Delete user - grafana.grafana.user: - login: "grafana_user" - grafana_url: "{{ grafana_url }}" - admin_name: "admin" - admin_password: "admin" - state: absent -''' - -RETURN = r''' -output: - description: Dict object containing user information and message. - returned: On success - type: dict - contains: - id: - description: The ID for the user. - returned: on success - type: int - sample: 17 - email: - description: The email for the user. - returned: on success - type: str - sample: grafana_user@localhost.local - name: - description: The name for the user. - returned: on success - type: str - sample: grafana user - login: - description: The login for the user. - returned: on success - type: str - sample: grafana_user -''' - -try: - import requests - HAS_REQUESTS = True -except ImportError: - HAS_REQUESTS = False - - -__metaclass__ = type - - -def _get_user(grafana_url, admin_name, admin_password, login, email=None): - get_user_url = grafana_url + '/api/users/lookup?loginOrEmail=' - - # check if user exists by login provided login - result = requests.get(f"{get_user_url}{login}", auth=requests.auth.HTTPBasicAuth( - admin_name, admin_password)) - # if no user has this login, check the email if provided - if result.status_code == 404 and email is not None: - result = requests.get(f"{get_user_url}{email}", auth=requests.auth.HTTPBasicAuth( - admin_name, admin_password)) - - if result.status_code == 404: - return None - - return result.json() - - -def _set_user_password(grafana_url, admin_name, admin_password, user_id, password): - """ sets the password for the existing user having user_id. - admin_name should be a user having users.password:write permission - """ - - set_user_password_url = f"{grafana_url}/api/admin/users/{user_id}/password" - - result = requests.put(set_user_password_url, json={'password': password}, auth=requests.auth.HTTPBasicAuth( - admin_name, admin_password)) - - return result - - -def present_user(module): - - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - body = { - 'login': module.params['login'], - 'password': module.params['password'], - 'email': module.params['email'], - 'name': module.params['name'], - 'OrgId': module.params['orgid'] - } - - user = _get_user(module.params['grafana_url'], module.params['admin_name'], - module.params['admin_password'], module.params['login'], module.params['email']) - - if user is None: - api_url = module.params['grafana_url'] + '/api/admin/users' - result = requests.post(api_url, json=body, auth=requests.auth.HTTPBasicAuth( - module.params['admin_name'], module.params['admin_password'])) - else: - user_id = user['id'] - api_url = module.params['grafana_url'] + '/api/users' - result = requests.put(f"{api_url}/{user_id}", json=body, auth=requests.auth.HTTPBasicAuth( - module.params['admin_name'], module.params['admin_password'])) - - if result.status_code == 200: - return False, True, result.json() - - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def absent_user(module): - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - user = _get_user(module.params['grafana_url'], module.params['admin_name'], - module.params['admin_password'], module.params['login'], module.params['email']) - - if user is None: - return False, False, "User does not exist" - - user_id = user['id'] - api_url = f"{module.params['grafana_url']}/api/admin/users/{user_id}" - result = requests.delete(api_url, auth=requests.auth.HTTPBasicAuth( - module.params['admin_name'], module.params['admin_password'])) - - if result.status_code == 200: - return False, True, result.json() - - return True, False, {"status": result.status_code, 'response': result.json()['message']} - - -def password_user(module): - if module.params['grafana_url'][-1] == '/': - module.params['grafana_url'] = module.params['grafana_url'][:-1] - - # try with new password to check if already changed - user = _get_user(module.params['grafana_url'], module.params['login'], - module.params['password'], module.params['login'], module.params['email']) - - if 'id' in user: - # Auth is OK, password does not need to be changed - return False, False, {'message': 'Password has already been changed', 'user': user} - - # from here, we begin password change procedure - user = _get_user(module.params['grafana_url'], module.params['admin_name'], - module.params['admin_password'], module.params['login'], module.params['email']) - - if user is None: - return True, False, "User does not exist" - - if 'id' not in user: - return True, False, user - - result = _set_user_password(module.params['grafana_url'], module.params['admin_name'], - module.params['admin_password'], user['id'], module.params['password']) - - if result.status_code == 200: - return False, True, result.json() - - return True, False, result.json() - - -def main(): - - # Grafana admin API is only accessible with basic auth, not token - # So we shall provide admin name and its password - module_args = dict( - admin_name=dict(type='str', required=True), - admin_password=dict(type='str', required=True, no_log=True), - login=dict(type='str', required=True), - password=dict(type='str', required=False, no_log=True), - email=dict(type='str', required=False), - name=dict(type='str', required=False), - orgid=dict(type='int', required=False), - grafana_url=dict(type='str', required=True), - state=dict(type='str', required=False, default='present', - choices=['present', 'absent', 'update_password']) - ) - - choice_map = { - "present": present_user, - "absent": absent_user, - "update_password": password_user - } - - module = AnsibleModule( - argument_spec=module_args - ) - - if not HAS_REQUESTS: - module.fail_json(msg=missing_required_lib('requests')) - - if module.params['state'] in ('present', 'update_password') and 'password' not in module.params: - module.fail_json( - msg="Want to create or update user but password is missing") - - is_error, has_changed, result = choice_map.get( - module.params['state'])(module) - - if not is_error: - module.exit_json(changed=has_changed, output=result) - else: - module.fail_json(msg=result) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/grafana/grafana/requirements.txt b/ansible_collections/grafana/grafana/requirements.txt deleted file mode 100644 index 2d38dea..0000000 --- a/ansible_collections/grafana/grafana/requirements.txt +++ /dev/null @@ -1,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 deleted file mode 100644 index 8d80a4d..0000000 --- a/ansible_collections/grafana/grafana/requirements.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -collections: - - name: https://github.com/ansible-collections/community.general.git - 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 deleted file mode 100644 index 23e5f22..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# Ansible role - Alloy - -[![License](https://img.shields.io/github/license/grafana/grafana-ansible-collection)](LICENSE) - -This Ansible role to install and configure [Alloy](https://grafana.com/docs/alloy/latest/), which can be used to collect traces, metrics, and logs. -This role is tailored for operating systems such as **RedHat**, **Rocky Linux**, **AlmaLinux**, **Ubuntu**, **Debian**, **macOS**, and **openSUSE**. - -## Table of Content - -- [Requirements](#requirements) -- [Role Variables](#role-variables) -- [Playbook](#playbook) - -## Requirements - -- Ansible 2.13+ -- `ansible.utils` collection is required. Additionally, you must install the `netaddr` Python library on the host where you are running Ansible (not on the target remote host) if is not present. -- `community.general` collection is required for macOS support -- **macOS**: Homebrew must be installed - -## Role Variables - -| Variable Name | Description | Default Value | -|-----------------------|----------------------------------------------------------------------|---------------------------------------------------------------------| -| `alloy_version` | The version of Alloy to download and deploy. Supported standard version "1.4.2" format or "latest". | `latest` | -| `alloy_uninstall` | If set to `true` will perfom uninstall instead of deployment. | `false` | -| `alloy_expose_port` | 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 alloy port. The Port is automatically extracted from the environment variable `alloy_env_file_vars` in CUSTOM_ARGS when --server.http.listen-addr=0.0.0.0:12345 is defined. If set to false, configuration is skipped. If the firewalld.service is not active, all firewalld tasks are skipped. | `false` | -| `alloy_user_groups` | Appends the alloy user to specific groups. | `[]` | -| `alloy_github_api_url` | The default Github API URL to check for the latest version available. | `"https://api.github.com/repos/grafana/alloy/releases/latest"` | -| `alloy_download_url_rpm` | The default download URL for the Alloy rpm package from GitHub. | `"https://github.com/grafana/alloy/releases/download/v{{ aloy_version }}/alloy-{{ aloy_version }}-1.{{ __alloy_arch }}.rpm"` | -| `alloy_download_url_deb` | The default download URL for the Alloy deb package from GitHub. | `"https://github.com/grafana/alloy/releases/download/v{{ aloy_version }}/alloy-{{ aloy_version }}-1.{{ __alloy_arch }}.deb"` | -| `alloy_readiness_check_use_https` | This boolean variable determines whether the readiness check for the Alloy server should use HTTPS or HTTP when validating the `/-/ready` endpoint. This variable does not enable TLS on the Alloy server itself. | `false` | -| `alloy_readiness_check_use_proxy` | This boolean variable determines whether the readiness check for the Alloy server should use a proxy when validating the `/-/ready` endpoint. If false, it will not use a proxy, even if one is defined in an environment variable on the target hosts. | `true` | -| `alloy_env_file_vars` | You can use environment variables to control the run-time behavior of Grafana Alloy. | `{}` | -| `alloy_systemd_override` | Systemd unit drop-in file used to override or extend the default configuration of a systemd unit. | `{}` | -| `alloy_config` | This is the configuration that sets up Alloy. Refer to the [configuration blocks](https://grafana.com/docs/alloy/latest/reference/config-blocks/) and [components](https://grafana.com/docs/alloy/latest/reference/components/) documentation for more details. Since the purpose of using Alloy varies, no default configuration is provided. ⚠️ **You must provide either `alloy_config` for single config or set `alloy_env_file_vars.CONFIG_FILE` for multi-config setup**. Note that if you use `alloy_env_file_vars.CONFIG_FILE`, the content of `alloy_config` will not be templated. It is expected that you manage the multi-config content using pre_tasks or with your own role. | `{}` | - -## Dependencies - -No Dependencies - -## Playbook - -```yaml -- name: Manage alloy service - hosts: all - become: true - vars: - # alloy_config: | - # Your Config Content - roles: - - role: grafana.grafana.alloy -``` - -- Playbook execution example -```shell -# Deploy Alloy -ansible-playbook function_alloy_play.yml - -# Uninstall Alloy -ansible-playbook function_alloy_play.yml -e "alloy_uninstall=true" -``` - -## License - -See [LICENSE](https://github.com/grafana/grafana-ansible-collection/blob/main/LICENSE) - -## Author Information - -- [Ishan Jain](https://github.com/ishanjainn) -- [VoidQuark](https://github.com/voidquark) diff --git a/ansible_collections/grafana/grafana/roles/alloy/defaults/main.yml b/ansible_collections/grafana/grafana/roles/alloy/defaults/main.yml deleted file mode 100644 index 371759e..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/defaults/main.yml +++ /dev/null @@ -1,36 +0,0 @@ ---- -# defaults file for alloy -alloy_version: "latest" -alloy_uninstall: false -alloy_expose_port: false -alloy_github_api_url: "https://api.github.com/repos/grafana/alloy/releases/latest" -alloy_download_url_rpm: "https://github.com/grafana/alloy/releases/download/v{{ alloy_version }}/alloy-{{ alloy_version }}-1.{{ __alloy_arch }}.rpm" -alloy_download_url_deb: "https://github.com/grafana/alloy/releases/download/v{{ alloy_version }}/alloy-{{ alloy_version }}-1.{{ __alloy_arch }}.deb" -alloy_readiness_check_use_https: false -alloy_readiness_check_use_proxy: true - -alloy_user_groups: [] -# alloy_user_groups: -# - "systemd-journal" - -alloy_env_file_vars: {} -# alloy_env_file_vars: -# CONFIG_FILE: "/custom/path" -# CUSTOM_ARGS: "--server.http.listen-addr=0.0.0.0:12345 --stability.level=public-preview --feature.community-components.enabled=true" - -alloy_systemd_override: {} -# alloy_systemd_override: | -# [Service] -# User=root - -alloy_config: {} -# alloy_config: | -# prometheus.scrape "default" { -# targets = [{"__address__" = "127.0.0.1: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 deleted file mode 100644 index 98cea63..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/handlers/main.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -# handlers file for alloy -- name: Restart alloy - listen: "restart alloy" - ansible.builtin.systemd: - daemon_reload: true - name: alloy.service - state: restarted - enabled: true - when: not ansible_check_mode - -- name: Restart alloy macos - listen: "restart alloy macos" - ansible.builtin.command: "brew services restart {{ __alloy_brew_package }}" - when: - - not ansible_check_mode - - ansible_facts['os_family'] == 'Darwin' diff --git a/ansible_collections/grafana/grafana/roles/alloy/meta/main.yml b/ansible_collections/grafana/grafana/roles/alloy/meta/main.yml deleted file mode 100644 index 6f7048e..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/meta/main.yml +++ /dev/null @@ -1,34 +0,0 @@ ---- -galaxy_info: - role_name: alloy - author: Ishan Jain, voidquark - description: Role to Install and Configure Grafana Alloy - license: "GPL-3.0-or-later" - min_ansible_version: "2.13" - platforms: - - name: EL - versions: - - "8" - - "9" - - name: Fedora - versions: - - all - - name: Debian - versions: - - all - - name: Ubuntu - versions: - - all - - name: macOS - versions: - - all - - name: opensuse - versions: - - all - galaxy_tags: - - alloy - - grafana - - observability - - monitoring - - opentelemetry - - telemetry diff --git a/ansible_collections/grafana/grafana/roles/alloy/molecule/default/converge.yml b/ansible_collections/grafana/grafana/roles/alloy/molecule/default/converge.yml deleted file mode 100644 index e14f0e9..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/molecule/default/converge.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -- name: Converge - hosts: all - vars: - alloy_version: "1.4.2" - alloy_config: | - prometheus.scrape "default" { - targets = [{"__address__" = "127.0.0.1:12345"}] - forward_to = [prometheus.remote_write.prom.receiver] - } - prometheus.remote_write "prom" { - endpoint { - url = "http://mimir:9009/api/v1/push" - } - } - roles: - - role: grafana.grafana.alloy diff --git a/ansible_collections/grafana/grafana/roles/alloy/molecule/default/molecule.yml b/ansible_collections/grafana/grafana/roles/alloy/molecule/default/molecule.yml deleted file mode 100644 index 339965a..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/molecule/default/molecule.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -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/alloy/tasks/deploy.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/deploy.yml deleted file mode 100644 index 7c38cda..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/tasks/deploy.yml +++ /dev/null @@ -1,176 +0,0 @@ ---- -- name: Obtain the latest version from the GitHub repo - when: alloy_version == "latest" - block: - - name: Scrape Github API endpoint to obtain latest Alloy version - ansible.builtin.uri: - url: "{{ alloy_github_api_url }}" - method: GET - body_format: json - become: false - delegate_to: localhost - run_once: true - check_mode: false - register: __github_latest_version - - - name: Latest available Alloy version - ansible.builtin.set_fact: - alloy_version: "{{ __github_latest_version.json.tag_name | regex_replace('^v?(\\d+\\.\\d+\\.\\d+)$', '\\1') }}" - -- name: Verify current deployed version - when: ansible_facts['os_family'] in ['RedHat', 'Debian', 'Suse'] - block: - - name: Check if Alloy binary is present - ansible.builtin.stat: - path: "/usr/bin/alloy" - register: __already_deployed - - - name: Obtain current deployed Alloy version - ansible.builtin.command: - cmd: "/usr/bin/alloy --version" - changed_when: false - register: __current_deployed_version - when: __already_deployed.stat.exists | bool - -- name: Verify current deployed version on macOS - when: ansible_facts['os_family'] == 'Darwin' - block: - - name: Check if Alloy is installed via Homebrew - ansible.builtin.command: brew list --versions {{ __alloy_brew_package }} - register: __brew_alloy_version - failed_when: false - changed_when: false - - - name: Extract current Alloy version on macOS - ansible.builtin.set_fact: - __current_deployed_version: - stdout: "{{ __brew_alloy_version.stdout }}" - when: __brew_alloy_version.rc == 0 - -- name: Include RedHat/Rocky setup - ansible.builtin.include_tasks: - file: setup-RedHat.yml - when: ansible_facts['os_family'] in ['RedHat', 'Rocky'] - -- name: Include Debian/Ubuntu setup - ansible.builtin.include_tasks: - file: setup-Debian.yml - when: ansible_facts['os_family'] == 'Debian' - -- name: Include macOS/Darwin setup - ansible.builtin.include_tasks: - file: setup-Darwin.yml - when: ansible_facts['os_family'] == 'Darwin' - -- name: Include SUSE setup - ansible.builtin.include_tasks: - file: setup-Suse.yml - when: ansible_facts['os_family'] == 'Suse' - -- name: Alloy systemd override - when: - - alloy_systemd_override | length > 0 - - ansible_facts['os_family'] in ['RedHat', 'Debian', 'Suse'] - block: - - name: Ensure that Alloy systemd override path exist - ansible.builtin.file: - path: "/etc/systemd/system/alloy.service.d" - state: directory - owner: "root" - group: "root" - mode: "0750" - notify: restart alloy - - - name: Template Alloy systemd override.conf - /etc/systemd/system/alloy.service.d/override.conf - ansible.builtin.template: - src: "override.conf.j2" - dest: "/etc/systemd/system/alloy.service.d/override.conf" - owner: "root" - group: "root" - mode: "0644" - notify: restart alloy - -- name: Template Alloy env file - {{ __alloy_env_file }} - ansible.builtin.template: - src: "alloy.j2" - dest: "{{ __alloy_env_file }}" - owner: "root" - group: "root" - mode: "0644" - notify: restart alloy - when: ansible_facts['os_family'] in ['RedHat', 'Debian', 'Suse'] - -- name: Template Alloy config - /etc/alloy/config.alloy - ansible.builtin.template: - src: "config.alloy.j2" - dest: "/etc/alloy/config.alloy" - owner: "root" - group: "root" - mode: "0644" - when: - - alloy_config | length > 0 - - alloy_env_file_vars.CONFIG_FILE is not defined - - ansible_facts['os_family'] in ['RedHat', 'Debian', 'Suse'] - notify: restart alloy - -- name: Ensure that /etc/alloy/alloy.config is absent when a custom configuration file/dir is specified in alloy_env_file_vars.CONFIG_FILE - ansible.builtin.file: - path: "/etc/alloy/config.alloy" - state: absent - when: - - alloy_config | length < 1 or alloy_env_file_vars.CONFIG_FILE is defined - - ansible_facts['os_family'] in ['RedHat', 'Debian', 'Suse'] - -- name: Add the Alloy system user to additional group - ansible.builtin.user: - name: "alloy" - groups: "{{ item }}" - system: true - append: true - create_home: false - state: present - loop: "{{ alloy_user_groups }}" - when: - - alloy_user_groups | length > 0 - - ansible_facts['os_family'] in ['RedHat', 'Debian', 'Suse'] - -- name: Get firewalld state - ansible.builtin.systemd: - name: "firewalld" - register: __firewalld_service_state - when: ansible_facts['os_family'] in ['RedHat', 'Debian', 'Suse'] - -- name: Enable firewalld rule to expose Alloy tcp port {{ __alloy_server_http_listen_port }} - ansible.posix.firewalld: - immediate: true - permanent: true - port: "{{ __alloy_server_http_listen_port }}/tcp" - state: enabled - when: - - ansible_facts['os_family'] in ['RedHat', 'Debian', 'Suse'] - - __firewalld_service_state.status.ActiveState == "active" - - alloy_expose_port | bool - -- name: Flush handlers after deployment - ansible.builtin.meta: flush_handlers - -- name: Ensure that Alloy is started (Linux) - ansible.builtin.systemd: - name: alloy.service - state: started - when: - - not ansible_check_mode - - ansible_facts['os_family'] in ['RedHat', 'Debian', 'Suse'] - -- name: Verify that Alloy URL is responding - ansible.builtin.uri: - url: "{{ alloy_readiness_check_use_https | ansible.builtin.ternary('https', 'http') }}://{{ __alloy_server_http_listen_address }}:{{ __alloy_server_http_listen_port }}/-/ready" - method: GET - use_proxy: "{{ alloy_readiness_check_use_proxy | bool }}" - register: __alloy_verify_url_status_code - retries: 5 - delay: 8 - until: __alloy_verify_url_status_code.status == 200 - when: - - not ansible_check_mode - - ansible_facts['os_family'] in ['RedHat', 'Debian', 'Suse'] diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/main.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/main.yml deleted file mode 100644 index e5c2462..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/tasks/main.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -# tasks file for alloy -- name: Include OS specific variables - ansible.builtin.include_vars: - file: "{{ ansible_facts['os_family'] }}.yml" - -- name: Preflight - ansible.builtin.include_tasks: - file: "preflight.yml" - -- name: Deploy Alloy service - ansible.builtin.include_tasks: - file: "deploy.yml" - when: not alloy_uninstall - -- name: Uninstall Alloy service - ansible.builtin.include_tasks: - file: "uninstall.yml" - when: alloy_uninstall diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/preflight.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/preflight.yml deleted file mode 100644 index 355a2a6..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/tasks/preflight.yml +++ /dev/null @@ -1,26 +0,0 @@ ---- -- name: Fail when alloy_config or alloy_env_file_vars.CONFIG_FILE is not defined - ansible.builtin.fail: - msg: Variable alloy_config or alloy_env_file_vars.CONFIG_FILE is required! - when: - - alloy_config | length < 1 - - alloy_env_file_vars.CONFIG_FILE is not defined - - not alloy_uninstall - -- name: Extract IP address and PORT from alloy_env_file_vars - when: alloy_env_file_vars.CUSTOM_ARGS is defined and alloy_env_file_vars.CUSTOM_ARGS | length > 0 - block: - - name: Search for server.http.listen-addr string - ansible.builtin.set_fact: - __alloy_server_http_listen_addr_regex: "{{ alloy_env_file_vars.CUSTOM_ARGS | regex_search('--server.http.listen-addr=([\\d\\.]+):(\\d+)', '\\1', '\\2') or [] }}" - - - name: Extract IP address and port - ansible.builtin.set_fact: - __alloy_server_http_listen_address: "{{ __alloy_server_http_listen_addr_regex[0] }}" - __alloy_server_http_listen_port: "{{ __alloy_server_http_listen_addr_regex[1] }}" - when: __alloy_server_http_listen_addr_regex | length > 0 - - - name: Assert that extracted IP address is valid - ansible.builtin.assert: - that: (__alloy_server_http_listen_address | ansible.utils.ipaddr) != "" - when: __alloy_server_http_listen_addr_regex | length > 0 diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-Darwin.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-Darwin.yml deleted file mode 100644 index 40839ba..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-Darwin.yml +++ /dev/null @@ -1,96 +0,0 @@ ---- -- name: Check if Homebrew is installed - ansible.builtin.command: which brew - register: __brew_check - changed_when: false - failed_when: false - -- name: Fail if Homebrew is not installed - ansible.builtin.fail: - msg: "Homebrew is required but not installed" - when: __brew_check.rc != 0 - -- name: Get Homebrew prefix - ansible.builtin.command: brew --prefix - register: __brew_prefix - changed_when: false - -- name: Set Alloy config directory path - ansible.builtin.set_fact: - __alloy_config_path: "{{ __alloy_config_path_default }}" - -- name: Add Grafana tap to Homebrew - community.general.homebrew_tap: - name: "{{ __alloy_brew_tap }}" - state: present - -- name: Install Alloy via Homebrew - community.general.homebrew: - name: "{{ __alloy_brew_package }}" - state: present - update_homebrew: true - -- name: Ensure Alloy config directory exists - ansible.builtin.file: - path: "{{ __alloy_config_path }}" - state: directory - owner: "{{ ansible_user_id }}" - group: "{{ ansible_user_gid }}" - mode: '0755' - -- name: Template Alloy config - ansible.builtin.template: - src: "config.alloy.j2" - dest: "{{ __alloy_config_path }}/config.alloy" - owner: "{{ ansible_user_id }}" - group: "{{ ansible_user_gid }}" - mode: '0644' - backup: true - when: alloy_config | length > 0 - notify: restart alloy macos - -- name: Check if Alloy service is loaded - ansible.builtin.command: brew services list - register: __brew_services - changed_when: false - -- name: Stop Alloy service if it exists (to clean up any issues) - ansible.builtin.command: "brew services stop {{ __alloy_brew_package }}" - register: __stop_result - failed_when: false - changed_when: "'Successfully stopped' in __stop_result.stdout" - when: "'alloy' in __brew_services.stdout" - -- name: Start Alloy service - ansible.builtin.command: "brew services start {{ __alloy_brew_package }}" - when: - - "'alloy' not in __brew_services.stdout or 'started' not in __brew_services.stdout" - register: __service_start - failed_when: __service_start.rc != 0 - -- name: Restart Alloy service if already running - ansible.builtin.command: "brew services restart {{ __alloy_brew_package }}" - when: - - "'alloy' in __brew_services.stdout and 'started' in __brew_services.stdout" - register: __service_restart - failed_when: __service_restart.rc != 0 - -- name: Check final service status - ansible.builtin.command: brew services list - register: __final_brew_services - changed_when: false - -- name: Verify Alloy installation - ansible.builtin.command: alloy --version - register: __alloy_version_output - changed_when: false - failed_when: false - -- name: Display Alloy version - ansible.builtin.debug: - msg: "Alloy version: {{ __alloy_version_output.stdout }}" - when: __alloy_version_output.rc == 0 - -- name: Display service status - ansible.builtin.debug: - msg: "Alloy service status: {{ __final_brew_services.stdout_lines | select('match', '.*alloy.*') | list }}" diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-Debian.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-Debian.yml deleted file mode 100644 index 7e380c0..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-Debian.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -- name: APT - Install Alloy - ansible.builtin.apt: - deb: "{{ alloy_download_url_deb }}" - state: present - notify: restart alloy - when: __current_deployed_version.stdout is not defined or alloy_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-RedHat.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-RedHat.yml deleted file mode 100644 index a394580..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-RedHat.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -- name: DNF - Install Alloy from remote URL - ansible.builtin.package: - name: "{{ alloy_download_url_rpm }}" - state: present - disable_gpg_check: true - notify: restart alloy - when: __current_deployed_version.stdout is not defined or alloy_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-Suse.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-Suse.yml deleted file mode 100644 index a68d668..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/tasks/setup-Suse.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -- name: Zypper - Install Alloy from remote URL - community.general.zypper: - name: "{{ alloy_download_url_rpm }}" - state: present - disable_gpg_check: true - notify: restart alloy - when: __current_deployed_version.stdout is not defined or alloy_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/alloy/tasks/uninstall.yml b/ansible_collections/grafana/grafana/roles/alloy/tasks/uninstall.yml deleted file mode 100644 index 529dfce..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/tasks/uninstall.yml +++ /dev/null @@ -1,75 +0,0 @@ ---- -- name: Stop Alloy service - ansible.builtin.systemd: # noqa ignore-errors - name: alloy - state: stopped - ignore_errors: true - -- name: Stop Alloy service on macOS - ansible.builtin.command: "brew services stop {{ __alloy_brew_package }}" - when: ansible_facts['os_family'] == 'Darwin' - failed_when: false - -- name: Uninstall Alloy rpm package - ansible.builtin.package: - name: "alloy" - state: absent - autoremove: true - when: ansible_facts['os_family'] in ['RedHat', 'Rocky'] - -- name: Uninstall Alloy deb package - ansible.builtin.apt: - name: "alloy" - state: absent - purge: true - when: ansible_facts['os_family'] == 'Debian' - -- name: Uninstall Alloy via Homebrew - community.general.homebrew: - name: "{{ __alloy_brew_package }}" - state: absent - when: ansible_facts['os_family'] == 'Darwin' - -- name: Uninstall Alloy rpm package (SUSE) - community.general.zypper: - name: "alloy" - state: absent - when: ansible_facts['os_family'] == 'Suse' - -- name: Ensure that Alloy firewalld rule is not present - tcp port {{ __alloy_server_http_listen_port }} - ansible.posix.firewalld: # noqa ignore-errors - immediate: true - permanent: true - port: "{{ __alloy_server_http_listen_port }}/tcp" - state: disabled - ignore_errors: true - -- name: Remove Alloy directories - ansible.builtin.file: - path: "{{ remove_me }}" - state: absent - loop: - - "/etc/alloy" - - "/etc/systemd/system/alloy.service.d" - - "/var/lib/alloy" - - "/etc/sysconfig/alloy" - - "/etc/default/alloy" - loop_control: - loop_var: remove_me - -- name: Remove Alloy config directory on macOS - ansible.builtin.file: - path: "{{ __alloy_config_path_default }}" - state: absent - when: ansible_facts['os_family'] == 'Darwin' - -- name: Remove the Alloy system user - ansible.builtin.user: - name: "alloy" - force: true - state: absent - -- name: Remove Alloy system group - ansible.builtin.group: - name: "alloy" - state: absent diff --git a/ansible_collections/grafana/grafana/roles/alloy/templates/alloy.j2 b/ansible_collections/grafana/grafana/roles/alloy/templates/alloy.j2 deleted file mode 100644 index ef131ab..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/templates/alloy.j2 +++ /dev/null @@ -1,10 +0,0 @@ -# Ansible Managed - -{% if alloy_env_file_vars.CONFIG_FILE is not defined or alloy_env_file_vars.CONFIG_FILE | length < 1 %} -CONFIG_FILE="/etc/alloy/config.alloy" -{% endif %} -RESTART_ON_UPGRADE=true - -{% for key, value in alloy_env_file_vars.items() %} -{{ key}}="{{value}}" -{% endfor %} diff --git a/ansible_collections/grafana/grafana/roles/alloy/templates/config.alloy.j2 b/ansible_collections/grafana/grafana/roles/alloy/templates/config.alloy.j2 deleted file mode 100644 index 8a6b406..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/templates/config.alloy.j2 +++ /dev/null @@ -1,3 +0,0 @@ -// Ansible Managed - -{{ alloy_config }} diff --git a/ansible_collections/grafana/grafana/roles/alloy/templates/override.conf.j2 b/ansible_collections/grafana/grafana/roles/alloy/templates/override.conf.j2 deleted file mode 100644 index 77f52b3..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/templates/override.conf.j2 +++ /dev/null @@ -1,3 +0,0 @@ -# Ansible Managed - -{{ alloy_systemd_override }} diff --git a/ansible_collections/grafana/grafana/roles/alloy/vars/Darwin.yml b/ansible_collections/grafana/grafana/roles/alloy/vars/Darwin.yml deleted file mode 100644 index 2af2116..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/vars/Darwin.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -# macOS/Darwin specific variables -__alloy_brew_tap: "grafana/grafana" -__alloy_brew_package: "grafana/grafana/alloy" -__alloy_config_path_default: "{{ __brew_prefix.stdout | default('/opt/homebrew') }}" diff --git a/ansible_collections/grafana/grafana/roles/alloy/vars/Debian.yml b/ansible_collections/grafana/grafana/roles/alloy/vars/Debian.yml deleted file mode 100644 index 67a544c..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/vars/Debian.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -__alloy_env_file: "/etc/default/alloy" diff --git a/ansible_collections/grafana/grafana/roles/alloy/vars/RedHat.yml b/ansible_collections/grafana/grafana/roles/alloy/vars/RedHat.yml deleted file mode 100644 index 4bf2225..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/vars/RedHat.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -__alloy_env_file: "/etc/sysconfig/alloy" diff --git a/ansible_collections/grafana/grafana/roles/alloy/vars/Suse.yml b/ansible_collections/grafana/grafana/roles/alloy/vars/Suse.yml deleted file mode 100644 index 4bf2225..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/vars/Suse.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -__alloy_env_file: "/etc/sysconfig/alloy" diff --git a/ansible_collections/grafana/grafana/roles/alloy/vars/main.yml b/ansible_collections/grafana/grafana/roles/alloy/vars/main.yml deleted file mode 100644 index 12e9900..0000000 --- a/ansible_collections/grafana/grafana/roles/alloy/vars/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -__alloy_server_http_listen_address: 127.0.0.1 -__alloy_server_http_listen_port: 12345 -__alloy_arch_map: - x86_64: 'amd64' - armv6l: 'arm' - armv7l: 'arm' - aarch64: 'arm64' -__alloy_arch: "{{ __alloy_arch_map[ansible_facts['architecture']] | default(ansible_facts['architecture']) }}" diff --git a/ansible_collections/grafana/grafana/roles/grafana/README.md b/ansible_collections/grafana/grafana/roles/grafana/README.md deleted file mode 100644 index 4addc32..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/README.md +++ /dev/null @@ -1,132 +0,0 @@ -

grafana logo

- -# Ansible Role: grafana.grafana.grafana - -[![License](https://img.shields.io/badge/license-MIT%20License-brightgreen.svg)](https://opensource.org/licenses/MIT) - -Provision and manage [Grafana](https://github.com/grafana/grafana) - platform for analytics and monitoring - -## Requirements - -- Ansible >= 2.9 (It might work on previous versions, but we cannot guarantee it) -- libselinux-python on deployer host (only when deployer machine has SELinux) -- Grafana >= 5.1 (for older Grafana versions use this role in version 0.10.1 or earlier) -- jmespath on deployer machine. If you are using Ansible from a Python virtualenv, install *jmespath* to the same virtualenv via pip. - -## Role Variables - -All variables which can be overridden are stored in [defaults/main.yml](defaults/main.yml) file as well as in table below. - -| Name | Default Value | Description | -| -------------- | ------------- | -----------------------------------| -| `grafana_use_provisioning` | true | Use Grafana provisioning capability when possible (**grafana_version=latest will assume >= 5.0**). | -| `grafana_provisioning_synced` | false | Ensure no previously provisioned dashboards are kept if not referenced anymore. | -| `grafana_version` | latest | Grafana package version | -| `grafana_manage_repo` | true | Manage package repository (or don't) | -| `grafana_yum_repo` | https://rpm.grafana.com | Yum repository URL | -| `grafana_yum_key` | https://rpm.grafana.com/gpg.key | Yum repository gpg key | -| `grafana_rhsm_subscription` | | rhsm subscription name (redhat subscription-manager) | -| `grafana_rhsm_repo` | | rhsm repository name (redhat subscription-manager) | -| `grafana_apt_release_channel` | stable | Apt release chanel (stable or beta) | -| `grafana_apt_arch` | {{ 'arm64' if ansible_facts['architecture'] == 'aarch64' else 'amd64' }} | Apt architecture | -| `grafana_apt_repo` | deb [arch={{ grafana_apt_arch }} signed-by=/usr/share/keyrings/grafana.asc] https://apt.grafana.com/ {{ grafana_apt_release_channel }} main | Apt repository string | -| `grafana_apt_key` | https://apt.grafana.com/gpg.key | Apt repository gpg key | -| `grafana_ini.instance_name` | {{ ansible_facts['fqdn'] \| default(ansible_host) \| default(inventory_hostname) }} | Grafana instance name | -| `grafana_ini.paths.logs` | /var/log/grafana | Path to logs directory | -| `grafana_ini.paths.data` | /var/lib/grafana | Path to database directory | -| `grafana_ini.server.http_addr` | 0.0.0.0 | Address on which Grafana listens | -| `grafana_ini.server.http_port` | 3000 | port on which Grafana listens | -| `grafana_cap_net_bind_service` | false | Enables the use of ports below 1024 without root privileges by leveraging the 'capabilities' of the linux kernel. read: http://man7.org/linux/man-pages/man7/capabilities.7.html | -| `grafana_ini.server.root_url` | "http://{{ grafana_ini.server.http_addr }}:{{ grafana_ini.server.http_port }}" | Full URL used to access Grafana from a web browser | -| `grafana_api_url` | "{{ grafana_url }}" | URL used for API calls in provisioning if different from public URL. See [this issue](https://github.com/cloudalchemy/ansible-grafana/issues/70). | -| `grafana_ini.server.domain` | "{{ ansible_facts['fqdn'] \| default(ansible_host) \| default('localhost') }}" | setting is only used in as a part of the `root_url` option. Useful when using GitHub or Google OAuth | -| `grafana_ini.server` | { protocol: http, enforce_domain: false, socket: "", cert_key: "", cert_file: "", enable_gzip: false, static_root_path: public, router_logging: false } | [server](http://docs.grafana.org/installation/configuration/#server) configuration section | -| `grafana_ini.security` | { admin_user: admin, admin_password: "" } | [security](http://docs.grafana.org/installation/configuration/#security) configuration section | -| `grafana_ini.database` | { type: sqlite3 } | [database](http://docs.grafana.org/installation/configuration/#database) configuration section | -| `grafana_ini.users` | { allow_sign_up: false, auto_assign_org_role: Viewer, default_theme: dark } | [users](http://docs.grafana.org/installation/configuration/#users) configuration section | -| `grafana_ini.auth` | {} | [authorization](http://docs.grafana.org/installation/configuration/#auth) configuration section | -| `grafana_ldap` | {} | [ldap](http://docs.grafana.org/installation/ldap/) configuration section. group_mappings are expanded, see defaults for example | -| `grafana_dashboards` | [] | List of dashboards which should be imported | -| `grafana_dashboards_dir` | "dashboards" | Path to a local directory containing dashboards files in `json` format | -| `grafana_datasources` | [] | List of datasources which should be configured | -| `grafana_environment` | {} | Optional Environment param for Grafana installation, useful ie for setting http_proxy | -| `grafana_plugins` | [] | List of Grafana plugins which should be installed | -| `grafana_alert_notifications` | [] | List of alert notification channels to be created, updated, or deleted | - -Data source example: - -```yaml -grafana_datasources: - - name: prometheus - type: prometheus - access: proxy - url: 'http://{{ prometheus_web_listen_address }}' - basicAuth: false -``` - -Dashboard example: - -```yaml -grafana_dashboards: - - dashboard_id: 111 - revision_id: 1 - datasource: prometheus -``` - -Alert notification channel example: - -**NOTE**: setting the variable `grafana_alert_notifications` will only come into -effect when `grafana_use_provisioning` is `true`. That means the new -provisioning system using config files, which is available starting from Grafana -v5.0, needs to be in use. - -```yaml -grafana_alert_notifications: - notifiers: - - name: Channel 1 - type: email - uid: channel1 - is_default: false - send_reminder: false - settings: - addresses: "example@example.com" - autoResolve: true - delete_notifiers: - - name: Channel 2 - uid: channel2 -``` - -## 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. - -## Example - -### Playbook - -Fill in the admin password field with your choice, the Grafana web page won't ask to change it at the first login. - -```yaml -- hosts: all - roles: - - role: grafana.grafana.grafana - vars: - grafana_ini: - security: - admin_user: admin - admin_password: enter_your_secure_password -``` - - -## Local Testing - -The preferred way of locally testing the role is to use Docker and [molecule](https://github.com/ansible-community/molecule). You will have to install Docker on your system. - -For more information about molecule go to their [docs](http://molecule.readthedocs.io/en/latest/). - -## License - -This project is licensed under MIT License. See [LICENSE](/LICENSE) for more details. - -## Credits -This role was migrated from [cloudalchemy.grafana](https://github.com/cloudalchemy/ansible-grafana). diff --git a/ansible_collections/grafana/grafana/roles/grafana/defaults/main.yml b/ansible_collections/grafana/grafana/roles/grafana/defaults/main.yml deleted file mode 100644 index ac1bfea..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/defaults/main.yml +++ /dev/null @@ -1,211 +0,0 @@ ---- -grafana_version: latest -grafana_manage_repo: true - -grafana_yum_repo: "https://rpm.grafana.com" -grafana_yum_key: "https://rpm.grafana.com/gpg.key" - -grafana_rhsm_subscription: "" -grafana_rhsm_repo: "" - -grafana_apt_release_channel: stable -grafana_apt_arch: "{{ 'arm64' if ansible_facts['architecture'] == 'aarch64' else 'amd64' }}" -grafana_apt_repo_uri: "https://apt.grafana.com/" -grafana_apt_repo: "deb [arch={{ grafana_apt_arch }} signed-by=/usr/share/keyrings/grafana.asc] {{ grafana_apt_repo_uri }} {{ grafana_apt_release_channel }} main" -grafana_apt_key: "https://apt.grafana.com/gpg.key" -grafana_apt_name: "grafana" - -# Should we use the provisioning capability when possible (provisioning require grafana >= 5.0) -grafana_use_provisioning: true - -# Should the provisioning be kept synced. If true, previous provisioned objects will be removed if not referenced anymore. -grafana_provisioning_synced: false - -# Should we provision dashboards by following the files structure. This sets the foldersFromFilesStructure option -grafana_provisioning_dashboards_from_file_structure: false - -# To enable the use of ports below 1024 for unprivileged processes linux needs to set CAP_NET_BIND_SERVICE. -# This has some security implications, and should be a conscious choice. -# Get informed by reading: http://man7.org/linux/man-pages/man7/capabilities.7.html -grafana_cap_net_bind_service: false - -grafana_ini_default: - instance_name: "{{ ansible_facts['fqdn'] | default(ansible_host) | default(inventory_hostname) }}" - - paths: - logs: "/var/log/grafana" - data: "/var/lib/grafana" - - server: - http_addr: "0.0.0.0" - http_port: 3000 - # External Grafana address. Variable maps to "root_url" in grafana server section - #root_url: "http://{{ grafana_ini.server.http_addr }}:{{ grafana_ini.server.http_port }}" - domain: "{{ ansible_facts['fqdn'] | default(ansible_host) | default('localhost') }}" - - # Additional options for grafana "server" section - # This section WILL omit options for: http_addr, http_port, domain, and root_url, as those settings are set by variables listed before - protocol: http - enforce_domain: false - socket: "" - cert_key: "" - cert_file: "" - enable_gzip: false - static_root_path: public - router_logging: false - serve_from_sub_path: false - - # Variables correspond to ones in grafana.ini configuration file - # Security - security: - admin_user: admin - admin_password: "" - # secret_key: "" - # login_remember_days: 7 - # cookie_username: grafana_user - # cookie_remember_name: grafana_remember - # disable_gravatar: true - # data_source_proxy_whitelist: - - # Database setup - database: - type: sqlite3 - # host: 127.0.0.1:3306 - # name: grafana - # user: root - # password: "" - # url: "" - # ssl_mode: disable - # path: grafana.db - # max_idle_conn: 2 - # max_open_conn: "" - # log_queries: "" - - # User management and registration - users: - allow_sign_up: false - # allow_org_create: true - # auto_assign_org: true - auto_assign_org_role: Viewer - # login_hint: "email or username" - default_theme: dark - # external_manage_link_url: "" - # external_manage_link_name: "" - # external_manage_info: "" - - # grafana authentication mechanisms - auth: {} - # disable_login_form: false - # oauth_auto_login: false - # disable_signout_menu: false - # signout_redirect_url: "" - # anonymous: - # org_name: "Main Organization" - # org_role: Viewer - # ldap: - # config_file: "/etc/grafana/ldap.toml" - # allow_sign_up: false - # basic: - # enabled: true - - -grafana_api_url: "{{ grafana_ini.server.root_url }}" - -grafana_ldap: {} -# verbose_logging: false -# servers: -# host: 127.0.0.1 -# port: 389 # 636 for SSL -# use_ssl: false -# start_tls: false -# ssl_skip_verify: false -# root_ca_cert: /path/to/certificate.crt -# bind_dn: "cn=admin,dc=grafana,dc=org" -# bind_password: grafana -# search_filter: "(cn=%s)" # "(sAMAccountName=%s)" on AD -# search_base_dns: -# - "dc=grafana,dc=org" -# group_search_filter: "(&(objectClass=posixGroup)(memberUid=%s))" -# group_search_base_dns: -# - "ou=groups,dc=grafana,dc=org" -# attributes: -# name: givenName -# surname: sn -# username: sAMAccountName -# member_of: memberOf -# email: mail -# group_mappings: -# - name: Main Org. -# id: 1 -# groups: -# - group_dn: "cn=admins,ou=groups,dc=grafana,dc=org" -# org_role: Admin -# - group_dn: "cn=editors,ou=groups,dc=grafana,dc=org" -# org_role: Editor -# - group_dn: "*" -# org_role: Viewer -# - name: Alternative Org -# id: 2 -# groups: -# - group_dn: "cn=alternative_admins,ou=groups,dc=grafana,dc=org" -# org_role: Admin - -####### -# Plugins to install from https://grafana.com/plugins -grafana_plugins: [] -# - raintank-worldping-app - -# Dashboards from https://grafana.com/dashboards -grafana_dashboards: [] -# - dashboard_id: '4271' -# revision_id: '3' -# datasource: 'Prometheus' -# - dashboard_id: '1860' -# revision_id: '4' -# datasource: 'Prometheus' -# - dashboard_id: '358' -# revision_id: '1' -# datasource: 'Prometheus' - -grafana_dashboards_dir: "dashboards" - -# Alert notification channels to configure -grafana_alert_notifications: [] -# - name: "Email Alert" -# type: "email" -# uid: channel1 -# is_default: true -# settings: -# addresses: "example@example.com" - -# Alert resources channels to configure -grafana_alert_resources: {} - -# Datasources to configure -grafana_datasources: [] -# - name: "Prometheus" -# type: "prometheus" -# access: "proxy" -# url: "http://prometheus.mydomain" -# basicAuth: true -# basicAuthUser: "admin" -# basicAuthPassword: "password" -# isDefault: true -# jsonData: -# tlsAuth: false -# tlsAuthWithCACert: false -# tlsSkipVerify: true - -# API keys to configure -grafana_api_keys: [] -# - name: "admin" -# role: "Admin" -# - name: "viewer" -# role: "Viewer" -# - name: "editor" -# role: "Editor" - -# The location where the keys should be stored. -grafana_api_keys_dir: "{{ lookup('env', 'HOME') }}/grafana/keys" - -grafana_environment: {} diff --git a/ansible_collections/grafana/grafana/roles/grafana/handlers/main.yml b/ansible_collections/grafana/grafana/roles/grafana/handlers/main.yml deleted file mode 100644 index b00b2f2..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/handlers/main.yml +++ /dev/null @@ -1,48 +0,0 @@ ---- -- name: "Restart grafana" - ansible.builtin.service: - name: grafana-server - state: restarted - become: true - listen: "restart_grafana" - tags: - - grafana_run - -- name: "Set privileges on provisioned dashboards" - ansible.builtin.file: - path: "{{ grafana_ini.paths.data }}/dashboards" - recurse: true - owner: "grafana" - group: "grafana" - mode: "u=rwX,g=rX,o=rX" - become: true - listen: "provisioned dashboards changed" - -- name: "Set privileges on provisioned dashboards directory" - ansible.builtin.file: - path: "{{ grafana_ini.paths.data }}/dashboards" - state: "directory" - recurse: false - mode: "0755" - become: true - listen: "provisioned dashboards changed" - -- name: "Find dashboards subdirectories" - ansible.builtin.find: - paths: "{{ grafana_ini.paths.data }}/dashboards" - recurse: yes - file_type: directory - register: __dashboards_subdirs - become: true - listen: "provisioned dashboards changed" - -- name: "Set privileges on provisioned dashboards sub-directories" - ansible.builtin.file: - path: "{{ item }}" - state: "directory" - recurse: false - mode: "0755" - with_items: - - "{{ __dashboards_subdirs.files | map(attribute='path') | list }}" - become: true - listen: "provisioned dashboards changed" diff --git a/ansible_collections/grafana/grafana/roles/grafana/meta/main.yml b/ansible_collections/grafana/grafana/roles/grafana/meta/main.yml deleted file mode 100644 index a8dbc33..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/meta/main.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- -galaxy_info: - author: "Grafana" - description: "Grafana - platform for analytics and monitoring" - license: "GPL-3.0-or-later" - 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 diff --git a/ansible_collections/grafana/grafana/roles/grafana/molecule/alternative/converge.yml b/ansible_collections/grafana/grafana/roles/grafana/molecule/alternative/converge.yml deleted file mode 100644 index b835032..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/molecule/alternative/converge.yml +++ /dev/null @@ -1,107 +0,0 @@ ---- -- name: "Run role" - hosts: all - any_errors_fatal: true - roles: - - grafana.grafana.grafana - vars: - grafana_version: 6.2.5 - grafana_ini: - security: - admin_user: admin - admin_password: "password" - server: - http_addr: "127.0.0.1" - auth: - login_maximum_inactive_lifetime_days: 42 - disable_login_form: false - oauth_auto_login: false - disable_signout_menu: false - signout_redirect_url: "" - anonymous: - org_name: "Main Organization" - org_role: Viewer - ldap: - config_file: "/etc/grafana/ldap.toml" - allow_sign_up: false - basic: - enabled: true - log: - mode: syslog - level: warn - grafana_ldap: - verbose_logging: false - servers: - host: 127.0.0.1 - port: 389 - use_ssl: false - start_tls: false - ssl_skip_verify: false - root_ca_cert: /path/to/certificate.crt - bind_dn: "cn=admin,dc=grafana,dc=org" - bind_password: grafana - search_filter: "(cn=%s)" - search_base_dns: - - "dc=grafana,dc=org" - group_search_filter: "(&(objectClass=posixGroup)(memberUid=%s))" - group_search_base_dns: - - "ou=groups,dc=grafana,dc=org" - attributes: - name: givenName - surname: sn - username: sAMAccountName - member_of: memberOf - email: mail - group_mappings: - - name: "Main Organization" - id: 1 - groups: - - group_dn: "cn=admins,ou=groups,dc=grafana,dc=org" - org_role: Admin - - group_dn: "cn=editors,ou=groups,dc=grafana,dc=org" - org_role: Editor - - group_dn: "*" - org_role: Viewer - - name: "Alternative Org" - id: 2 - groups: - - group_dn: "cn=alternative_admins,ou=groups,dc=grafana,dc=org" - org_role: Admin - grafana_api_keys: - - name: "admin" - role: "Admin" - - name: "viewer" - role: "Viewer" - - name: "editor" - role: "Editor" - grafana_api_keys_dir: "/tmp/grafana/keys" - grafana_plugins: - - raintank-worldping-app - grafana_alert_notifications: - notifiers: - - name: "Email Alert" - type: "email" - uid: notifier1 - is_default: true - settings: - addresses: "example@example.com" - grafana_dashboards: - - dashboard_id: '1860' - revision_id: '4' - datasource: 'Prometheus' - - dashboard_id: '358' - revision_id: '1' - datasource: 'Prometheus' - grafana_datasources: - - name: "Prometheus" - type: "prometheus" - access: "proxy" - url: "http://prometheus.mydomain" - basicAuth: true - basicAuthUser: "admin" - basicAuthPassword: "password" - isDefault: true - jsonData: - tlsAuth: false - tlsAuthWithCACert: false - tlsSkipVerify: true diff --git a/ansible_collections/grafana/grafana/roles/grafana/molecule/alternative/molecule.yml b/ansible_collections/grafana/grafana/roles/grafana/molecule/alternative/molecule.yml deleted file mode 100644 index ed97d53..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/molecule/alternative/molecule.yml +++ /dev/null @@ -1 +0,0 @@ ---- diff --git a/ansible_collections/grafana/grafana/roles/grafana/molecule/alternative/tests/test_alternative.py b/ansible_collections/grafana/grafana/roles/grafana/molecule/alternative/tests/test_alternative.py deleted file mode 100644 index cf6476b..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/molecule/alternative/tests/test_alternative.py +++ /dev/null @@ -1,52 +0,0 @@ -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/grafana", - "/var/log/grafana", - "/var/lib/grafana", - "/var/lib/grafana/dashboards", - "/var/lib/grafana/plugins", - "/var/lib/grafana/plugins/raintank-worldping-app" - ] - files = [ - "/etc/grafana/grafana.ini", - "/etc/grafana/ldap.toml" - ] - 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("grafana-server") - # assert s.is_enabled - assert s.is_running - - -def test_packages(host): - p = host.package("grafana") - assert p.is_installed - assert p.version == "6.2.5" - - -def test_socket(host): - assert host.socket("tcp://127.0.0.1:3000").is_listening - - -def test_custom_auth_option(host): - f = host.file("/etc/grafana/grafana.ini") - assert f.contains("login_maximum_inactive_lifetime_days = 42") diff --git a/ansible_collections/grafana/grafana/roles/grafana/molecule/default/converge.yml b/ansible_collections/grafana/grafana/roles/grafana/molecule/default/converge.yml deleted file mode 100644 index 29b6229..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/molecule/default/converge.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- name: "Run role" - hosts: all - any_errors_fatal: true - roles: - - grafana.grafana.grafana - vars: - grafana_ini: - security: - admin_user: admin - admin_password: password diff --git a/ansible_collections/grafana/grafana/roles/grafana/molecule/default/molecule.yml b/ansible_collections/grafana/grafana/roles/grafana/molecule/default/molecule.yml deleted file mode 100644 index ed97d53..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/molecule/default/molecule.yml +++ /dev/null @@ -1 +0,0 @@ ---- diff --git a/ansible_collections/grafana/grafana/roles/grafana/molecule/default/tests/test_default.py b/ansible_collections/grafana/grafana/roles/grafana/molecule/default/tests/test_default.py deleted file mode 100644 index 67363a3..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/molecule/default/tests/test_default.py +++ /dev/null @@ -1,50 +0,0 @@ -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/grafana", - "/var/log/grafana", - "/var/lib/grafana", - "/var/lib/grafana/dashboards", - "/var/lib/grafana/plugins" - ] - files = [ - "/etc/grafana/grafana.ini" - ] - 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("grafana-server") - # assert s.is_enabled - assert s.is_running - - -def test_packages(host): - p = host.package("grafana") - assert p.is_installed - - -def test_socket(host): - assert host.socket("tcp://0.0.0.0:3000").is_listening - - -def test_yum_repo(host): - if host.system_info.distribution in ['centos', 'redhat', 'fedora']: - f = host.file("/etc/yum.repos.d/grafana.repo") - assert f.exists diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/api_keys.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/api_keys.yml deleted file mode 100644 index d54f4e3..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/api_keys.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -- name: "Ensure grafana key directory exists" - ansible.builtin.file: - path: "{{ grafana_api_keys_dir }}/{{ inventory_hostname }}" - state: directory - mode: "0755" - become: false - delegate_to: localhost - -- name: "Check api key list" - ansible.builtin.uri: - url: "{{ grafana_api_url }}/api/auth/keys" - user: "{{ grafana_ini.security.admin_user }}" - password: "{{ grafana_ini.security.admin_password }}" - force_basic_auth: true - return_content: true - register: __existing_api_keys - no_log: "{{ 'false' if lookup('env', 'CI') else 'true' }}" - -- name: "Create grafana api keys" - ansible.builtin.uri: - url: "{{ grafana_api_url }}/api/auth/keys" - user: "{{ grafana_ini.security.admin_user }}" - password: "{{ grafana_ini.security.admin_password }}" - force_basic_auth: true - method: POST - body_format: json - body: "{{ item | to_json }}" - loop: "{{ grafana_api_keys }}" - register: __new_api_keys - no_log: "{{ 'false' if lookup('env', 'CI') else 'true' }}" - when: "((__existing_api_keys['json'] | selectattr('name', 'equalto', item['name'])) | list) | length == 0" - -- name: "Create api keys file to allow the keys to be seen and used by other automation" - ansible.builtin.copy: - dest: "{{ grafana_api_keys_dir }}/{{ inventory_hostname }}/{{ item['item']['name'] }}.key" - content: "{{ item['json']['key'] }}" - backup: false - mode: "0644" - loop: "{{ __new_api_keys['results'] }}" - become: false - delegate_to: localhost - when: "item['json'] is defined" diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/configure.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/configure.yml deleted file mode 100644 index b434cdc..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/configure.yml +++ /dev/null @@ -1,107 +0,0 @@ ---- -- name: "Ensure grafana directories exist" - ansible.builtin.file: - path: "{{ item.path }}" - state: "directory" - owner: "{{ item.owner | default('root') }}" - group: "{{ item.group | default('grafana') }}" - mode: "{{ item.mode | default('0755') }}" - loop: - - path: "/etc/grafana" - - path: "/etc/grafana/datasources" - - path: "/etc/grafana/provisioning" - - path: "/etc/grafana/provisioning/datasources" - - path: "/etc/grafana/provisioning/dashboards" - - path: "/etc/grafana/provisioning/notifiers" - - path: "/etc/grafana/provisioning/notification" - - path: "/etc/grafana/provisioning/plugins" - - path: "/etc/grafana/provisioning/alerting" - - path: "{{ grafana_ini.paths.logs }}" - owner: grafana - - path: "{{ grafana_ini.paths.data }}" - owner: grafana - - path: "{{ grafana_ini.paths.data }}/dashboards" - owner: grafana - - path: "{{ grafana_ini.paths.data }}/plugins" - owner: grafana - -- name: "Create grafana main configuration file" - ansible.builtin.template: - src: "grafana.ini.j2" - dest: "/etc/grafana/grafana.ini" - owner: "root" - group: "grafana" - mode: "0640" - no_log: "{{ 'false' if lookup('env', 'CI') else 'true' }}" - notify: restart_grafana - -- name: "Create grafana LDAP configuration file" - ansible.builtin.template: - src: "ldap.toml.j2" - dest: "{{ grafana_ini.auth.ldap.config_file | default('/etc/grafana/ldap.toml') }}" - owner: "root" - group: "grafana" - mode: "0640" - no_log: "{{ 'false' if lookup('env', 'CI') else 'true' }}" - notify: restart_grafana - when: - - "'ldap' in grafana_ini.auth" - - "'enabled' not in grafana_ini.auth.ldap or grafana_ini.auth.ldap.enabled" - -- name: "Enable grafana socket" - when: - - "grafana_ini.server.protocol is defined and grafana_ini.server.protocol == 'socket'" - - "grafana_ini.server.socket | dirname != '/var/run'" - block: - - name: "Create grafana socket directory" - ansible.builtin.file: - path: "{{ grafana_ini.server.socket | dirname }}" - state: "directory" - mode: "0775" - owner: "grafana" - group: "grafana" - - - name: "Ensure grafana socket directory created on startup" - ansible.builtin.template: - src: "tmpfiles.j2" - dest: "/etc/tmpfiles.d/grafana.conf" - owner: "root" - group: "root" - mode: "0644" - -- name: "Enable grafana to ports lower than port 1024" - community.general.capabilities: - path: /usr/sbin/grafana-server - capability: CAP_NET_BIND_SERVICE+ep - state: present - when: - - "grafana_ini.server.http_port | int <= 1024" - - "grafana_cap_net_bind_service" - -- name: Create a directory for overrides.conf unit file if it does not exist - ansible.builtin.file: - path: /etc/systemd/system/grafana-server.service.d - state: directory - mode: '0755' - when: - - "grafana_ini.server.http_port | int <= 1024" - - "grafana_cap_net_bind_service" - -- name: "Enable grafana to ports lower than port 1024 in systemd unitfile" - ansible.builtin.blockinfile: - path: /etc/systemd/system/grafana-server.service.d/overrides.conf - create: true - block: | - [Service] - AmbientCapabilities=CAP_NET_BIND_SERVICE - CapabilityBoundingSet=CAP_NET_BIND_SERVICE - when: - - "grafana_ini.server.http_port | int <= 1024" - - "grafana_cap_net_bind_service" - -- name: "Enable and start Grafana systemd unit" - ansible.builtin.systemd: - name: "grafana-server" - enabled: true - state: started - daemon_reload: true diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/dashboards.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/dashboards.yml deleted file mode 100644 index a5dcb98..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/dashboards.yml +++ /dev/null @@ -1,245 +0,0 @@ ---- -- name: "Create local grafana dashboard directory" - become: false - delegate_to: localhost - run_once: true - ansible.builtin.tempfile: - state: directory - register: __tmp_dashboards - changed_when: false - check_mode: false - -- name: "Download grafana.net dashboards" - become: false - delegate_to: localhost - when: - - not ansible_check_mode - - "grafana_dashboards | length > 0" - block: - - name: "Get latest revision id" - ansible.builtin.uri: - url: "https://grafana.com/api/dashboards/{{ item.dashboard_id }}" - method: GET - return_content: yes - register: __dashboard_info - loop: "{{ grafana_dashboards }}" - when: item.dashboard_url is not defined - - - name: "Extract revision_id if not defined in grafana_dashboards" - ansible.builtin.set_fact: - __dashboards_with_revision: >- - {{ - __dashboard_info.results | map(attribute='json.revision') - | map('default', 1) | map('community.general.dict_kv', 'revision_id') - | zip(grafana_dashboards) | map('combine') - }} - - - name: "Download grafana dashboard from grafana.net to local directory" - ansible.builtin.get_url: - url: "{{ item.dashboard_url if item.dashboard_url is defined else - ('https://grafana.com/api/dashboards/' ~ item.dashboard_id ~ - '/revisions/' ~ item.revision_id | default(1) ~ '/download') }}" - dest: "{{ __tmp_dashboards.path }}/{{ item.dashboard_id ~ '.json' - if item.dashboard_id is defined else item.dashboard_url | basename}}" - mode: "0644" - register: __download_dashboards - until: "__download_dashboards is succeeded" - retries: 5 - delay: 2 - changed_when: false - loop: "{{ __dashboards_with_revision }}" - - # As noted in [1] an exported dashboard replaces the exporter's datasource - # name with a representative name, something like 'DS_GRAPHITE'. The name - # is different for each datasource plugin, but always begins with 'DS_'. - # In the rest of the data, the same name is used, but captured in braces, - # for example: '${DS_GRAPHITE}'. - # - # [1] http://docs.grafana.org/reference/export_import/#import-sharing-with-grafana-2-x-or-3-0 - # - # The data structure looks (massively abbreviated) something like: - # - # "name": "DS_GRAPHITE", - # "datasource": "${DS_GRAPHITE}", - # - # If we import the downloaded dashboard verbatim, it will not automatically - # be connected to the data source like we want it. The Grafana UI expects - # us to do the final connection by hand, which we do not want to do. - # So, in the below task we ensure that we replace instances of this string - # with the data source name we want. - # To make sure that we're not being too greedy with the regex replacement - # of the data source to use for each dashboard that's uploaded, we make the - # regex match very specific by using the following: - # - # 1. Literal boundaries for " on either side of the match. - # 2. Non-capturing optional group matches for the ${} bits which may, or - # or may not, be there.. - # 3. A case-sensitive literal match for DS . - # 4. A one-or-more case-sensitive match for the part that follows the - # underscore, with only A-Z, 0-9 and - or _ allowed. - # - # This regex can be tested and understood better by looking at the - # matches and non-matches in https://regex101.com/r/f4Gkvg/6 - - - name: "Set the correct data source name in the dashboard" - ansible.builtin.replace: - dest: "{{ item.dest }}" - regexp: '"(?:\${)?DS_[A-Z0-9_-]+(?:})?"' - replace: '"{{ item.item.datasource }}"' - changed_when: false - loop: "{{ __download_dashboards.results }}" - loop_control: - label: "{{ item.item }}" - -- name: "Import grafana dashboards via api" - community.grafana.grafana_dashboard: - grafana_url: "{{ grafana_api_url }}" - grafana_user: "{{ grafana_ini.security.admin_user }}" - grafana_password: "{{ grafana_ini.security.admin_password }}" - path: "{{ item }}" - commit_message: "Updated by ansible role {{ ansible_role_name }}" - state: present - overwrite: true - no_log: "{{ 'false' if lookup('env', 'CI') else 'true' }}" - with_fileglob: - - "{{ __tmp_dashboards.path }}/*" - - "{{ grafana_dashboards_dir }}/*.json" - when: "not grafana_use_provisioning" - -- name: "Import grafana dashboards through provisioning" - when: grafana_use_provisioning - block: - - name: "Create/Update dashboards file (provisioning)" - ansible.builtin.copy: - dest: "/etc/grafana/provisioning/dashboards/ansible.yml" - content: | - apiVersion: 1 - providers: - - name: 'default' - orgId: 1 - folder: '' - type: file - options: - path: "{{ grafana_ini.paths.data }}/dashboards" - foldersFromFilesStructure: {{ grafana_provisioning_dashboards_from_file_structure | bool | to_nice_yaml }} - backup: false - owner: root - group: grafana - mode: "0640" - become: true - notify: restart_grafana - - - name: "Register previously copied dashboards" - ansible.builtin.find: - paths: "{{ grafana_ini.paths.data }}/dashboards" - hidden: true - recurse: true - patterns: - - "*.json" - register: __dashboards_present - when: grafana_provisioning_synced | bool - - - name: "Register previously created folders" - ansible.builtin.find: - paths: "{{ grafana_ini.paths.data }}/dashboards/" - recurse: yes - file_type: directory - register: __dashboards_dir_present - become: true - when: grafana_provisioning_synced - - - name: "Import grafana.net dashboards" - ansible.builtin.copy: - src: "{{ item }}" - dest: "{{ grafana_ini.paths.data }}/dashboards/{{ item | basename }}" - owner: root - group: grafana - mode: "0644" - with_fileglob: - - "{{ __tmp_dashboards.path }}/*" - become: true - register: __dashboards_copied - notify: "provisioned dashboards changed" - when: not ansible_check_mode - - - name: "Verify if custom grafana dashboards dir exist" - ansible.builtin.stat: - path: "{{ grafana_dashboards_dir }}" - delegate_to: localhost - become: false - register: __grafana_custom_dashboards_dir - - - name: "Import custom grafana dashboards" - when: __grafana_custom_dashboards_dir.stat.exists - block: - - name: "Find which directories to create" - ansible.builtin.find: - paths: "{{ grafana_dashboards_dir }}/" - recurse: yes - file_type: directory - register: __dashboards_subdirs - delegate_to: localhost - become: false - - - name: "Create dashboard folders" - ansible.builtin.file: - path: "{{ grafana_ini.paths.data }}/dashboards/{{ item }}" - state: "directory" - recurse: false - owner: "grafana" - group: "grafana" - mode: "0755" - loop: "{{ __dashboards_subdirs.files | map(attribute='path') | sort | regex_replace(grafana_dashboards_dir + '/*', '') }}" - become: true - register: __dashboards_dir_created - when: not ansible_check_mode - - - name: "Copy dashboard files" - ansible.builtin.copy: - src: "{{ item.path }}" - dest: '{{ grafana_ini.paths.data }}/dashboards/{{ item.path | regex_replace(grafana_dashboards_dir + "/*", "") }}' - owner: root - group: grafana - mode: "0644" - loop: "{{ __found_dashboards.files | default([]) }}" - become: true - register: __dashboards_copied_custom - notify: "provisioned dashboards changed" - when: not ansible_check_mode - - - name: "Register present and copied folders list" - ansible.builtin.set_fact: - __folders_present_list: "{{ __dashboards_dir_present.files | default([]) | map(attribute='path') | list }}" - __folders_copied_list: "{{ __dashboards_dir_created.results | default([]) | map(attribute='path') | list }}" - when: not ansible_check_mode - - - name: "Register present and copied dashboards list" - ansible.builtin.set_fact: - __dashboards_present_list: "{{ __dashboards_present.files | default([]) | map(attribute='path') | list }}" - __dashboards_copied_list: "{{ - ( - (__dashboards_copied.results | default([]) | map(attribute='dest') | list) + - (__dashboards_copied_custom.results | default([]) | map(attribute='dest') | list) - ) | list - }}" - when: not ansible_check_mode - - - name: "Remove dashboards not present on deployer machine (synchronize)" - ansible.builtin.file: - path: "{{ item }}" - state: absent - loop: "{{ __dashboards_present_list | difference(__dashboards_copied_list) }}" - become: true - when: - - __dashboards_present_list is defined and __dashboards_present_list - - __dashboards_copied_list is defined and __dashboards_copied_list - - grafana_provisioning_synced | bool - - not ansible_check_mode - - - name: "Remove folders not present on deployer machine (synchronize)" - ansible.builtin.file: - path: "{{ item }}" - state: absent - loop: "{{ __folders_present_list | difference(__folders_copied_list) }}" - become: true - when: grafana_provisioning_synced and not ansible_check_mode diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/datasources.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/datasources.yml deleted file mode 100644 index bcd2457..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/datasources.yml +++ /dev/null @@ -1,40 +0,0 @@ ---- -- name: "Ensure datasources exist (via API)" - community.grafana.grafana_datasource: - grafana_url: "{{ grafana_api_url }}" - grafana_user: "{{ grafana_ini.security.admin_user }}" - grafana_password: "{{ grafana_ini.security.admin_password }}" - name: "{{ item.name }}" - ds_url: "{{ item.url }}" - ds_type: "{{ item.type }}" - access: "{{ item.access | default(omit) }}" - is_default: "{{ item.isDefault | default(omit) }}" - basic_auth_user: "{{ item.basicAuthUser | default(omit) }}" - basic_auth_password: "{{ item.basicAuthPassword | default(omit) }}" - database: "{{ item.database | default(omit) }}" - user: "{{ item.user | default(omit) }}" - password: "{{ item.password | default(omit) }}" - aws_auth_type: "{{ item.aws_auth_type | default(omit) }}" - aws_default_region: "{{ item.aws_default_region | default(omit) }}" - aws_access_key: "{{ item.aws_access_key | default(omit) }}" - aws_secret_key: "{{ item.aws_secret_key | default(omit) }}" - aws_credentials_profile: "{{ item.aws_credentials_profile | default(omit) }}" - aws_custom_metrics_namespaces: "{{ item.aws_custom_metrics_namespaces | default(omit) }}" - loop: "{{ grafana_datasources }}" - when: "not grafana_use_provisioning" - -- name: "Create/Update datasources file (provisioning)" - ansible.builtin.copy: - dest: "/etc/grafana/provisioning/datasources/ansible.yml" - content: | - apiVersion: 1 - deleteDatasources: [] - datasources: - {{ grafana_datasources | to_nice_yaml }} - backup: false - owner: root - group: grafana - mode: 0640 - notify: restart_grafana - become: true - when: "grafana_use_provisioning" diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/install.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/install.yml deleted file mode 100644 index db64282..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/install.yml +++ /dev/null @@ -1,133 +0,0 @@ ---- -- name: "Remove conflicting grafana packages" - ansible.builtin.package: - name: grafana-data - state: absent - -- name: "Install dependencies" - ansible.builtin.package: - name: "{{ _grafana_dependencies }}" - state: present - update_cache: true - when: - - _grafana_dependencies is defined - - _grafana_dependencies | length > 0 - -- name: "Prepare zypper" - when: - - "ansible_facts['pkg_mgr'] == 'zypper'" - - "(grafana_manage_repo)" - environment: "{{ grafana_environment }}" - block: - - name: import Grafana RPM Key - ansible.builtin.rpm_key: - state: present - key: "{{ grafana_yum_key }}" - - - name: "Add Grafana zypper repository" - community.general.zypper_repository: - name: grafana - description: grafana - repo: "{{ grafana_yum_repo }}" - enabled: true - disable_gpg_check : "{{ false if (grafana_yum_key) else omit }}" - runrefresh: true - when: "(not grafana_rhsm_repo)" - -- name: "Prepare yum/dnf" - when: - - "ansible_facts['pkg_mgr'] in ['yum', 'dnf']" - - "(grafana_manage_repo)" - environment: "{{ grafana_environment }}" - block: - - name: "Add Grafana yum/dnf repository" - ansible.builtin.yum_repository: - name: grafana - description: grafana - baseurl: "{{ grafana_yum_repo }}" - enabled: true - gpgkey: "{{ grafana_yum_key | default(omit) }}" - repo_gpgcheck: "{{ true if (grafana_yum_key) else omit }}" - gpgcheck: "{{ true if (grafana_yum_key) else omit }}" - when: "(not grafana_rhsm_repo)" - - - name: "Attach RHSM subscription" - when: "(grafana_rhsm_subscription)" - block: - - name: "Check if Grafana RHSM subscription is enabled" - ansible.builtin.command: - cmd: "subscription-manager list --consumed --matches={{ grafana_rhsm_subscription | quote }} --pool-only" - register: __subscription_manager_consumed - changed_when: false - when: (grafana_rhsm_subscription) - - - name: "Find RHSM repo subscription pool id" - ansible.builtin.command: - cmd: "subscription-manager list --available --matches={{ grafana_rhsm_subscription | quote }} --pool-only" - register: __subscription_manager_available - changed_when: false - when: - - "(grafana_rhsm_subscription)" - - "__subscription_manager_consumed.stdout | length <= 0" - - - name: "Attach RHSM subscription" - ansible.builtin.command: - cmd: "subscription-manager attach --pool={{ __subscription_manager_available.stdout }}" - register: __subscription_manager_attach - changed_when: "__subscription_manager_attach.stdout is search('Successfully attached a subscription')" - failed_when: "__subscription_manager_attach.stdout is search('could not be found')" - when: - - "(grafana_rhsm_subscription)" - - "__subscription_manager_consumed.stdout | default() | length <= 0" - - "__subscription_manager_available.stdout | default() | length > 0" - - - name: "Enable RHSM repository" - community.general.rhsm_repository: - name: "{{ grafana_rhsm_repo }}" - state: enabled - when: (grafana_rhsm_repo) - -- name: "Prepare apt" - when: - - "ansible_facts['pkg_mgr'] == 'apt'" - - "(grafana_manage_repo)" - environment: "{{ grafana_environment }}" - block: - - name: "Use deb822 format?" - ansible.builtin.set_fact: - __use_deb822: "{{ (ansible_facts['distribution'] == 'Debian' and (ansible_facts['distribution_major_version'] | int) >= 12) or - (ansible_facts['distribution'] == 'Ubuntu' and (ansible_facts['distribution_major_version'] | int) >= 24) }}" - - name: "Import Grafana apt gpg key" - ansible.builtin.get_url: - url: "{{ grafana_apt_key }}" - dest: /usr/share/keyrings/grafana.asc - mode: "0644" - when: not __use_deb822 - - name: "Add Grafana apt repository" - when: not __use_deb822 - ansible.builtin.apt_repository: - repo: "{{ grafana_apt_repo }}" - update_cache: true - - name: "Add Grafana apt repository" - when: __use_deb822 - ansible.builtin.deb822_repository: - name: "{{ grafana_apt_name }}" - types: deb - uris: "{{ grafana_apt_repo_uri }}" - suites: "{{ grafana_apt_release_channel }}" - components: - - main - architectures: - - "{{ grafana_apt_arch }}" - signed_by: "{{ grafana_apt_key }}" - register: __update_cache - - name: "Update apt cache" - ansible.builtin.apt: - update_cache: true - when: __update_cache is defined and __update_cache.changed - -- name: "Install Grafana" - ansible.builtin.package: - name: "{{ grafana_package }}" - state: "{{ (grafana_version == 'latest') | ternary('latest', 'present') }}" - notify: restart_grafana diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/main.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/main.yml deleted file mode 100644 index 3f8f78b..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/main.yml +++ /dev/null @@ -1,133 +0,0 @@ ---- -- name: Inherit default vars - ansible.builtin.set_fact: - grafana_ini: "{{ grafana_ini_default | ansible.builtin.combine(grafana_ini | default({}), recursive=true) }}" - no_log: "{{ 'false' if lookup('env', 'CI') else 'true' }}" - tags: - - always -- name: "Gather variables for each operating system" - ansible.builtin.include_vars: "{{ distrovars }}" - vars: - distrovars: "{{ lookup('first_found', params, errors='ignore') }}" - params: - skip: true - files: - - "{{ ansible_facts['distribution'] | lower }}-{{ ansible_facts['distribution_version'] | lower }}.yml" - - "{{ ansible_facts['distribution'] | lower }}-{{ ansible_facts['distribution_major_version'] | lower }}.yml" - - "{{ ansible_facts['os_family'] | lower }}-{{ ansible_facts['distribution_major_version'] | lower }}.yml" - - "{{ ansible_facts['distribution'] | lower }}.yml" - - "{{ ansible_facts['os_family'] | lower }}.yml" - paths: - - "vars/distro" - tags: - - grafana_install - - grafana_configure - - grafana_datasources - - grafana_notifications - - grafana_dashboards - -- name: Preflight - ansible.builtin.include_tasks: - file: preflight.yml - apply: - tags: - - grafana_install - - grafana_configure - - grafana_datasources - - grafana_notifications - - grafana_dashboards - -- name: Install - ansible.builtin.include_tasks: - file: install.yml - apply: - become: true - tags: - - grafana_install - -- name: Configure - ansible.builtin.include_tasks: - file: configure.yml - apply: - become: true - tags: - - grafana_configure - -- name: Plugins - ansible.builtin.include_tasks: - file: plugins.yml - apply: - tags: - - grafana_configure - when: "grafana_plugins != []" - -- name: "Restart grafana before configuring datasources and dashboards" - ansible.builtin.meta: flush_handlers - tags: - - grafana_install - - grafana_configure - - grafana_datasources - - grafana_notifications - - grafana_dashboards - - grafana_run - -- name: "Wait for grafana to start" - ansible.builtin.wait_for: - host: "{{ grafana_ini.server.http_addr if grafana_ini.server.protocol is undefined or grafana_ini.server.protocol in ['http', 'https'] else omit }}" - port: "{{ grafana_ini.server.http_port if grafana_ini.server.protocol is undefined or grafana_ini.server.protocol in ['http', 'https'] else omit }}" - path: "{{ grafana_ini.server.socket | default() if grafana_ini.server.protocol is defined and grafana_ini.server.protocol == 'socket' else omit }}" - tags: - - grafana_install - - grafana_configure - - grafana_datasources - - grafana_notifications - - grafana_dashboards - - grafana_run - -- name: "Api keys" - ansible.builtin.include_tasks: - file: api_keys.yml - apply: - tags: - - grafana_configure - - grafana_run - when: "grafana_api_keys | length > 0" - -- name: Datasources - ansible.builtin.include_tasks: - file: datasources.yml - apply: - tags: - - grafana_configure - - grafana_datasources - - grafana_run - when: "grafana_datasources != []" - -- name: Notifications - ansible.builtin.include_tasks: - file: notifications.yml - apply: - tags: - - grafana_configure - - grafana_notifications - - grafana_run - when: "grafana_alert_notifications | length > 0 or grafana_alert_resources | length > 0" - -- name: Find dashboards to be provisioned - ansible.builtin.find: - paths: "{{ grafana_dashboards_dir }}" - recurse: true - patterns: "*.json" - delegate_to: localhost - become: false - register: __found_dashboards - -- name: Dashboards - ansible.builtin.include_tasks: - file: dashboards.yml - apply: - tags: - - grafana_configure - - grafana_dashboards - - grafana_run - when: "grafana_dashboards | length > 0 or __found_dashboards['files'] | length > 0" diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/notifications.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/notifications.yml deleted file mode 100644 index a09c609..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/notifications.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- -# legacy config -- name: "Create/Delete/Update alert notifications channels (provisioning)" - ansible.builtin.copy: - content: | - apiVersion: 1 - {{ grafana_alert_notifications | to_nice_yaml }} - dest: /etc/grafana/provisioning/notification/ansible.yml - owner: root - group: grafana - mode: "0640" - become: true - notify: restart_grafana - when: grafana_use_provisioning and grafana_alert_notifications | length > 0 - -# new alert resources -- name: "Create/Delete/Update alert resources (provisioning)" - ansible.builtin.copy: - content: | - apiVersion: 1 - {{ grafana_alert_resources | to_nice_yaml }} - dest: /etc/grafana/provisioning/alerting/ansible.yml - owner: root - group: grafana - mode: "0640" - become: true - notify: restart_grafana - when: grafana_use_provisioning and grafana_alert_resources | length > 0 diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/plugins.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/plugins.yml deleted file mode 100644 index 13117c6..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/plugins.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -- name: "Check which plugins are installed" - ansible.builtin.find: - file_type: directory - recurse: false - paths: "{{ grafana_ini.paths.data }}/plugins" - register: __installed_plugins - -- name: "Install plugins" - become: true - ansible.builtin.command: - cmd: "grafana-cli --pluginsDir {{ grafana_ini.paths.data }}/plugins plugins install {{ item }}" - creates: "{{ grafana_ini.paths.data }}/plugins/{{ item }}" - loop: "{{ grafana_plugins | difference(__installed_plugins.files) }}" - register: __plugin_install - until: "__plugin_install is succeeded" - retries: 5 - delay: 2 - notify: - - restart_grafana diff --git a/ansible_collections/grafana/grafana/roles/grafana/tasks/preflight.yml b/ansible_collections/grafana/grafana/roles/grafana/tasks/preflight.yml deleted file mode 100644 index 74dbc7e..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/tasks/preflight.yml +++ /dev/null @@ -1,104 +0,0 @@ ---- -- name: "Check variable types" - ansible.builtin.assert: - that: - - grafana_logs_dir is undefined - - grafana_data_dir is undefined - - grafana_server is undefined - - grafana_database is undefined - - grafana_security is undefined - - grafana_remote_cache is undefined - - grafana_welcome_email_on_sign_up is undefined - - grafana_users is undefined - - grafana_auth is undefined - - grafana_auth_generic_oauth is undefined - - grafana_session is undefined - - grafana_analytics is undefined - - grafana_smtp is undefined - - grafana_alerting is undefined - - grafana_unified_alerting is undefined - - grafana_log is undefined - - grafana_metrics is undefined - - grafana_tracing is undefined - - grafana_snapshots is undefined - - grafana_image_storage is undefined - - grafana_date_formats is undefined - - grafana_feature_toggles is undefined - - grafana_plugins_ops is undefined - - grafana_instance is undefined - - grafana_address is undefined - - grafana_port is undefined - - grafana_domain is undefined - - grafana_url is undefined - - grafana_panels is undefined - fail_msg: Check upgrade notes - -- name: "Fail when datasources aren't configured when dashboards are set to be installed" - ansible.builtin.fail: - msg: "You need to specify datasources for dashboards!!!" - when: "grafana_dashboards != [] and grafana_datasources == []" - -- name: "Fail when grafana admin user isn't set" - ansible.builtin.fail: - msg: "Please specify grafana admin user (grafana_ini.security.admin_user)" - when: - - "grafana_ini.security.admin_user == '' or - grafana_ini.security.admin_user is not defined" - -- name: "Fail when grafana admin password isn't set" - ansible.builtin.fail: - msg: "Please specify grafana admin password (grafana_ini.security.admin_password)" - when: - - "grafana_ini.security.admin_password == '' or - grafana_ini.security.admin_password is not defined" - -- name: "Fail on incorrect variable types in datasource definitions" - ansible.builtin.fail: - msg: "Boolean variables in grafana_datasources shouldn't be passed as strings. Please remove unneeded apostrophes." - when: "( item.isDefault is defined and item.isDefault is string ) or - ( item.basicAuth is defined and item.basicAuth is string )" - loop: "{{ grafana_datasources }}" - -- name: "Fail on bad database configuration" - ansible.builtin.fail: - msg: "Invalid database configuration. Please look at http://docs.grafana.org/installation/configuration/#database" - when: "( grafana_ini.database.type == 'sqlite3' and grafana_ini.database.url is defined ) or - ( grafana_ini.database.type != 'sqlite3' and grafana_ini.database.path is defined ) or - ( grafana_ini.database.type == 'sqlite3' and grafana_ini.database.host is defined ) or - ( grafana_ini.database.type == 'sqlite3' and grafana_ini.database.user is defined ) or - ( grafana_ini.database.type == 'sqlite3' and grafana_ini.database.password is defined ) or - ( grafana_ini.database.type == 'sqlite3' and grafana_ini.database.server_cert_name is defined )" - -- name: "Fail when grafana_api_keys uses invalid role names" - ansible.builtin.fail: - msg: "Check grafana_api_keys. The role can only be one of the following values: Viewer, Editor or Admin." - when: "item.role not in ['Viewer', 'Editor', 'Admin']" - loop: "{{ grafana_api_keys }}" - -- name: "Fail when grafana_ldap isn't set when grafana_ini.auth.ldap is" - ansible.builtin.fail: - msg: "You need to configure grafana_ldap.servers and grafana_ldap.group_mappings when grafana_ini.auth.ldap is set" - when: - - "'ldap' in grafana_ini.auth" - - "grafana_ldap is not defined or ('servers' not in grafana_ldap or 'group_mappings' not in grafana_ldap)" - -- name: "Force grafana_use_provisioning to false if grafana_version is < 5.0 ( grafana_version is set to '{{ grafana_version }}' )" - ansible.builtin.set_fact: - grafana_use_provisioning: false - when: - - "grafana_version != 'latest'" - - "grafana_version is version_compare('5.0', '<')" - -- name: "Fail if grafana_ini.server.http_port is lower than 1024 and grafana_cap_net_bind_service is not true" - ansible.builtin.fail: - msg: "Trying to use a port lower than 1024 without setting grafana_cap_net_bind_service." - when: - - "grafana_ini.server.http_port | int <= 1024" - - "not grafana_cap_net_bind_service" - -- name: "Fail if grafana_ini.server.socket not defined when in socket mode" - ansible.builtin.fail: - msg: "You need to configure grafana_ini.server.socket when grafana_ini.server.protocol is set to 'socket'" - when: - - "grafana_ini.server.protocol is defined and grafana_ini.server.protocol == 'socket'" - - "grafana_ini.server.socket is undefined or grafana_ini.server.socket == ''" diff --git a/ansible_collections/grafana/grafana/roles/grafana/templates/grafana.ini.j2 b/ansible_collections/grafana/grafana/roles/grafana/templates/grafana.ini.j2 deleted file mode 100644 index 8ed33dd..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/templates/grafana.ini.j2 +++ /dev/null @@ -1,28 +0,0 @@ -{{ ansible_managed | comment }} -# More informations: -# http://docs.grafana.org/installation/configuration -# https://github.com/grafana/grafana/blob/master/conf/sample.ini - -{% for k, v in grafana_ini.items() %} -{% if v is not mapping %} -{{ k }} = {{ v }} -{% endif %} -{% endfor %} - -{% for section, items in grafana_ini.items() %} -{% if items is mapping %} -[{{ section }}] -{% for sub_key, sub_value in items.items() %} -{% if sub_value is mapping %} - -[{{ section }}.{{ sub_key }}] -{% for k, v in sub_value.items() %} -{{ k }} = {{ v }} -{% endfor %} -{% else %} -{{ sub_key }} = {{ sub_value }} -{% endif %} -{% endfor %} -{% endif %} - -{% endfor %} diff --git a/ansible_collections/grafana/grafana/roles/grafana/templates/ldap.toml.j2 b/ansible_collections/grafana/grafana/roles/grafana/templates/ldap.toml.j2 deleted file mode 100644 index b28e002..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/templates/ldap.toml.j2 +++ /dev/null @@ -1,39 +0,0 @@ -{{ ansible_managed | comment }} -# Documentation: http://docs.grafana.org/installation/ldap/ -{% if 'verbose_logging' in grafana_ldap %} -verbose_logging = {{ 'true' if grafana_ldap.verbose_logging else 'false' }} -{% endif %} - -[[servers]] -{% for k,v in grafana_ldap.servers.items() if k != 'attributes' %} -{% if k == 'port' %} -{{ k }} = {{ v | int }} -{% elif v in [True, False] %} -{{ k }} = {{ 'true' if v else 'false' }} -{% else %} -{{ k }} = {{ v | to_nice_json }} -{% endif %} -{% endfor %} - -[servers.attributes] -{% for k,v in grafana_ldap.servers.attributes.items() %} -{{ k }} = {{ v | to_nice_json }} -{% endfor %} - -{% for org in grafana_ldap.group_mappings %} -{% if 'name' in org %} -# {{ org.name }} -{% endif %} -{% for group in org.groups %} -[[servers.group_mappings]] -org_id = {{ org.id }} -{% for k,v in group.items() %} -{% if v in [True, False] %} -{{ k }} = {{ 'true' if v else 'false' }} -{% else %} -{{ k }} = "{{ v }}" -{% endif %} -{% endfor %} - -{% endfor %} -{% endfor %} diff --git a/ansible_collections/grafana/grafana/roles/grafana/templates/tmpfiles.j2 b/ansible_collections/grafana/grafana/roles/grafana/templates/tmpfiles.j2 deleted file mode 100644 index fbf23f5..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/templates/tmpfiles.j2 +++ /dev/null @@ -1,2 +0,0 @@ -{{ ansible_managed | comment }} -d {{ grafana_ini.server.socket | dirname }} 0775 grafana grafana diff --git a/ansible_collections/grafana/grafana/roles/grafana/test-requirements.txt b/ansible_collections/grafana/grafana/roles/grafana/test-requirements.txt deleted file mode 100644 index af58c11..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/test-requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -molecule -docker -pytest-testinfra -jmespath -selinux -passlib diff --git a/ansible_collections/grafana/grafana/roles/grafana/vars/distro/debian.yml b/ansible_collections/grafana/grafana/roles/grafana/vars/distro/debian.yml deleted file mode 100644 index 7401c93..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/vars/distro/debian.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -grafana_package: "grafana{% if ansible_facts['architecture'] == 'armv6l' %}-rpi{% endif %}{{ (grafana_version != 'latest') | ternary('=' ~ grafana_version, '') }}" -_grafana_dependencies: - - apt-transport-https - - adduser - - ca-certificates - - libfontconfig - - gnupg2 diff --git a/ansible_collections/grafana/grafana/roles/grafana/vars/distro/redhat.yml b/ansible_collections/grafana/grafana/roles/grafana/vars/distro/redhat.yml deleted file mode 100644 index 0721829..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/vars/distro/redhat.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -grafana_package: "grafana{{ (grafana_version != 'latest') | ternary('-' ~ grafana_version, '') }}" -# https://unix.stackexchange.com/questions/534463/cant-enable-grafana-on-boot-in-fedora-because-systemd-sysv-install-missing -_grafana_dependencies: - - chkconfig diff --git a/ansible_collections/grafana/grafana/roles/grafana/vars/distro/suse.yml b/ansible_collections/grafana/grafana/roles/grafana/vars/distro/suse.yml deleted file mode 100644 index 56486df..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana/vars/distro/suse.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -grafana_package: "grafana{{ (grafana_version != 'latest') | ternary('-' ~ grafana_version, '') }}" -# https://unix.stackexchange.com/questions/534463/cant-enable-grafana-on-boot-in-fedora-because-systemd-sysv-install-missing -# applies to SuSe too -_grafana_dependencies: - - insserv-compat diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/README.md b/ansible_collections/grafana/grafana/roles/grafana_agent/README.md deleted file mode 100644 index 5301aa5..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/README.md +++ /dev/null @@ -1,72 +0,0 @@ -|![](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. - -## Requirements - -Please ensure that `curl` is intalled on Ansible controller. - -To use this role, You need a YAML file having the Grafana Agent configuration. - -## Role Variables - -All variables which can be overridden are stored in [./defaults/main.yaml](./defaults/main.yaml) file as well as in table below. - -| Variable | Default | Description | -| :------ | :------ | :--------- | -| `grafana_agent_version` | `latest` | version of the agent to install | -| `grafana_agent_base_download_url` | `https://github.com/{{ _grafana_agent_github_org }}/{{ _grafana_agent_github_repo }}/releases/download` | base download url. Github or mirror to download from | -| `grafana_agent_install_dir` | `/opt/grafana-agent/bin` | directory to install the binary to | -| `grafana_agent_binary` | `grafana-agent` | name to use for the binary | -| `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 | -| `grafana_agent_positions_dir` | `"{{ grafana_agent_data_dir }}/data"` | positions directory to use, should be a sub-folder of grafana_agent_data_dir, will automatically be created when the agent starts | -| `grafana_agent_mode` | `static` | mode to run Grafana Agent in. Can be "flow" or "static", [Flow Docs](https://grafana.com/docs/agent/latest/flow/) | -| `grafana_agent_user` | `grafana-agent` | os user to create for the agent to run as | -| `grafana_agent_user_group` | `grafana-agent` | os user group to create for the agent | -| `grafana_agent_user_groups` | `[]` | Configurable user groups that the Grafana agent can be put in so that it can access logs | -| `grafana_agent_user_shell` | `/usr/sbin/nologin` | the shell for the user | -| `grafana_agent_user_createhome` | `false` | whether or not to create a home directory for the user | -| `grafana_agent_local_binary_file` | `""` | full path to the local binary if already downloaded or built on the controller, this should only be set, if ansible is not downloading the binary and you have manually downloaded the binary | -| `grafana_agent_flags_extra` | see [./defaults/main.yaml](./defaults/main.yaml) | dictionary of additional command-line flags, run grafana-agent --help for a complete list. [Docs](https://grafana.com/docs/agent/latest/configuration/flags/) | -| `grafana_agent_env_vars` | `{}` | sets Environment variables in the systemd service configuration. | -| `grafana_agent_env_file_vars` | `{}` | dictionary of key/pair values to write to the environment file that is loaded by the service, with the flag `--config.expand-env=true` any generated config files will support the expansion of environment variables at runtime by referencing ${ENVVAR}. be aware of boolean values, when output they will result in the proper-cased string "True" and "False" | -| `grafana_agent_provisioned_config_file` | `""` | path to a config file on the controller that will be used instead of the provided configs below if specified. | -| `grafana_agent_server_config` | see [./defaults/main.yaml](./defaults/main.yaml) | Configures the server of the Agent used to enable self-scraping, [Docs](https://grafana.com/docs/agent/latest/configuration/server-config/) | -| `grafana_agent_metrics_config` | see [./defaults/main.yaml](./defaults/main.yaml) | Configures metric collection, [Docs](https://grafana.com/docs/agent/latest/configuration/metrics-config/) | -| `grafana_agent_logs_config` | see [./defaults/main.yaml](./defaults/main.yaml) | Configures logs collection, [Docs](https://grafana.com/docs/agent/latest/configuration/logs-config/) | -| `grafana_agent_traces_config` | see [./defaults/main.yaml](./defaults/main.yaml) | Configures traces collection, [Docs](https://grafana.com/docs/agent/latest/configuration/traces-config/) | -| `grafana_agent_integrations_config` | see [./defaults/main.yaml](./defaults/main.yaml) | Configures integrations for the agent, [Docs](https://grafana.com/docs/agent/latest/configuration/integrations/) | - -## OS Support -The Grafana Agent role has been tested on below Operating Systems -- Ubuntu 22.10, Ubunutu 22.04 LTS, Ubunutu 20.04 LTS, Ubunutu 18.04 LTS -- Fedora 37, Fedora 36 -- Debian 11, Debian 10, Debian 9 -- CentOS 9 Stream, CentOS 8 Stream, CentOS 7 -- AlmaLinux 9, AlmaLinux 8 -- RockyLinux 9, RockyLinux 8 - -## Example Playbooks - -See [examples](../../examples) - -## License - -See [LICENSE](https://github.com/grafana/grafana-ansible-collection/blob/main/LICENSE) - -## Author Information - -- [Grafana Labs](https://github.com/grafana) -- [Ishan Jain](https://github.com/ishanjainn) -- [Aaron Benton](https://github.com/bentonam) -- [Vitaly Zhuravlev](https://github.com/v-zhuravlev) diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/defaults/main.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/defaults/main.yaml deleted file mode 100644 index 31acc5b..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/defaults/main.yaml +++ /dev/null @@ -1,196 +0,0 @@ ---- -# version of the agent to install -grafana_agent_version: latest - -# base download url. Github or mirror to download from -grafana_agent_base_download_url: "https://github.com/{{ _grafana_agent_github_org }}/{{ _grafana_agent_github_repo }}/releases/download" - -# directory to install the binary to -grafana_agent_install_dir: /opt/grafana-agent/bin - -# name to use for the binary -grafana_agent_binary: grafana-agent - -# directory to store the configuration files in -grafana_agent_config_dir: /etc/grafana-agent - -# name of the configuration file for the agent -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 - -# data directory to create for the wal and positions -grafana_agent_data_dir: /var/lib/grafana-agent - -# wal directory to use, should be a sub-folder of grafana_agent_data_dir, will automatically be created when the agent starts -grafana_agent_wal_dir: "{{ grafana_agent_data_dir }}/wal" - -# positions directory to use, should be a sub-folder of grafana_agent_data_dir, will automatically be created when the agent starts -grafana_agent_positions_dir: "{{ grafana_agent_data_dir }}/positions" - -# mode to run Grafana Agent in. Can be "flow" or "static". -# Docs: https://grafana.com/docs/agent/latest/flow/ -grafana_agent_mode: static - -# os user to create for the agent to run as -grafana_agent_user: grafana-agent - -# os user group to create for the agent -grafana_agent_user_group: grafana-agent - -# Configurable user groups that the grafana agent can be put in so that it can access logs -# (See https://github.com/grafana/grafana-ansible-collection/issues/40) -grafana_agent_user_groups: [] - -# the shell for the user -grafana_agent_user_shell: /usr/sbin/nologin - -# whether or not to create a home directory for the user -grafana_agent_user_createhome: false - -# full path to the local binary if already downloaded or built on the controller -# this should only be set, if ansible is not downloading the binary and you have -# manually downloaded the binary -grafana_agent_local_binary_file: "" - -# dictionary of additional command-line flags, run grafana-agent --help for a complete list -# Docs: https://grafana.com/docs/agent/latest/static/configuration/flags/ -grafana_agent_flags_extra: - config.expand-env: 'true' - config.enable-read-api: 'false' - server.register-instrumentation: 'true' - server.http.address: 127.0.0.1:12345 - server.grpc.address: 127.0.0.1:12346 - -# sets Environment variables in the systemd service configuration. -grafana_agent_env_vars: {} - -# dictionary of key/pair values to write to the environment file that is loaded by the service, with the flag --config.expand-env=true -# any generated config files will support the expansion of environment variables at runtime by referencing ${ENVVAR}. -# be aware of boolean values, when output they will result in the proper-cased string "True" and "False" -grafana_agent_env_file_vars: {} - -# path to a config file on the controller that will be used instead of the provided configs below if specified. -grafana_agent_provisioned_config_file: "" - -################################################################################################# -# Configures the server of the Agent used to enable self-scraping # -################################################################################################# -# Docs: https://grafana.com/docs/agent/latest/static/configuration/server-config/ -# the entire dictionary value for this object is copied to the server: block in the config file -grafana_agent_server_config: - # Log only messages with the given severity or above. Supported values [debug, - # info, warn, error]. This level affects logging for all Agent-level logs, not - # just the HTTP and gRPC server. - # - # Note that some integrations use their own loggers which ignore this - # setting. - log_level: info - -################################################################################################# -# Configures metric collection # -################################################################################################# -# Docs: https://grafana.com/docs/agent/latest/static/configuration/metrics-config/ -# the entire dictionary value for this object is copied to the metrics: block in the config file -grafana_agent_metrics_config: - # Configure values for all Prometheus instances - # Docs: https://grafana.com/docs/agent/latest/static/configuration/metrics-config/#global_config - global: - # How frequently should Prometheus instances scrape. - scrape_interval: 1m - - # How long to wait before timing out a scrape from a target. - scrape_timeout: 10s - - # A dictionary of key/pair static labels to add for all metrics. - external_labels: {} - - # Default set of remote_write endpoints. If an instance doesn't define any - # remote_writes, it will use this list. - # Docs: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write - remote_write: [] - - # The list of Prometheus instances to launch with the agent. - # Docs: https://grafana.com/docs/agent/latest/static/configuration/metrics-config/#metrics_instance_config - configs: [] - # - name: name-of-scrape-job - # # Docs: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config - # scrape_configs: [] - # # Optional list of remote_write targets, if not specified metrics.global.remote_write is used - # # Docs: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write - # remote_write: [] - - # Configure the directory used by instances to store their WAL. - # - # The Grafana Agent assumes that all folders within wal_directory are managed by - # the agent itself. - wal_directory: "{{ grafana_agent_wal_dir }}" - # Configures how long ago an abandoned (not associated with an instance) WAL - # may be written to before being eligible to be deleted - wal_cleanup_age: 12h - # Configures how often checks for abandoned WALs to be deleted are performed. - # A value of 0 disables periodic cleanup of abandoned WALs - wal_cleanup_period: 30m - -################################################################################################# -# Configures logs collection # -################################################################################################# -# Docs: https://grafana.com/docs/agent/latest/static/configuration/logs-config/ -# the entire dictionary value for this object is copied to the logs: block in the config file -grafana_agent_logs_config: - # Directory to store Loki Promtail positions files in. Positions files are - # required to read logs, and are used to store the last read offset of log - # sources. The positions files will be stored in - # /.yml. - # - # Optional only if every config has a positions.filename manually provided. - # - # This directory will be automatically created if it doesn't exist. - positions_directory: "{{ grafana_agent_positions_dir }}" - # Configure values for all Loki Promtail instances. - global: - # Docs: https://grafana.com/docs/agent/latest/static/configuration/logs-config/#logs_instance_config - clients: [] - -################################################################################################# -# Configures traces collection # -################################################################################################# -# Docs: https://grafana.com/docs/agent/latest/static/configuration/traces-config/ -# the entire dictionary value for this object is copied to the traces: block in the config file -grafana_agent_traces_config: - # Docs: https://grafana.com/docs/agent/latest/static/configuration/traces-config/#traces_instance_config - configs: [] - -################################################################################################# -# Configures integrations for the agent # -################################################################################################# -# Docs: https://grafana.com/docs/agent/latest/static/configuration/integrations/ -# the entire dictionary value for this object is copied to the integrations: block in the config file -grafana_agent_integrations_config: - # Automatically collect metrics from enabled integrations. If disabled, - # integrations will be run but not scraped and thus not remote_written. Metrics - # for integrations will be exposed at /integrations//metrics - # and can be scraped by an external process. - scrape_integrations: true - # Controls the Agent integration - agent: - # Enables the Agent integration, allowing the Agent to automatically - # collect and send metrics about itself. - enabled: true - # Allows for relabeling labels on the target. - relabel_configs: [] - # Relabel metrics coming from the integration, allowing to drop series - # from the integration that you don't care about. - metric_relabel_configs: [] - - # Controls the node_exporter integration - # Docs: https://grafana.com/docs/agent/latest/static/configuration/integrations/node-exporter-config/ - node_exporter: - enabled: true diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/handlers/main.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/handlers/main.yaml deleted file mode 100644 index b5b01aa..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/handlers/main.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: Restart Grafana Agent - become: true - ansible.builtin.systemd: - name: grafana-agent - state: restarted - daemon_reload: true - listen: "restart grafana-agent" - -- name: Check Grafana Agent is started properly - ansible.builtin.include_tasks: ga-started.yaml - listen: "restart grafana-agent" diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/meta/main.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/meta/main.yaml deleted file mode 100644 index 7ef9308..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/meta/main.yaml +++ /dev/null @@ -1,25 +0,0 @@ ---- -dependencies: [] - -galaxy_info: - role_name: grafana_agent - author: Ishan Jain - description: Ansible Role to deploy Grafana Agent on Linux hosts. - 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 diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/configure.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/configure.yaml deleted file mode 100644 index 5f4db48..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/configure.yaml +++ /dev/null @@ -1,56 +0,0 @@ ---- -# these tasks are ran in both install and configure, as directories could have changed -- name: Configure directories - ansible.builtin.import_tasks: install/directories.yaml - -- name: Create a symbolic link - ansible.builtin.file: - src: "{{ grafana_agent_install_dir }}/{{ grafana_agent_binary }}" - dest: "/usr/local/bin/{{ grafana_agent_binary }}" - owner: root - group: root - state: link - -- name: Overwrite/Create Grafana Agent service - ansible.builtin.template: - src: grafana-agent.service.j2 - dest: "{{ _grafana_agent_systemd_dir }}/{{ _grafana_agent_systemd_unit }}" - owner: root - group: root - mode: 0644 - notify: "restart grafana-agent" - -- name: Create the Service Environment file - ansible.builtin.template: - src: EnvironmentFile.j2 - dest: "{{ grafana_agent_config_dir }}/{{ grafana_agent_env_file }}" - owner: root - group: "{{ grafana_agent_user_group }}" - mode: 0640 - notify: "restart grafana-agent" - -- name: Create Grafana Agent config - ansible.builtin.template: - src: config.yaml.j2 - dest: "{{ grafana_agent_config_dir }}/{{ grafana_agent_config_filename }}" - force: true - owner: root - group: "{{ grafana_agent_user_group }}" - mode: 0640 - notify: "restart grafana-agent" - when: grafana_agent_provisioned_config_file | length == 0 - -- name: Create Grafana Agent River Config if flow mode for Grafana Agent - ansible.builtin.shell: "AGENT_MODE=flow {{ grafana_agent_install_dir }}/grafana-agent convert -f static {{ grafana_agent_config_dir }}/{{ grafana_agent_config_filename }} -o {{ grafana_agent_config_dir }}/{{ grafana_agent_config_filename }}" - notify: "restart grafana-agent" - when: grafana_agent_provisioned_config_file | length == 0 - -- name: Copy Grafana Agent config - ansible.builtin.copy: - src: "{{ grafana_agent_provisioned_config_file }}" - dest: "{{ grafana_agent_config_dir }}/{{ grafana_agent_config_filename }}" - owner: root - group: "{{ grafana_agent_user_group }}" - mode: 0640 - notify: "restart grafana-agent" - when: grafana_agent_provisioned_config_file | length > 0 diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/ga-started.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/ga-started.yaml deleted file mode 100644 index cf66893..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/ga-started.yaml +++ /dev/null @@ -1,29 +0,0 @@ ---- -- name: Health check Grafana Agent - ansible.builtin.uri: - url: "{{ _grafana_agent_healthcheck_endpoint }}" - follow_redirects: none - method: GET - register: _result - failed_when: false - until: _result.status == 200 - retries: 3 - delay: 5 - changed_when: false - when: not ansible_check_mode - -- name: Check system logs if Grafana Agent is not started - when: not ansible_check_mode and _result.status != 200 - block: - - name: Run journalctl - ansible.builtin.shell: - cmd: "journalctl -u grafana-agent -b -n20 --no-pager" - register: journal_ret - changed_when: false - - name: Output Grafana agent logs - ansible.builtin.debug: - var: journal_ret.stdout_lines - - name: Rise alerts - ansible.builtin.assert: - that: false - fail_msg: "Service grafana-agent hasn't started." diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install.yaml deleted file mode 100644 index ff101eb..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -# user and group creation -- name: Configure user groups - ansible.builtin.import_tasks: install/user-group.yaml - -# directory creation -- name: Configure directories - ansible.builtin.import_tasks: install/directories.yaml - -# download and install agent -- name: Download and install Grafana Agent - ansible.builtin.import_tasks: install/download-install.yaml - when: (grafana_agent_local_binary_file is not defined) or (grafana_agent_local_binary_file | length == 0) - -# local install of agent -- name: Local install of Grafana Agent - ansible.builtin.import_tasks: - file: install/local-install.yaml - when: __grafana_agent_local_install diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/directories.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/directories.yaml deleted file mode 100644 index 13f3851..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/directories.yaml +++ /dev/null @@ -1,26 +0,0 @@ ---- -- name: Create install directories - block: - - name: Create Grafana Agent install directory - ansible.builtin.file: - path: "{{ grafana_agent_install_dir }}" - state: directory - owner: root - group: "{{ grafana_agent_user_group }}" - mode: 0770 - - - name: Create Grafana Agent conf directory - ansible.builtin.file: - path: "{{ grafana_agent_config_dir }}" - state: directory - owner: root - group: "{{ grafana_agent_user_group }}" - mode: 0770 - - - name: Create Grafana Agent data directory - ansible.builtin.file: - path: "{{ grafana_agent_data_dir }}" - state: directory - owner: root - group: "{{ grafana_agent_user_group }}" - mode: 0775 diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/download-install.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/download-install.yaml deleted file mode 100644 index 6cb1c96..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/download-install.yaml +++ /dev/null @@ -1,48 +0,0 @@ ---- -- name: Download Grafana Agent binary to controller (localhost) - block: - - name: Create Grafana Agent temp directory - become: false - ansible.builtin.file: - path: "{{ grafana_agent_local_tmp_dir }}" - state: directory - mode: 0751 - delegate_to: localhost - check_mode: false - run_once: true - - - name: Download Grafana Agent archive to local folder - become: false - ansible.builtin.get_url: - url: "{{ _grafana_agent_download_url }}" - dest: "{{ grafana_agent_local_tmp_dir }}/grafana-agent_{{ _grafana_agent_cpu_arch }}_{{ grafana_agent_version }}.zip" - mode: 0664 - register: _download_archive - until: _download_archive is succeeded - retries: 5 - delay: 2 - delegate_to: localhost - check_mode: false - run_once: true - - - name: Extract grafana-agent.zip - become: false - ansible.builtin.unarchive: - src: "{{ grafana_agent_local_tmp_dir }}/grafana-agent_{{ _grafana_agent_cpu_arch }}_{{ grafana_agent_version }}.zip" - dest: "{{ grafana_agent_local_tmp_dir }}" - remote_src: false - delegate_to: localhost - run_once: true - - - name: Set local path - ansible.builtin.set_fact: - __grafana_agent_local_binary_file: "{{ grafana_agent_local_tmp_dir }}/{{ grafana_agent_binary }}" - - - name: Propagate downloaded binary - ansible.builtin.copy: - src: "{{ grafana_agent_local_tmp_dir }}/{{ _grafana_agent_download_binary_file }}" - dest: "{{ grafana_agent_install_dir }}/{{ grafana_agent_binary }}" - mode: 0755 - owner: root - group: root - when: not ansible_check_mode diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/local-install.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/local-install.yaml deleted file mode 100644 index a2859bb..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/local-install.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -- name: Install from local - block: - - name: "Propagate local binary {{ grafana_agent_local_binary_file }}" - ansible.builtin.copy: - src: "{{ grafana_agent_local_binary_file }}" - dest: "{{ grafana_agent_install_dir }}/{{ grafana_agent_binary }}" - mode: 0755 - owner: root - group: root diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/user-group.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/user-group.yaml deleted file mode 100644 index 7b6ba7a..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/install/user-group.yaml +++ /dev/null @@ -1,38 +0,0 @@ ---- -- name: Grafana Agent group creation - block: - - name: "Check if the group exists ({{ grafana_agent_user_group }})" - ansible.builtin.getent: - database: group - key: "{{ grafana_agent_user_group }}" - fail_key: false - - - name: Set whether not the user group exists - ansible.builtin.set_fact: - __grafana_agent_user_group_exists: "{{ ansible_facts.getent_group[grafana_agent_user_group] is not none }}" - - - name: Add user group "{{ grafana_agent_user_group }}" - ansible.builtin.group: - name: "{{ grafana_agent_user_group }}" - system: true - state: present - when: not __grafana_agent_user_group_exists and grafana_agent_user_group != 'root' - - - name: Grafana Agent user group exists - ansible.builtin.debug: - msg: |- - The user group \"{{ grafana_agent_user_group }}\" already exists and will not be modified, - if modifying permissions please perform a separate task - when: __grafana_agent_user_group_exists - -- name: Grafana Agent user creation - block: - - name: Add user "{{ grafana_agent_user }}" - ansible.builtin.user: - name: "{{ grafana_agent_user }}" - comment: "Grafana Agent account" - groups: "{{ [ grafana_agent_user_group ] + grafana_agent_user_groups }}" - system: true - shell: "{{ grafana_agent_user_shell }}" - createhome: "{{ grafana_agent_user_createhome }}" - when: grafana_agent_user != 'root' diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/main.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/main.yaml deleted file mode 100644 index 7677b0a..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/main.yaml +++ /dev/null @@ -1,48 +0,0 @@ ---- -- name: Preflight tasks - ansible.builtin.include_tasks: - file: preflight.yaml - apply: - become: true - tags: - - grafana_agent_install - - grafana_agent_configure - - grafana_agent_run - tags: - - grafana_agent_install - - grafana_agent_configure - - grafana_agent_run - -- name: Install tasks - ansible.builtin.include_tasks: - file: install.yaml - apply: - become: true - tags: - - grafana_agent_install - tags: - - grafana_agent_install - -- name: Configuration tasks - ansible.builtin.include_tasks: - file: configure.yaml - apply: - become: true - tags: - - grafana_agent_configure - tags: - - grafana_agent_configure - -- name: Flush handlers - ansible.builtin.meta: flush_handlers - -- name: Ensure Grafana Agent is started and enabled on boot - become: true - ansible.builtin.systemd: - name: grafana-agent - enabled: true - state: started - tags: - - grafana_agent_install - - grafana_agent_configure - - grafana_agent_run diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight.yaml deleted file mode 100644 index 09b86d6..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: Preflight variable checks - ansible.builtin.import_tasks: preflight/vars.yaml - -- name: Systemd variable checks - ansible.builtin.import_tasks: preflight/systemd.yaml - -- name: Install variable checks - ansible.builtin.import_tasks: preflight/install.yaml - -- name: Download variable checks - ansible.builtin.import_tasks: preflight/download.yaml diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/download.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/download.yaml deleted file mode 100644 index d885c9b..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/download.yaml +++ /dev/null @@ -1,36 +0,0 @@ ---- -- name: Get Grafana Agent version from Github - when: grafana_agent_version == 'latest' and not __grafana_agent_local_install - block: - - name: Get the latest published Grafana Agent # noqa command-instead-of-module - ansible.builtin.shell: | - curl -s https://api.github.com/repos/{{ _grafana_agent_github_org }}/{{ _grafana_agent_github_repo }}/releases/latest \ - | grep -m 1 tag_name \ - | cut -d '"' -f 4 | cut -c 2- - changed_when: false - run_once: true - delegate_to: localhost - become: false - register: _grafana_agent_version_request - - - name: Fail if cannot get Grafana Agent Version - ansible.builtin.fail: - msg: Issue getting the Grafana Agent Version - when: _grafana_agent_version_request == "" - - - name: Set the Grafana Agent version - ansible.builtin.set_fact: - grafana_agent_version: "{{ _grafana_agent_version_request.stdout }}" - - - name: Grafana Agent version to download - ansible.builtin.debug: - var: grafana_agent_version - -- name: Set the Grafana Agent download URL - ansible.builtin.set_fact: - _grafana_agent_download_url: |- - {{ grafana_agent_base_download_url }}/v{{ grafana_agent_version }}/{{ _grafana_agent_download_archive_file }} - -- name: Grafana Agent download URL - ansible.builtin.debug: - var: _grafana_agent_download_url diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/install.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/install.yaml deleted file mode 100644 index 833ecec..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/install.yaml +++ /dev/null @@ -1,72 +0,0 @@ ---- -- name: Default to non-local install - ansible.builtin.set_fact: - __grafana_agent_local_install: false - -- name: Fail when grafana_agent_local_binary_file is defined but the file doesn't exist - when: grafana_agent_local_binary_file is defined and grafana_agent_local_binary_file | length > 0 - block: - - name: Check if grafana_agent_local_binary_file exists - ansible.builtin.stat: - path: "{{ grafana_agent_local_binary_file }}" - register: __grafana_agent_local_binary_check - become: false - delegate_to: localhost - check_mode: false - - - name: Fail when the grafana_agent_local_binary_file does not exist - ansible.builtin.fail: - msg: "The grafana_agent_local_binary_file ({{ grafana_agent_local_binary_file }}) was specified but does not exist" - when: not __grafana_agent_local_binary_check.stat.exists - - - name: Change to local install - ansible.builtin.set_fact: - __grafana_agent_local_install: true - -- name: Fail when grafana_agent_provisioned_config_file is defined but the file doesn't exist - when: grafana_agent_provisioned_config_file is defined and grafana_agent_provisioned_config_file | length > 0 - block: - - name: Check if grafana_agent_provisioned_config_file exists - ansible.builtin.stat: - path: "{{ grafana_agent_provisioned_config_file }}" - register: __grafana_agent_provisioned_config_file_check - become: false - delegate_to: localhost - check_mode: false - - - name: Fail when the grafana_agent_provisioned_config_file does not exist - ansible.builtin.fail: - msg: "The grafana_agent_provisioned_config_file ({{ grafana_agent_provisioned_config_file }}) was specified but does not exist" - when: not __grafana_agent_provisioned_config_file_check.stat.exists - -- name: Check if grafana_agent is already installed on the host - ansible.builtin.stat: - path: "{{ grafana_agent_install_dir }}/{{ grafana_agent_binary }}" - register: __grafana_agent_is_installed - check_mode: false - -- name: Is Grafana Agent already installed on the host - ansible.builtin.debug: - var: __grafana_agent_is_installed.stat.exists - -- name: Install checks - when: __grafana_agent_is_installed.stat.exists and not __grafana_agent_local_install - block: - - name: Gather currently installed grafana-agent version from the host - ansible.builtin.shell: - cmd: | - {{ grafana_agent_install_dir }}/{{ grafana_agent_binary }} --version | \ - head -n 1 | \ - awk '{ print $3; }' | \ - cut -d 'v' -f 2 - changed_when: false - register: __grafana_agent_current_version_output - check_mode: false - - - name: Set Grafana Agent installed version for the host - ansible.builtin.set_fact: - __grafana_agent_installed_version: "{{ __grafana_agent_current_version_output.stdout }}" - - - name: Grafana Agent installed version on host - ansible.builtin.debug: - var: __grafana_agent_installed_version diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/systemd.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/systemd.yaml deleted file mode 100644 index e5ccbec..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/systemd.yaml +++ /dev/null @@ -1,28 +0,0 @@ ---- -- name: Assert usage of systemd as an init system - ansible.builtin.assert: - that: ansible_facts['service_mgr'] == 'systemd' - msg: This role only works with systemd - -- name: Get systemd version # noqa command-instead-of-module - ansible.builtin.command: systemctl --version - changed_when: false - check_mode: false - register: __systemd_version - -- name: Set systemd version fact - ansible.builtin.set_fact: - grafana_agent_systemd_version: "{{ __systemd_version.stdout_lines[0] | regex_replace('^systemd\\s(\\d+).*$', '\\1') }}" - -- name: Fail when _grafana_agent_systemd_dir the directory doesn't exist - block: - - name: Check if _grafana_agent_systemd_dir exists - ansible.builtin.stat: - path: "{{ _grafana_agent_systemd_dir }}" - register: ___grafana_agent_systemd_dir_check - check_mode: false - - - name: Fail when the _grafana_agent_systemd_dir directory does not exist - ansible.builtin.fail: - msg: "The _grafana_agent_systemd_dir ({{ _grafana_agent_systemd_dir }}) does not exist" - when: not ___grafana_agent_systemd_dir_check.stat.exists diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/vars.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/vars.yaml deleted file mode 100644 index dc133a4..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/tasks/preflight/vars.yaml +++ /dev/null @@ -1,72 +0,0 @@ ---- -# Performs initial variable validation -- name: Fail when variables are not defined - ansible.builtin.fail: - msg: "The {{ item }} property must be set" - when: ( vars[item] is not defined ) - with_items: - - grafana_agent_version - - grafana_agent_install_dir - - grafana_agent_binary - - grafana_agent_config_dir - - grafana_agent_config_filename - - grafana_agent_env_file - - grafana_agent_local_tmp_dir - - grafana_agent_wal_dir - - grafana_agent_positions_dir - - grafana_agent_mode - - _grafana_agent_systemd_dir - - _grafana_agent_systemd_unit - - grafana_agent_user - - grafana_agent_user_group - - grafana_agent_user_shell - - grafana_agent_user_createhome - - grafana_agent_local_binary_file - - grafana_agent_flags_extra - - grafana_agent_env_vars - - grafana_agent_env_file_vars - - grafana_agent_provisioned_config_file - - grafana_agent_metrics_config - - grafana_agent_logs_config - - grafana_agent_traces_config - - grafana_agent_integrations_config - -- name: Fail when variables do not have a length - ansible.builtin.fail: - msg: "The {{ item }} property must be valued" - when: ( vars[item] | string | length == 0 ) - with_items: - - grafana_agent_version - - grafana_agent_install_dir - - grafana_agent_binary - - grafana_agent_config_dir - - grafana_agent_config_filename - - grafana_agent_env_file - - grafana_agent_local_tmp_dir - - grafana_agent_wal_dir - - grafana_agent_positions_dir - - grafana_agent_mode - - _grafana_agent_systemd_dir - - _grafana_agent_systemd_unit - - grafana_agent_user - - grafana_agent_user_group - - grafana_agent_user_shell - - grafana_agent_user_createhome - -- name: Fail when variables are not a number - ansible.builtin.fail: - msg: "The {{ item }} property must be number" - when: ( vars[item] is defined and vars[item] is not number) - with_items: [] - -- name: Fail when flags are not a boolean - ansible.builtin.fail: - msg: "The {{ item }} property must be a boolean true or false" - when: ( vars[item] | bool | string | lower ) not in ['true', 'false'] - with_items: - - grafana_agent_user_createhome - -- name: Fail when the agent mode is not "flow" or "static" - ansible.builtin.fail: - msg: "The grafana_agent_mode property must be a boolean 'flow' or 'static'" - when: grafana_agent_mode not in ['flow', 'static'] diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/templates/EnvironmentFile.j2 b/ansible_collections/grafana/grafana/roles/grafana_agent/templates/EnvironmentFile.j2 deleted file mode 100644 index 38022d0..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/templates/EnvironmentFile.j2 +++ /dev/null @@ -1,9 +0,0 @@ -{{ ansible_managed | comment }} -# Grafana Agent Environment File -AGENT_MODE={{ grafana_agent_mode }} - -GOMAXPROCS={{ ansible_facts['processor_vcpus']|default(ansible_facts['processor_count']) }} - -{% for key, value in grafana_agent_env_file_vars.items() %} -{{key}}={{value}} -{% endfor %} diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/templates/config.yaml.j2 b/ansible_collections/grafana/grafana/roles/grafana_agent/templates/config.yaml.j2 deleted file mode 100644 index b36ee7a..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/templates/config.yaml.j2 +++ /dev/null @@ -1,39 +0,0 @@ ---- -{{ ansible_managed | comment }} - -################################################################################################# -# Configures the server of the Agent used to enable self-scraping # -################################################################################################# -# Docs: https://grafana.com/docs/agent/latest/configuration/server-config/ -server: - {{ grafana_agent_server_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2) }} - -################################################################################################# -# Configures metric collection # -################################################################################################# -# Docs: https://grafana.com/docs/agent/latest/configuration/metrics-config/ -metrics: - {{ grafana_agent_metrics_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2) }} - -################################################################################################# -# Configures logs collection # -################################################################################################# -# Docs: https://grafana.com/docs/agent/latest/configuration/logs-config/ -logs: - {{ grafana_agent_logs_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2) }} - -{% if grafana_agent_mode == 'static' %} -################################################################################################# -# Configures traces collection # -################################################################################################# -# Docs: https://grafana.com/docs/agent/latest/configuration/traces-config/ -traces: - {{ grafana_agent_traces_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2) }} -{% endif %} - -################################################################################################# -# Configures integrations for the agent # -################################################################################################# -# Docs: https://grafana.com/docs/agent/latest/configuration/integrations/ -integrations: - {{ grafana_agent_integrations_config | to_nice_yaml(indent=2,sort_keys=False) | indent(2) }} 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 deleted file mode 100644 index b4d5bce..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/templates/grafana-agent.service.j2 +++ /dev/null @@ -1,65 +0,0 @@ -{{ ansible_managed | comment }} - -[Unit] -Description=Grafana Agent -Documentation=https://grafana.com/docs/agent/latest/ -After=network-online.target - -[Service] -Type=simple -User={{ grafana_agent_user }} -Group={{ grafana_agent_user_group }} -WorkingDirectory={{ grafana_agent_data_dir }} -{% for key, value in grafana_agent_env_vars.items() %} -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 \ -{% for flag, flag_value in grafana_agent_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 %} - {{ grafana_agent_config_dir }}/{{ grafana_agent_config_filename }} -{% else %} -ExecStart={{ grafana_agent_install_dir }}/{{ grafana_agent_binary }} \ -{% for flag, flag_value in grafana_agent_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 %} - --config.file={{ grafana_agent_config_dir }}/{{ grafana_agent_config_filename }} -{% endif %} - -SyslogIdentifier=grafana-agent -Restart=always - -{% if grafana_agent_systemd_version | int >= 232 %} -ProtectSystem=strict -ProtectControlGroups=true -ProtectKernelModules=true -ProtectKernelTunables=yes -{% else %} -ProtectSystem=full -{% endif %} -ReadWritePaths=/tmp {{ grafana_agent_data_dir }} {{ grafana_agent_positions_dir }} {{ grafana_agent_wal_dir }} - -[Install] -WantedBy=multi-user.target diff --git a/ansible_collections/grafana/grafana/roles/grafana_agent/vars/main.yaml b/ansible_collections/grafana/grafana/roles/grafana_agent/vars/main.yaml deleted file mode 100644 index 092d5e9..0000000 --- a/ansible_collections/grafana/grafana/roles/grafana_agent/vars/main.yaml +++ /dev/null @@ -1,29 +0,0 @@ ---- -_grafana_agent_github_org: grafana -_grafana_agent_github_repo: agent - -# set the go cpu arch -_download_cpu_arch_map: - i386: '386' - x86_64: amd64 - aarch64: arm64 - armv7l: armv7 - armv6l: armv6 - -_grafana_agent_cpu_arch: "{{ _download_cpu_arch_map[ansible_facts['architecture']] | default(ansible_facts['architecture']) }}" - -# set the go os family -_grafana_agent_os_family: "{{ ansible_facts['system'] | lower }}" - -# set the name of the archive file to download -_grafana_agent_download_archive_file: "grafana-agent-{{ _grafana_agent_os_family }}-{{ _grafana_agent_cpu_arch }}.zip" - -# set the name of the binary file -_grafana_agent_download_binary_file: "grafana-agent-{{ _grafana_agent_os_family }}-{{ _grafana_agent_cpu_arch }}" - -# systemd info -_grafana_agent_systemd_dir: /lib/systemd/system/ -_grafana_agent_systemd_unit: grafana-agent.service - -# Server http address, used in self health check after start -_grafana_agent_healthcheck_endpoint: "http://{{ grafana_agent_flags_extra['server.http.address'] if grafana_agent_flags_extra['server.http.address'] is defined else '127.0.0.1:12345' }}/-/ready" diff --git a/ansible_collections/grafana/grafana/roles/loki/README.md b/ansible_collections/grafana/grafana/roles/loki/README.md deleted file mode 100644 index 92b4da4..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/README.md +++ /dev/null @@ -1,247 +0,0 @@ -# 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 setting the "loki_uninstall" variable. -- **🔔 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_uninstall: "false" -``` - -If set to `true` will perfom uninstall instead of deployment. - -```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) -| `loki_bloom_build` | The `bloom_build` block configures the Loki bloom planner and builder servers, responsible for building bloom filters. 📚 [documentation](https://grafana.com/docs/loki/latest/configure/#bloom_build) -| `loki_bloom_gateway` | The `bloom_gateway` block configures the Loki bloom gateway server, responsible for serving queries for filtering chunks based on filter expressions. 📚 [documentation](https://grafana.com/docs/loki/latest/configure/#bloom_gateway) - -## 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 -e "loki_uninstall=true" -``` - -## 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 deleted file mode 100644 index 8718ac2..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/defaults/main.yml +++ /dev/null @@ -1,110 +0,0 @@ ---- -# defaults file for loki -loki_version: "latest" -loki_uninstall: false -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: -# loki_bloom_build: -# loki_bloom_gateway: diff --git a/ansible_collections/grafana/grafana/roles/loki/handlers/main.yml b/ansible_collections/grafana/grafana/roles/loki/handlers/main.yml deleted file mode 100644 index 7610449..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/handlers/main.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -# handlers file for loki -- name: Restart loki - listen: "restart loki" - ansible.builtin.systemd: - daemon_reload: true - name: loki.service - state: restarted - enabled: true - when: not ansible_check_mode diff --git a/ansible_collections/grafana/grafana/roles/loki/meta/main.yml b/ansible_collections/grafana/grafana/roles/loki/meta/main.yml deleted file mode 100644 index b66e783..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/meta/main.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- -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 deleted file mode 100644 index 1f2ce7f..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/molecule/default/converge.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -- 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 deleted file mode 100644 index 339965a..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/molecule/default/molecule.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -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 deleted file mode 100644 index 1532b32..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/tasks/deploy.yml +++ /dev/null @@ -1,150 +0,0 @@ ---- -# 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 - check_mode: false - 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_facts['os_family'] in ['RedHat', 'Rocky'] - -- name: Include Debian/Ubuntu setup - ansible.builtin.include_tasks: - file: setup-Debian.yml - when: ansible_facts['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 - when: not ansible_check_mode - -- 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 - - not ansible_check_mode diff --git a/ansible_collections/grafana/grafana/roles/loki/tasks/main.yml b/ansible_collections/grafana/grafana/roles/loki/tasks/main.yml deleted file mode 100644 index 8e9a63f..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/tasks/main.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -# tasks file for loki -- name: Include OS specific variables - ansible.builtin.include_vars: - file: "{{ ansible_facts['os_family'] }}.yml" - -- name: Deploy Loki service - ansible.builtin.include_tasks: - file: "deploy.yml" - when: not loki_uninstall - -- name: Uninstall Loki service - ansible.builtin.include_tasks: - file: "uninstall.yml" - when: loki_uninstall diff --git a/ansible_collections/grafana/grafana/roles/loki/tasks/setup-Debian.yml b/ansible_collections/grafana/grafana/roles/loki/tasks/setup-Debian.yml deleted file mode 100644 index c71af7f..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/tasks/setup-Debian.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -- 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 deleted file mode 100644 index 91e60c5..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/tasks/setup-RedHat.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -- 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 deleted file mode 100644 index d82b65f..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/tasks/uninstall.yml +++ /dev/null @@ -1,51 +0,0 @@ ---- -# 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_facts['os_family'] in ['RedHat', 'Rocky'] - -- name: Uninstall Loki deb package - ansible.builtin.apt: - name: "loki" - state: absent - purge: true - when: ansible_facts['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 deleted file mode 100644 index 60be6f5..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/templates/config.yml.j2 +++ /dev/null @@ -1,107 +0,0 @@ -{% 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 loki_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 %} -{% if loki_bloom_build is defined %} -bloom_build: - {{ loki_bloom_build | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if loki_bloom_gateway is defined %} -bloom_gateway: - {{ loki_bloom_gateway | 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 deleted file mode 100644 index a3dc3be..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/templates/rules.yml.j2 +++ /dev/null @@ -1,3 +0,0 @@ ---- -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 deleted file mode 100644 index e98017c..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/vars/Debian.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -__loki_arch_map: - x86_64: 'amd64' - armv6l: 'arm' - armv7l: 'arm' - aarch64: 'arm64' - -__loki_arch: "{{ __loki_arch_map[ansible_facts['architecture']] | default(ansible_facts['architecture']) }}" diff --git a/ansible_collections/grafana/grafana/roles/loki/vars/RedHat.yml b/ansible_collections/grafana/grafana/roles/loki/vars/RedHat.yml deleted file mode 100644 index ed969e7..0000000 --- a/ansible_collections/grafana/grafana/roles/loki/vars/RedHat.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -__loki_arch: "{{ ansible_facts['architecture'] }}" diff --git a/ansible_collections/grafana/grafana/roles/mimir/README.md b/ansible_collections/grafana/grafana/roles/mimir/README.md deleted file mode 100644 index 2606152..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/README.md +++ /dev/null @@ -1,109 +0,0 @@ -# Ansible role - Mimir - -[![License](https://img.shields.io/github/license/grafana/grafana-ansible-collection)](LICENSE) - -This role installs and configures a [Mimir](https://grafana.com/docs/mimir/latest/) -standalone application. - -## Testing with Molecule - -To be able to test this collection locally, we use Molecule. Molecule is an Ansible test tool 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 dependencies, use the following commands: - -```sh -# 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 ansible-core==2.16 'molecule-plugins[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 - -```sh -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: - -```sh -molecule converge -## example: molecule converge -``` - -When Ansible has succesfully ran, you can run assertions against your infrastructure using. - -```sh -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_uninstall | bool | false | If set to `true` will perfom uninstall instead of deployment. | -| 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_memberlist.join_members | [] | List of members for the Mimir cluster | - -## **Additional Config Variables for `/etc/mimir/config.yml`** - -Below variables allow you to extend Mimir configuration to fit your needs. -Always refer to official [Mimir configuration](https://grafana.com/docs/mimir/latest/configure/about-configurations/) -to obtain possible configuration parameters. - -> [!NOTE] -> These variables are not set by default. - -| Name | Description | -| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `mimir_blocks_storage` | Configures the `blocks_storage` component. 📚 [documentation](https://grafana.com/docs/mimir/latest/configure/configuration-parameters/#blocks_storage) | -| `mimir_ruler_storage` | Configures the `ruler_storage` component. 📚 [documentation](https://grafana.com/docs/mimir/latest/configure/configuration-parameters/#ruler_storage) | -| `mimir_alertmanager_storage` | Configures the `alertmanager_storage` component. 📚 [documentation](https://grafana.com/docs/mimir/latest/configure/configuration-parameters/#alertmanager_storage) | -| `mimir_distributor` | Configures the `distributor` component. 📚 [documentation](https://grafana.com/docs/mimir/latest/configure/configuration-parameters/#distributor) | -| `mimir_ingester` | Configures the `ingester` component. 📚 [documentation](https://grafana.com/docs/mimir/latest/configure/configuration-parameters/#ingester) | -| `mimir_querier` | Configures the `querier` component. 📚 [documentation](https://grafana.com/docs/mimir/latest/configure/configuration-parameters/#querier) | - -For extra configuration samples refer to [`examples` directory](../../examples). diff --git a/ansible_collections/grafana/grafana/roles/mimir/defaults/main.yml b/ansible_collections/grafana/grafana/roles/mimir/defaults/main.yml deleted file mode 100644 index 64efd46..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/defaults/main.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- -# defaults file for mimir -mimir_version: "latest" -mimir_uninstall: false -__mimir_arch: "{{ arch_mapping[ansible_facts['architecture']] | default('amd64') }}" -mimir_download_url_rpm: "https://github.com/grafana/mimir/releases/download/mimir-{{ mimir_version }}/mimir-{{ mimir_version }}_{{ __mimir_arch }}.rpm" -mimir_download_url_deb: "https://github.com/grafana/mimir/releases/download/mimir-{{ mimir_version }}/mimir-{{ 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" - -arch_mapping: - x86_64: amd64 - aarch64: arm64 - armv7l: armhf - i386: i386 - ppc64le: ppc64le - -mimir_server: - http_listen_port: "{{ mimir_http_listen_port }}" - http_listen_address: "{{ mimir_http_listen_address }}" - -mimir_ruler: - rule_path: "{{ mimir_working_path }}/ruler" - alertmanager_url: "http://localhost:{{ mimir_http_listen_port }}/alertmanager" - -mimir_alertmanager: - data_dir: "{{ mimir_working_path }}/alertmanager" - external_url: "http://localhost:{{ mimir_http_listen_port }}/alertmanager" - diff --git a/ansible_collections/grafana/grafana/roles/mimir/files/.gitkeep b/ansible_collections/grafana/grafana/roles/mimir/files/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/ansible_collections/grafana/grafana/roles/mimir/handlers/main.yml b/ansible_collections/grafana/grafana/roles/mimir/handlers/main.yml deleted file mode 100644 index 22251ca..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/handlers/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - -- 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 deleted file mode 100644 index 596fca2..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/meta/main.yml +++ /dev/null @@ -1,37 +0,0 @@ ---- -# 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 deleted file mode 100644 index 57a36c0..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/molecule/default/converge.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- -- 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 deleted file mode 100644 index 2790af5..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/molecule/default/molecule.yml +++ /dev/null @@ -1,60 +0,0 @@ ---- -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 deleted file mode 100644 index 671a5ad..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/molecule/default/tests/test_default.py +++ /dev/null @@ -1,36 +0,0 @@ -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/tasks/deploy.yml b/ansible_collections/grafana/grafana/roles/mimir/tasks/deploy.yml deleted file mode 100644 index 622c602..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/tasks/deploy.yml +++ /dev/null @@ -1,111 +0,0 @@ ---- -# 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_facts['os_family'] in ['RedHat', 'Rocky'] - -- name: Include Debian/Ubuntu setup - ansible.builtin.include_tasks: - file: setup-Debian.yml - when: ansible_facts['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: 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: 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" - validate: "mimir -modules --config.file=%s" - environment: - PATH: "/usr/local/bin:{{ ansible_env.PATH }}" - notify: - - Restart mimir - -- name: Ensure restart has completed - ansible.builtin.meta: flush_handlers - -- 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://{{ mimir_http_listen_address }}:{{ 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 deleted file mode 100644 index 4e4e8c7..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/tasks/main.yml +++ /dev/null @@ -1,9 +0,0 @@ -- name: Deploy Mimir service - ansible.builtin.include_tasks: - file: "deploy.yml" - when: not mimir_uninstall - -- name: Uninstall Mimir service - ansible.builtin.include_tasks: - file: "uninstall.yml" - when: mimir_uninstall diff --git a/ansible_collections/grafana/grafana/roles/mimir/tasks/setup-Debian.yml b/ansible_collections/grafana/grafana/roles/mimir/tasks/setup-Debian.yml deleted file mode 100644 index 7028ed4..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/tasks/setup-Debian.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -- 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 deleted file mode 100644 index 5bc34a9..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/tasks/setup-Redhat.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -- 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 deleted file mode 100644 index 11fe910..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/tasks/uninstall.yml +++ /dev/null @@ -1,51 +0,0 @@ ---- -# 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_facts['os_family'] in ['RedHat', 'Rocky'] - -- name: Uninstall Mimir deb package - ansible.builtin.apt: - name: "mimir" - state: absent - purge: true - when: ansible_facts['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 deleted file mode 100644 index e69de29..0000000 diff --git a/ansible_collections/grafana/grafana/roles/mimir/templates/config.yml.j2 b/ansible_collections/grafana/grafana/roles/mimir/templates/config.yml.j2 deleted file mode 100644 index 4b88b23..0000000 --- a/ansible_collections/grafana/grafana/roles/mimir/templates/config.yml.j2 +++ /dev/null @@ -1,67 +0,0 @@ -# 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 %} - -{% if mimir_distributor is defined %} -distributor: - {{ mimir_distributor | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} -{% endif %} - -{% if mimir_ingester is defined %} -ingester: - {{ mimir_ingester | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False)}} -{% endif %} - -{% if mimir_querier is defined %} -querier: - {{ mimir_querier | 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 deleted file mode 100644 index e69de29..0000000 diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/README.md b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/README.md deleted file mode 100644 index 3ee2eb8..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# 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 installed 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. Set to 'latest' to automatically determine and install the latest release | `"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_facts['architecture']` values to OpenTelemetry Collector binary architecture names. | See below\* | -| `otel_collector_arch` | Architecture for the OpenTelemetry Collector binary, determined based on the `ansible_facts['architecture']` fact. | `"{{ arch_mapping[ansible_facts['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_service_statedirectory` | The directory systemd should create under `/var/lib`. | `"otel-collector"` | -| `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 deleted file mode 100644 index 13e7b5a..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/defaults/main.yml +++ /dev/null @@ -1,30 +0,0 @@ -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" - -otel_collector_latest_url: 'https://api.github.com/repos/open-telemetry/opentelemetry-collector-releases/releases/latest' - -arch_mapping: - x86_64: amd64 - aarch64: arm64 - armv7l: armhf - i386: i386 - ppc64le: ppc64le - -otel_collector_arch: "{{ arch_mapping[ansible_facts['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_service_statedirectory: "otel-collector" - -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 deleted file mode 100644 index ac8fa58..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/handlers/main.yml +++ /dev/null @@ -1,6 +0,0 @@ -- name: Restart OpenTelemetry Collector - ansible.builtin.systemd: - name: "{{ otel_collector_service_name }}" - state: restarted - become: true - ignore_errors: '{{ ansible_check_mode | bool }}' diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/meta/main.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/meta/main.yml deleted file mode 100644 index edd9779..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/meta/main.yml +++ /dev/null @@ -1,25 +0,0 @@ -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/molecule/default-check-first/converge.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default-check-first/converge.yml deleted file mode 100644 index 7d0801e..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default-check-first/converge.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -- name: "Run role" - hosts: all - any_errors_fatal: true - roles: - - grafana.grafana.opentelemetry_collector - vars: - otel_collector_receivers: - hostmetrics: - scrapers: - cpu: - memory: - otel_collector_processors: - memory_limiter: - check_interval: 2s - limit_percentage: 80 - spike_limit_percentage: 25 - batch: - otel_collector_exporters: - prometheus: - endpoint: '127.0.0.1:9999' - otel_collector_service: - pipelines: - metrics: - receivers: '{{ otel_collector_receivers.keys() }}' - processors: '{{ otel_collector_processors.keys() }}' - exporters: '{{ otel_collector_exporters.keys() }}' diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default-check-first/molecule.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default-check-first/molecule.yml deleted file mode 100644 index f46067e..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default-check-first/molecule.yml +++ /dev/null @@ -1,57 +0,0 @@ ---- -# This scenario verifies that we can run ansible on an unprovisioned machine in check-mode -scenario: - name: default-check-first - test_sequence: - - dependency - - cleanup - - destroy - - create - - prepare - - check - - cleanup - - destroy - -platforms: - - name: almalinux-9 - image: dokken/almalinux-9 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: centos-stream-9 - image: dokken/centos-stream-9 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: debian-11 - image: dokken/debian-11 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: fedora-36 - image: dokken/fedora-36 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: fedora-37 - image: dokken/fedora-37 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-20.04 - image: dokken/ubuntu-20.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-22.04 - image: dokken/ubuntu-22.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default-check-first/tests/test_default.py b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default-check-first/tests/test_default.py deleted file mode 100644 index f773241..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default-check-first/tests/test_default.py +++ /dev/null @@ -1,35 +0,0 @@ -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/otel-collector", - ] - files = ["/etc/otel-collector/config.yaml"] - 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("otel-collector") - # assert s.is_enabled - assert s.is_running - - -def test_socket(host): - assert host.socket("tcp://127.0.0.1:9999").is_listening diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default/converge.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default/converge.yml deleted file mode 100644 index 7d0801e..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default/converge.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -- name: "Run role" - hosts: all - any_errors_fatal: true - roles: - - grafana.grafana.opentelemetry_collector - vars: - otel_collector_receivers: - hostmetrics: - scrapers: - cpu: - memory: - otel_collector_processors: - memory_limiter: - check_interval: 2s - limit_percentage: 80 - spike_limit_percentage: 25 - batch: - otel_collector_exporters: - prometheus: - endpoint: '127.0.0.1:9999' - otel_collector_service: - pipelines: - metrics: - receivers: '{{ otel_collector_receivers.keys() }}' - processors: '{{ otel_collector_processors.keys() }}' - exporters: '{{ otel_collector_exporters.keys() }}' diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default/molecule.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default/molecule.yml deleted file mode 100644 index 6258bc2..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default/molecule.yml +++ /dev/null @@ -1,44 +0,0 @@ ---- -platforms: - - name: almalinux-9 - image: dokken/almalinux-9 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: centos-stream-9 - image: dokken/centos-stream-9 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: debian-11 - image: dokken/debian-11 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: fedora-36 - image: dokken/fedora-36 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: fedora-37 - image: dokken/fedora-37 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-20.04 - image: dokken/ubuntu-20.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-22.04 - image: dokken/ubuntu-22.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default/tests/test_default.py b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default/tests/test_default.py deleted file mode 100644 index 9f42fce..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/default/tests/test_default.py +++ /dev/null @@ -1,33 +0,0 @@ -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/otel-collector", "/var/lib/otel-collector"] - files = ["/etc/otel-collector/config.yaml"] - 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("otel-collector") - # assert s.is_enabled - assert s.is_running - - -def test_socket(host): - assert host.socket("tcp://127.0.0.1:9999").is_listening diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/latest/converge.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/latest/converge.yml deleted file mode 100644 index 9d62bd9..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/latest/converge.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- -- name: "Run role" - hosts: all - any_errors_fatal: true - roles: - - grafana.grafana.opentelemetry_collector - vars: - otel_collector_version: latest - otel_collector_receivers: - hostmetrics: - scrapers: - cpu: - memory: - otel_collector_processors: - memory_limiter: - check_interval: 2s - limit_percentage: 80 - spike_limit_percentage: 25 - batch: - otel_collector_exporters: - prometheus: - endpoint: '127.0.0.1:9999' - otel_collector_service: - pipelines: - metrics: - receivers: '{{ otel_collector_receivers.keys() }}' - processors: '{{ otel_collector_processors.keys() }}' - exporters: '{{ otel_collector_exporters.keys() }}' diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/latest/molecule.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/latest/molecule.yml deleted file mode 100644 index 6258bc2..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/latest/molecule.yml +++ /dev/null @@ -1,44 +0,0 @@ ---- -platforms: - - name: almalinux-9 - image: dokken/almalinux-9 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: centos-stream-9 - image: dokken/centos-stream-9 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: debian-11 - image: dokken/debian-11 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: fedora-36 - image: dokken/fedora-36 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: fedora-37 - image: dokken/fedora-37 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-20.04 - image: dokken/ubuntu-20.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-22.04 - image: dokken/ubuntu-22.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/latest/tests/test_default.py b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/latest/tests/test_default.py deleted file mode 100644 index f773241..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/latest/tests/test_default.py +++ /dev/null @@ -1,35 +0,0 @@ -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/otel-collector", - ] - files = ["/etc/otel-collector/config.yaml"] - 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("otel-collector") - # assert s.is_enabled - assert s.is_running - - -def test_socket(host): - assert host.socket("tcp://127.0.0.1:9999").is_listening diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/non-contrib/converge.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/non-contrib/converge.yml deleted file mode 100644 index 92d542d..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/non-contrib/converge.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -- name: "Run role" - hosts: all - any_errors_fatal: true - roles: - - grafana.grafana.opentelemetry_collector - vars: - otel_collector_type: '' - otel_collector_receivers: - hostmetrics: - scrapers: - cpu: - memory: - otel_collector_processors: - memory_limiter: - check_interval: 2s - limit_percentage: 80 - spike_limit_percentage: 25 - batch: - otel_collector_exporters: - debug: - otel_collector_service: - pipelines: - metrics: - receivers: '{{ otel_collector_receivers.keys() }}' - processors: '{{ otel_collector_processors.keys() }}' - exporters: '{{ otel_collector_exporters.keys() }}' diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/non-contrib/molecule.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/non-contrib/molecule.yml deleted file mode 100644 index 6258bc2..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/non-contrib/molecule.yml +++ /dev/null @@ -1,44 +0,0 @@ ---- -platforms: - - name: almalinux-9 - image: dokken/almalinux-9 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: centos-stream-9 - image: dokken/centos-stream-9 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: debian-11 - image: dokken/debian-11 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: fedora-36 - image: dokken/fedora-36 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: fedora-37 - image: dokken/fedora-37 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-20.04 - image: dokken/ubuntu-20.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd - - name: ubuntu-22.04 - image: dokken/ubuntu-22.04 - pre_build_image: true - privileged: true - cgroup_parent: docker.slice - command: /lib/systemd/systemd diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/non-contrib/tests/test_default.py b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/non-contrib/tests/test_default.py deleted file mode 100644 index ec37d6e..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/molecule/non-contrib/tests/test_default.py +++ /dev/null @@ -1,31 +0,0 @@ -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/otel-collector", - ] - files = ["/etc/otel-collector/config.yaml"] - 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("otel-collector") - # assert s.is_enabled - assert s.is_running diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/configure.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/configure.yml deleted file mode 100644 index fc59647..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/configure.yml +++ /dev/null @@ -1,20 +0,0 @@ -- 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' - validate: '{{ otel_collector_installation_dir }}/{{ otel_collector_executable }} --config=%s validate' - notify: Restart OpenTelemetry Collector - become: true - no_log: "{{ 'false' if lookup('env', 'CI') else '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 deleted file mode 100644 index 95b5de0..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/install.yml +++ /dev/null @@ -1,79 +0,0 @@ -- name: Discover latest OpenTelemetry Collector version - ansible.builtin.set_fact: - otel_collector_version: "{{ (lookup('url', otel_collector_latest_url, split_lines=False) | from_json).get('tag_name') | replace('v', '') }}" - run_once: true - until: otel_collector_version is version('0.0.0', '>=') - retries: 10 - when: - - otel_collector_version == 'latest' - -- name: Discover installed version - block: - - name: Get installed version - register: otel_collector_version_check - changed_when: false - failed_when: false - check_mode: false # Always run, this does not change anything on the system - ansible.builtin.command: '{{ otel_collector_installation_dir }}/{{ otel_collector_executable }} -v' - - - name: Set installed version variable - ansible.builtin.set_fact: - otel_collector_installed_version: "{{ otel_collector_version_check.stdout_lines[0] | default('otelcorecol version 0.0.0') | ansible.builtin.regex_search('\\d+\\.\\d+\\.\\d+') }}" - -- 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_facts['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 - when: otel_collector_installed_version is version(otel_collector_version, '!=') - -- name: Remove existing OpenTelemetry Collector installation directory - ansible.builtin.file: - path: "{{ otel_collector_installation_dir }}" - state: absent - become: true - when: otel_collector_installed_version is version(otel_collector_version, '!=') - -- 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 - when: not ansible_check_mode and otel_collector_installed_version is version(otel_collector_version, '!=') diff --git a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/main.yml b/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/main.yml deleted file mode 100644 index 6557285..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/main.yml +++ /dev/null @@ -1,11 +0,0 @@ -- 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 deleted file mode 100644 index a0d180b..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/tasks/service.yml +++ /dev/null @@ -1,20 +0,0 @@ -- 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 - ignore_errors: '{{ ansible_check_mode | bool }}' 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 deleted file mode 100644 index 87fae9e..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/templates/otel_collector.service.j2 +++ /dev/null @@ -1,14 +0,0 @@ -[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 -StateDirectory={{ otel_collector_service_statedirectory }} - -[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 deleted file mode 100644 index 130189b..0000000 --- a/ansible_collections/grafana/grafana/roles/opentelemetry_collector/templates/otel_collector_config.yml.j2 +++ /dev/null @@ -1,24 +0,0 @@ -{% 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 deleted file mode 100644 index 94dde21..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/README.md +++ /dev/null @@ -1,175 +0,0 @@ -# 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 setting the "promtail_uninstall" variable. - -📢 **[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_uninstall: "false" -``` - -If set to `true` will perfom uninstall instead of deployment. - -```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_extra_flags: [] -``` -Additional flags to be passed to the Promtail systemd unit. - -```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_facts['fqdn'] }}" - __path__: /var/log/messages - - targets: - - localhost - labels: - job: nginx - instance: "{{ ansible_facts['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_facts['fqdn'] }}" - __path__: /var/log/messages - - targets: - - localhost - labels: - job: nginx - instance: "{{ ansible_facts['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 -e "promtail_uninstall=true" -``` - -## 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 deleted file mode 100644 index 4753f56..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/defaults/main.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- -# defaults file for promtail -promtail_version: "latest" -promtail_uninstall: false -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_extra_flags: [] -# promtail_extra_flags: -# - "-server.enable-runtime-reload" -# - "-config.expand-env=true" - -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_facts['fqdn'] }}" -# __path__: /var/log/messages -# - targets: -# - localhost -# labels: -# job: nginx -# instance: "{{ ansible_facts['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 deleted file mode 100644 index 27134f3..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/handlers/main.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -# handlers file for promtail -- name: Restart promtail - listen: "restart promtail" - ansible.builtin.systemd: - daemon_reload: true - name: promtail.service - state: restarted - enabled: true - when: not ansible_check_mode diff --git a/ansible_collections/grafana/grafana/roles/promtail/meta/main.yml b/ansible_collections/grafana/grafana/roles/promtail/meta/main.yml deleted file mode 100644 index c7cee9a..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/meta/main.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- -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 deleted file mode 100644 index 5e177bf..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/molecule/default/converge.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -- name: Converge - hosts: all - vars: - promtail_scrape_configs: - - job_name: test - static_configs: - - targets: - - localhost - labels: - job: test - instance: "{{ ansible_facts['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 deleted file mode 100644 index 339965a..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/molecule/default/molecule.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -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 deleted file mode 100644 index 65516b9..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/tasks/acl_configuration.yml +++ /dev/null @@ -1,116 +0,0 @@ ---- -# 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 deleted file mode 100644 index ee08f1e..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/tasks/deploy.yml +++ /dev/null @@ -1,144 +0,0 @@ ---- -# 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 - check_mode: false - 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_facts['os_family'] in ['RedHat', 'Rocky'] - -- name: Include Debian/Ubuntu setup - ansible.builtin.include_tasks: - file: setup-Debian.yml - when: ansible_facts['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 -config.expand-env=true -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" - - not ansible_check_mode - -- 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 - when: not ansible_check_mode - -- 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 - - not ansible_check_mode diff --git a/ansible_collections/grafana/grafana/roles/promtail/tasks/main.yml b/ansible_collections/grafana/grafana/roles/promtail/tasks/main.yml deleted file mode 100644 index 62d6a4a..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/tasks/main.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -# tasks file for promtail -- name: Include OS specific variables - ansible.builtin.include_vars: - file: "{{ ansible_facts['os_family'] }}.yml" - -- name: Deploy Promtail service - ansible.builtin.include_tasks: - file: "deploy.yml" - when: not promtail_uninstall - -- name: Uninstall Promtail service - ansible.builtin.include_tasks: - file: "uninstall.yml" - when: promtail_uninstall diff --git a/ansible_collections/grafana/grafana/roles/promtail/tasks/setup-Debian.yml b/ansible_collections/grafana/grafana/roles/promtail/tasks/setup-Debian.yml deleted file mode 100644 index 3192279..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/tasks/setup-Debian.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -- 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 deleted file mode 100644 index b50573d..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/tasks/setup-RedHat.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- 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 deleted file mode 100644 index d3dca76..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/tasks/uninstall.yml +++ /dev/null @@ -1,119 +0,0 @@ ---- -# 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_facts['os_family'] in ['RedHat', 'Rocky'] - -- name: Uninstall Promtail deb package - ansible.builtin.apt: - name: "promtail" - state: absent - purge: true - when: ansible_facts['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 deleted file mode 100644 index 8368131..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/templates/config.yml.j2 +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index 3d61449..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/templates/promtail.service.j2 +++ /dev/null @@ -1,24 +0,0 @@ -[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 \ -{% if promtail_extra_flags | length > 0 %} -{% for flag in promtail_extra_flags %} - {{ flag }} \ -{% endfor %} -{% endif %} - -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 deleted file mode 100644 index 4009065..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/templates/promtail_acl.j2 +++ /dev/null @@ -1,13 +0,0 @@ -/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 deleted file mode 100644 index 4b2f3c9..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/vars/Debian.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -__promtail_arch_map: - x86_64: 'amd64' - armv6l: 'arm' - armv7l: 'arm' - aarch64: 'arm64' - -__promtail_arch: "{{ __promtail_arch_map[ansible_facts['architecture']] | default(ansible_facts['architecture']) }}" diff --git a/ansible_collections/grafana/grafana/roles/promtail/vars/RedHat.yml b/ansible_collections/grafana/grafana/roles/promtail/vars/RedHat.yml deleted file mode 100644 index 8527301..0000000 --- a/ansible_collections/grafana/grafana/roles/promtail/vars/RedHat.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -__promtail_arch: "{{ ansible_facts['architecture'] }}" diff --git a/ansible_collections/grafana/grafana/roles/tempo/README.md b/ansible_collections/grafana/grafana/roles/tempo/README.md deleted file mode 100644 index d47f1ac..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Ansible role - Tempo - -[![License](https://img.shields.io/github/license/grafana/grafana-ansible-collection)](LICENSE) - -The Ansible Promtail Role allows you to effortlessly deploy and manage Tempo. -This role is tailored for operating systems such as **RedHat**, **Rocky Linux**, **AlmaLinux**, **Ubuntu**, and **Debian**. - - -## Requirements - -- Ansible 2.10+ - -## License - -See [LICENSE](https://github.com/grafana/grafana-ansible-collection/blob/main/LICENSE) diff --git a/ansible_collections/grafana/grafana/roles/tempo/defaults/main.yml b/ansible_collections/grafana/grafana/roles/tempo/defaults/main.yml deleted file mode 100644 index e4303d8..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/defaults/main.yml +++ /dev/null @@ -1,73 +0,0 @@ ---- -# defaults file for tempo -tempo_version: "latest" -tempo_uninstall: false -__tempo_arch: "{{ arch_mapping[ansible_facts['architecture']] | default('amd64') }}" -tempo_download_url_rpm: "https://github.com/grafana/tempo/releases/download/v{{ tempo_version }}/tempo_{{ tempo_version }}_linux_{{ __tempo_arch }}.rpm" -tempo_download_url_deb: "https://github.com/grafana/tempo/releases/download/v{{ tempo_version }}/tempo_{{ tempo_version }}_linux_{{ __tempo_arch }}.deb" -tempo_working_path: "/var/lib/tempo" -tempo_http_listen_port: 3200 -tempo_http_listen_address: "0.0.0.0" -tempo_log_level: warn -tempo_report_usage: true -tempo_multitenancy_enabled: false - -# Default Variables from /etc/tempo/config.yml -tempo_server: - http_listen_port: "{{ tempo_http_listen_port }}" - http_listen_address: "{{ tempo_http_listen_address }}" - log_level: "{{ tempo_log_level }}" - -tempo_query_frontend: - search: - duration_slo: 5s - throughput_bytes_slo: 1.073741824e+09 - metadata_slo: - duration_slo: 5s - throughput_bytes_slo: 1.073741824e+09 - trace_by_id: - duration_slo: 5s - -tempo_distributor: - receivers: - otlp: - protocols: - grpc: - endpoint: "{{ tempo_http_listen_address }}:4317" - -tempo_metrics_generator: - registry: - external_labels: - source: tempo - cluster: docker-compose - storage: - path: "{{ tempo_working_path }}/generator/wal" - remote_write: - - url: http://prometheus:9090/api/v1/write - send_exemplars: true - traces_storage: - path: "{{ tempo_working_path }}/generator/traces" - -tempo_storage: - trace: - backend: local # backend configuration to use - wal: - path: "{{ tempo_working_path }}/wal" # where to store the wal locally - local: - path: "{{ tempo_working_path }}/blocks" - -tempo_overrides: - defaults: - metrics_generator: - processors: [service-graphs, span-metrics, local-blocks] # enables metrics generator - generate_native_histograms: both - -# Additional Config Variables for /etc/tempo/config.yml -# tempo_ingester: -# tempo_ingester_client: -# tempo_metrics_generator_client: -# tempo_querier: -# tempo_compactor: -# tempo_storage: -# tempo_memberlist: -# tempo_cache: diff --git a/ansible_collections/grafana/grafana/roles/tempo/handlers/main.yml b/ansible_collections/grafana/grafana/roles/tempo/handlers/main.yml deleted file mode 100644 index b0a020d..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/handlers/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- - -- name: Restart tempo - ansible.builtin.systemd: - name: tempo.service - state: restarted diff --git a/ansible_collections/grafana/grafana/roles/tempo/meta/main.yml b/ansible_collections/grafana/grafana/roles/tempo/meta/main.yml deleted file mode 100644 index 5fa0efd..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/meta/main.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- -galaxy_info: - role_name: tempo - author: Grafana - description: Manage Grafana Tempo 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: - - tempo - - grafana - - tracing - - monitoring - -dependencies: [] diff --git a/ansible_collections/grafana/grafana/roles/tempo/molecule/default/converge.yml b/ansible_collections/grafana/grafana/roles/tempo/molecule/default/converge.yml deleted file mode 100644 index fa9c634..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/molecule/default/converge.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -- name: Converge - hosts: all - roles: - - role: grafana.grafana.tempo diff --git a/ansible_collections/grafana/grafana/roles/tempo/molecule/default/molecule.yml b/ansible_collections/grafana/grafana/roles/tempo/molecule/default/molecule.yml deleted file mode 100644 index 339965a..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/molecule/default/molecule.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -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/tempo/tasks/deploy.yml b/ansible_collections/grafana/grafana/roles/tempo/tasks/deploy.yml deleted file mode 100644 index 7d25e3f..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/tasks/deploy.yml +++ /dev/null @@ -1,99 +0,0 @@ ---- -# tasks file for Tempo deployment -- name: Obtain the latest version from the Tempo GitHub repo - when: tempo_version == "latest" - block: - - name: Scrape Github API endpoint to obtain latest Tempo version - ansible.builtin.uri: - url: "https://api.github.com/repos/grafana/tempo/releases/latest" - method: GET - body_format: json - become: false - delegate_to: localhost - run_once: true - register: __github_latest_version - check_mode: false - - - name: Latest available Tempo version - ansible.builtin.set_fact: - tempo_version: "{{ __github_latest_version.json.tag_name | regex_replace('^v?(\\d+\\.\\d+\\.\\d+)$', '\\1') }}" - -- name: Verify current deployed version - block: - - name: Check if Tempo binary is present - ansible.builtin.stat: - path: "/usr/bin/tempo" - register: __already_deployed - - - name: Obtain current deployed Tempo version - ansible.builtin.command: - cmd: "/usr/bin/tempo --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_facts['os_family'] in ['RedHat', 'Rocky'] - -- name: Include Debian/Ubuntu setup - ansible.builtin.include_tasks: - file: setup-Debian.yml - when: ansible_facts['os_family'] == 'Debian' - -- name: Check if Tempo default dir is present - ansible.builtin.stat: - path: "/tmp/tempo/boltdb-shipper-active" - register: __default_structure - -- name: Default structure cleanup - when: __default_structure.stat.exists | bool - block: - - name: Ensure that Tempo is stopped before default cleanup - ansible.builtin.systemd: - name: tempo.service - state: stopped - - - name: Remove default configuration from "/tmp/tempo" directory - ansible.builtin.file: - path: "/tmp/tempo" - state: absent - -- name: Ensure that Tempo working path exists - ansible.builtin.file: - path: "{{ tempo_working_path }}" - state: directory - owner: "tempo" - group: "root" - mode: "0755" - -- name: Template Tempo config - /etc/tempo/config.yml - ansible.builtin.template: - src: "config.yml.j2" - dest: "/etc/tempo/config.yml" - owner: "tempo" - group: "root" - mode: "0644" - validate: "/usr/bin/tempo -config.verify %s" - notify: Restart tempo - -- name: Ensure restart has completed - ansible.builtin.meta: flush_handlers - -- name: Ensure that Tempo is started - ansible.builtin.systemd: - name: tempo.service - state: started - enabled: true - -- name: Verify that Tempo URL is responding - ansible.builtin.uri: - url: "http://{{ tempo_http_listen_address }}:{{ tempo_http_listen_port }}/ready" - method: GET - register: tempo_verify_url_status_code - retries: 5 - delay: 8 - until: tempo_verify_url_status_code.status == 200 - when: - - not ansible_check_mode diff --git a/ansible_collections/grafana/grafana/roles/tempo/tasks/main.yml b/ansible_collections/grafana/grafana/roles/tempo/tasks/main.yml deleted file mode 100644 index 55ccafa..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/tasks/main.yml +++ /dev/null @@ -1,9 +0,0 @@ -- name: Deploy Tempo service - ansible.builtin.include_tasks: - file: "deploy.yml" - when: not tempo_uninstall - -- name: Uninstall Tempo service - ansible.builtin.include_tasks: - file: "uninstall.yml" - when: tempo_uninstall diff --git a/ansible_collections/grafana/grafana/roles/tempo/tasks/setup-Debian.yml b/ansible_collections/grafana/grafana/roles/tempo/tasks/setup-Debian.yml deleted file mode 100644 index 9b823dc..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/tasks/setup-Debian.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -- name: APT - Install Tempo - ansible.builtin.apt: - deb: "{{ tempo_download_url_deb }}" - state: present - notify: Restart tempo - when: __current_deployed_version.stdout is not defined or tempo_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/tempo/tasks/setup-Redhat.yml b/ansible_collections/grafana/grafana/roles/tempo/tasks/setup-Redhat.yml deleted file mode 100644 index bafbfe9..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/tasks/setup-Redhat.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -- name: DNF - Install Tempo from remote URL - ansible.builtin.dnf: - name: "{{ tempo_download_url_rpm }}" - state: present - disable_gpg_check: true - notify: Restart tempo - when: __current_deployed_version.stdout is not defined or tempo_version not in __current_deployed_version.stdout diff --git a/ansible_collections/grafana/grafana/roles/tempo/tasks/uninstall.yml b/ansible_collections/grafana/grafana/roles/tempo/tasks/uninstall.yml deleted file mode 100644 index 4cb659c..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/tasks/uninstall.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -# tasks file for tempo uninstall - -- name: Stop Tempo service - ansible.builtin.systemd: # noqa ignore-errors - name: tempo - state: stopped - ignore_errors: true - -- name: Uninstall Tempo rpm package - ansible.builtin.dnf: - name: "tempo" - state: absent - autoremove: true - when: ansible_facts['os_family'] in ['RedHat', 'Rocky'] - -- name: Uninstall Tempo deb package - ansible.builtin.apt: - name: "tempo" - state: absent - purge: true - when: ansible_facts['os_family'] == 'Debian' - -- name: Remove Tempo directories" - ansible.builtin.file: - path: "{{ remove_me }}" - state: absent - loop: - - "/etc/tempo" - - "{{ tempo_working_path }}" - loop_control: - loop_var: remove_me - -- name: Remove the Tempo system user - ansible.builtin.user: - name: "tempo" - force: true - state: absent - -- name: Remove Tempo system group - ansible.builtin.group: - name: "tempo" - state: absent diff --git a/ansible_collections/grafana/grafana/roles/tempo/templates/config.yml.j2 b/ansible_collections/grafana/grafana/roles/tempo/templates/config.yml.j2 deleted file mode 100644 index 645c6b0..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/templates/config.yml.j2 +++ /dev/null @@ -1,57 +0,0 @@ ---- -server: - {{ tempo_server | to_nice_yaml(indent=2, sort_keys=False) | indent(2, False) }} -{% if tempo_distributor is defined %} -distributor: - {{ tempo_distributor | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_ingester is defined %} -ingester: - {{ tempo_ingester | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_ingester_client is defined %} -ingester_client: - {{ tempo_ingester_client | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_metrics_generator is defined %} -metrics_generator: - {{ tempo_metrics_generator | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_metrics_generator_client is defined %} -metrics_generator_client: - {{ tempo_metrics_generator_client | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_querier is defined %} -querier: - {{ tempo_querier | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_query_frontend is defined %} -query_frontend: - {{ tempo_query_frontend | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_compactor is defined %} -compactor: - {{ tempo_compactor | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_storage is defined %} -storage: - {{ tempo_storage | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_memberlist is defined %} -memberlist: - {{ tempo_memberlist | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_overrides is defined %} -overrides: - {{ tempo_overrides | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_cache is defined %} -cache: - {{ tempo_cache | to_nice_yaml(indent=2,sort_keys=False) | indent(2, False) }} -{% endif %} -{% if tempo_http_api_prefix is defined %} -http_api_prefix: {{ tempo_http_api_prefix }} -{% endif %} -usage_report: - reporting_enabled: {{ tempo_report_usage }} -multitenancy_enabled: {{ tempo_multitenancy_enabled }} diff --git a/ansible_collections/grafana/grafana/roles/tempo/vars/main.yml b/ansible_collections/grafana/grafana/roles/tempo/vars/main.yml deleted file mode 100644 index cc53510..0000000 --- a/ansible_collections/grafana/grafana/roles/tempo/vars/main.yml +++ /dev/null @@ -1,6 +0,0 @@ -__tempo_arch_map: - x86_64: 'amd64' - armv6l: 'arm' - armv7l: 'arm' - aarch64: 'arm64' -__tempo_arch: "{{ __tempo_arch_map[ansible_facts['architecture']] | default(ansible_facts['architecture']) }}" diff --git a/ansible_collections/grafana/grafana/tests/integration/requirements.txt b/ansible_collections/grafana/grafana/tests/integration/requirements.txt deleted file mode 100644 index 663bd1f..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests \ No newline at end of file diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/alert_contact_point/tasks/main.yml b/ansible_collections/grafana/grafana/tests/integration/targets/alert_contact_point/tasks/main.yml deleted file mode 100644 index 8ba5afa..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/alert_contact_point/tasks/main.yml +++ /dev/null @@ -1,80 +0,0 @@ ---- -- name: Create Alerting contact point - grafana.grafana.alert_contact_point: - name: ops-email - uid: opsemail - type: email - settings: - addresses: ops@mydomain.com,devs@mydomain.com - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: present - register: add_result - -- name: Add Check - ansible.builtin.assert: - that: - - add_result.failed == false - - add_result.output.provenance == "api" - -- name: Idempotency Check - grafana.grafana.alert_contact_point: - name: ops-email - uid: opsemail - type: email - settings: - addresses: ops@mydomain.com,devs@mydomain.com - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: present - register: idempotent_result - -- name: Changed Check - ansible.builtin.assert: - that: - - idempotent_result.changed == false - - idempotent_result.output.provenance == "api" - -- name: Update Alerting contact point - grafana.grafana.alert_contact_point: - name: ops-email - uid: opsemail - type: email - settings: - addresses: "ops@mydomain.com,devs@mydomain.com,admin@mydomain.com" - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: present - register: update_result - -- name: Failed Check - ansible.builtin.assert: - that: - - update_result.failed == false - - update_result.output.provenance == "api" - -- name: Delete Alerting contact point - grafana.grafana.alert_contact_point: - name: ops-email - uid: opsemail - type: email - settings: - addresses: "ops@mydomain.com,devs@mydomain.com,admin@mydomain.com" - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: absent - register: delete_result - -- name: Delete Check - ansible.builtin.assert: - that: - - delete_result.failed == false - - delete_result.output.message == "contactpoint deleted" diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/alert_notification_policy/tasks/main.yml b/ansible_collections/grafana/grafana/tests/integration/targets/alert_notification_policy/tasks/main.yml deleted file mode 100644 index 1e051fc..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/alert_notification_policy/tasks/main.yml +++ /dev/null @@ -1,17 +0,0 @@ -- name: Set Notification policy tree - grafana.grafana.alert_notification_policy: - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - routes: [ - { - receiver: grafana-default-email, - object_matchers: [["env", "=", "Production"]], - } - ] - register: result - -- assert: - that: - - result.failed == false diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/cloud_api_key/tasks/main.yml b/ansible_collections/grafana/grafana/tests/integration/targets/cloud_api_key/tasks/main.yml deleted file mode 100644 index 3e83a68..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/cloud_api_key/tasks/main.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- -- name: Create Grafana Cloud API key - grafana.grafana.cloud_api_key: - name: ansible-integration-test - role: Admin - org_slug: "{{ org_name }}" - existing_cloud_api_key: "{{ grafana_cloud_api_key }}" - fail_if_already_created: false - state: present - register: add_result - -- name: Add Check - ansible.builtin.assert: - that: - - add_result.output.name == "ansible-integration-test" - when: add_result.output.name is defined - -- name: Re-run previous task - grafana.grafana.cloud_api_key: - name: ansible-integration-test - role: Admin - org_slug: "{{ org_name }}" - existing_cloud_api_key: "{{ grafana_cloud_api_key }}" - fail_if_already_created: false - state: present - register: update_result - -- name: Update Check - ansible.builtin.assert: - that: - - update_result.output == "A Cloud API key with the same name already exists" - -- name: Delete Grafana Cloud API key - grafana.grafana.cloud_api_key: - name: ansible-integration-test - role: Admin - org_slug: "{{ org_name }}" - existing_cloud_api_key: "{{ grafana_cloud_api_key }}" - state: absent - register: delete_result - -- name: Delete Check - ansible.builtin.assert: - that: - - delete_result.output == "Cloud API key is deleted" diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/cloud_plugin/tasks/main.yml b/ansible_collections/grafana/grafana/tests/integration/targets/cloud_plugin/tasks/main.yml deleted file mode 100644 index 2bb0ab2..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/cloud_plugin/tasks/main.yml +++ /dev/null @@ -1,56 +0,0 @@ ---- -- name: Add a plugin - grafana.grafana.cloud_plugin: - name: grafana-github-datasource - version: 1.0.14 - stack_slug: "{{ test_stack_name }}" - cloud_api_key: "{{ grafana_cloud_api_key }}" - state: present - register: add_result - -- name: Add Check - ansible.builtin.assert: - that: - - add_result.pluginName == "GitHub" - -- name: Idempotency Check - grafana.grafana.cloud_plugin: - name: grafana-github-datasource - version: 1.0.14 - stack_slug: "{{ test_stack_name }}" - cloud_api_key: "{{ grafana_cloud_api_key }}" - state: present - register: idempotency_result - -- name: Idempotency Check - ansible.builtin.assert: - that: - - idempotency_result.pluginName == "GitHub" - -- name: Update a plugin - grafana.grafana.cloud_plugin: - name: grafana-github-datasource - version: 1.0.15 - stack_slug: "{{ test_stack_name }}" - cloud_api_key: "{{ grafana_cloud_api_key }}" - state: present - register: update_result - -- name: Update Check - ansible.builtin.assert: - that: - - update_result.pluginName == "GitHub" - -- name: Delete a plugin - grafana.grafana.cloud_plugin: - name: grafana-github-datasource - version: 1.0.15 - stack_slug: "{{ test_stack_name }}" - cloud_api_key: "{{ grafana_cloud_api_key }}" - state: absent - register: delete_result - -- name: Delete Check - ansible.builtin.assert: - that: - - delete_result.pluginName == "GitHub" diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/create_cloud_stack/tasks/main.yml b/ansible_collections/grafana/grafana/tests/integration/targets/create_cloud_stack/tasks/main.yml deleted file mode 100644 index 642b528..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/create_cloud_stack/tasks/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- name: Create a Grafana Cloud stack - grafana.grafana.cloud_stack: - name: "{{ test_stack_name }}" - stack_slug: "{{ test_stack_name }}" - cloud_api_key: "{{ grafana_cloud_api_key }}" - org_slug: "{{ org_name }}" - state: present - register: create_result - -- name: Create Check - ansible.builtin.assert: - that: - - create_result.url == "https://" + "{{ test_stack_name }}" + ".grafana.net" - -- name: Sleep for 45 seconds - ansible.builtin.wait_for: - timeout: 45 diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/dashboard/tasks/main.yml b/ansible_collections/grafana/grafana/tests/integration/targets/dashboard/tasks/main.yml deleted file mode 100644 index 1e3ee48..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/dashboard/tasks/main.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- -- name: Create/Update a dashboard - grafana.grafana.dashboard: - dashboard: - dashboard: - uid: test1234 - title: Ansible Integration Test - tags: - - templated - timezone: browser - schemaVersion: 16 - refresh: 25s - version: 0 - overwrite: true - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: present - register: result_present - -- name: Create/Update Check - ansible.builtin.assert: - that: - - result_present.changed == true - - result_present.output.status == "success" - -- name: Delete dashboard - grafana.grafana.dashboard: - dashboard: - dashboard: - uid: test1234 - title: Ansible Integration Test - tags: - - templated - timezone: browser - schemaVersion: 16 - version: 0 - refresh: 25s - overwrite: true - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: absent - register: result_absent - -- name: Delete Check - ansible.builtin.assert: - that: - - result_absent.changed == true - - result_absent.output.message == "Dashboard Ansible Integration Test deleted" diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/datasource/tasks/main.yml b/ansible_collections/grafana/grafana/tests/integration/targets/datasource/tasks/main.yml deleted file mode 100644 index cd80d2a..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/datasource/tasks/main.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- -- name: Create/Update a Data Source - grafana.grafana.datasource: - dataSource: - name: ansible-integration - type: influxdb - url: https://grafana.github.com/grafana-ansible-collection - user: user - secureJsonData: - password: password - database: db-name - id: 123 - uid: ansibletest - access: proxy - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: present - register: create_result - -- name: Create Check - ansible.builtin.assert: - that: - - create_result.changed == true - - create_result.output.message == "Datasource added" or create_result.output.message == "Datasource updated" - -- name: Delete a Data Source - grafana.grafana.datasource: - dataSource: - name: ansible-integration - type: influxdb - url: https://grafana.github.com/grafana-ansible-collection - user: user - secureJsonData: - password: password - database: db-name - id: 123 - uid: ansibletest - access: proxy - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: absent - register: delete_result - -- name: Delete Check - ansible.builtin.assert: - that: - - delete_result.changed == true - - delete_result.output.response == "Data source deleted" diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/delete_cloud_stack/tasks/main.yml b/ansible_collections/grafana/grafana/tests/integration/targets/delete_cloud_stack/tasks/main.yml deleted file mode 100644 index 39c2e9c..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/delete_cloud_stack/tasks/main.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -- name: Delete a Grafana Cloud stack - grafana.grafana.cloud_stack: - name: "{{ test_stack_name }}" - stack_slug: "{{ test_stack_name }}" - cloud_api_key: "{{ grafana_cloud_api_key }}" - org_slug: "{{ org_name }}" - state: absent - register: delete_result - -- name: Delete Check - ansible.builtin.assert: - that: - - delete_result.changed == true - - delete_result.url == "https://" + "{{ test_stack_name }}" + ".grafana.net" - -- name: Sleep for 45 seconds - ansible.builtin.wait_for: - timeout: 45 diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/folder/tasks/main.yml b/ansible_collections/grafana/grafana/tests/integration/targets/folder/tasks/main.yml deleted file mode 100644 index cebde0f..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/folder/tasks/main.yml +++ /dev/null @@ -1,53 +0,0 @@ ---- -- name: Create/Update a Folder in Grafana - grafana.grafana.folder: - title: Ansible Integration test - uid: test123 - overwrite: true - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: present - register: create_result - -- name: Create Check - ansible.builtin.assert: - that: - - create_result.failed == false - -- name: Delete a folder - grafana.grafana.folder: - title: Ansible Integration test - uid: test123 - overwrite: true - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: absent - register: delete_result - -- name: Delete Check - ansible.builtin.assert: - that: - - delete_result.output.status == 200 - - delete_result.output.response == "Folder has been succesfuly deleted" - -- name: Delete Idempotency Check - grafana.grafana.folder: - title: Ansible Integration test - uid: test123 - overwrite: true - grafana_ini: - server: - root_url: "{{ grafana_url }}" - grafana_api_key: "{{ grafana_api_key }}" - state: absent - register: delete_result - -- name: Delete Check - ansible.builtin.assert: - that: - - delete_result.output.status == 200 - - delete_result.output.response == "Folder does not exist" diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/molecule-grafana-alternative/runme.sh b/ansible_collections/grafana/grafana/tests/integration/targets/molecule-grafana-alternative/runme.sh deleted file mode 100755 index 87129f7..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/molecule-grafana-alternative/runme.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -version="0.1.3" -src="https://github.com/gardar/ansible-test-molecule/releases/download/$version/ansible-test-molecule.sh" - -# shellcheck disable=SC1090 -if [[ -v GITHUB_TOKEN ]] -then - source <(curl -L -s -H "Authorization: token $GITHUB_TOKEN" $src) -else - source <(curl -L -s $src) -fi diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/molecule-grafana-default/runme.sh b/ansible_collections/grafana/grafana/tests/integration/targets/molecule-grafana-default/runme.sh deleted file mode 100755 index 87129f7..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/molecule-grafana-default/runme.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -version="0.1.3" -src="https://github.com/gardar/ansible-test-molecule/releases/download/$version/ansible-test-molecule.sh" - -# shellcheck disable=SC1090 -if [[ -v GITHUB_TOKEN ]] -then - source <(curl -L -s -H "Authorization: token $GITHUB_TOKEN" $src) -else - source <(curl -L -s $src) -fi diff --git a/ansible_collections/grafana/grafana/tests/integration/targets/user/tasks/main.yml b/ansible_collections/grafana/grafana/tests/integration/targets/user/tasks/main.yml deleted file mode 100644 index 9260aca..0000000 --- a/ansible_collections/grafana/grafana/tests/integration/targets/user/tasks/main.yml +++ /dev/null @@ -1,60 +0,0 @@ ---- -- name: Create an User in Grafana - grafana.grafana.user: - login: "grafana_user" - password: "Yeihohghomi2neipuphuakooWeeph3ox" - email: "grafana_user@localhost.local" - name: "grafana user" - grafana_url: "{{ grafana_url }}" - admin_name: "admin" - admin_password: "admin" - state: present - register: create_result - -- name: Create Check - ansible.builtin.assert: - that: - - create_result.failed == false - -- name: Change an User password in Grafana - grafana.grafana.user: - login: "grafana_user" - password: "Yeihohghomi2neipuphuakooWeeph3ox" - grafana_url: "{{ grafana_url }}" - admin_name: "admin" - admin_password: "admin" - state: update_password - register: update_result - -- name: Create Check - ansible.builtin.assert: - that: - - update_result.failed == false - -- name: Delete a user - grafana.grafana.user: - login: "grafana_user" - grafana_url: "{{ grafana_url }}" - admin_name: "admin" - admin_password: "admin" - state: absent - register: delete_result - -- name: Delete Check - ansible.builtin.assert: - that: - - delete_result.failed == false - -- name: Delete Idempotency Check - grafana.grafana.user: - login: "grafana_user" - grafana_url: "{{ grafana_url }}" - admin_name: "admin" - admin_password: "admin" - state: absent - register: delete_result - -- name: Delete Check - ansible.builtin.assert: - that: - - delete_result.failed == false diff --git a/ansible_collections/grafana/grafana/tools/includes/logging.sh b/ansible_collections/grafana/grafana/tools/includes/logging.sh deleted file mode 100755 index 2613495..0000000 --- a/ansible_collections/grafana/grafana/tools/includes/logging.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env bash - -LOG_LEVEL=${LOG_LEVEL:=6} # 7 = debug -> 0 = emergency -NO_COLOR="${NO_COLOR:-}" -# shellcheck disable=SC2034 -TRACE="0" - -# _log -# ----------------------------------- -# Handles all logging, all log messages are output to stderr so stdout can still be piped -# Example: _log "info" "Some message" -# ----------------------------------- -# shellcheck disable=SC2034 -_log () { - local log_level="${1}" # first option is the level, the rest is the message - shift - local color_success="\\x1b[32m" - local color_debug="\\x1b[36m" - local color_info="\\x1b[90m" - local color_notice="\\x1b[34m" - local color_warning="\\x1b[33m" - local color_error="\\x1b[31m" - local color_critical="\\x1b[1;31m" - local color_alert="\\x1b[1;33;41m" - local color_emergency="\\x1b[1;4;5;33;41m" - local colorvar="color_${log_level}" - local color="${!colorvar:-${color_error}}" - local color_reset="\\x1b[0m" - - # If no color is set or a non-recognized terminal is used don't use colors - if [[ "${NO_COLOR:-}" = "true" ]] || { [[ "${TERM:-}" != "xterm"* ]] && [[ "${TERM:-}" != "screen"* ]]; } || [[ ! -t 2 ]]; then - if [[ "${NO_COLOR:-}" != "false" ]]; then - color=""; - color_reset=""; - fi - fi - - # all remaining arguments are to be printed - local log_line="" - - while IFS=$'\n' read -r log_line; do - echo -e "$(date +"%Y-%m-%d %H:%M:%S %Z") ${color}[${log_level}]${color_reset} ${log_line}" 1>&2 - done <<< "${@:-}" -} - -# emergency -# ----------------------------------- -# Handles emergency logging -# ----------------------------------- -emergency() { - _log emergency "${@}"; exit 1; -} - -# success -# ----------------------------------- -# Handles success logging -# ----------------------------------- -success() { - _log success "${@}"; true; -} - -# alert -# ----------------------------------- -# Handles alert logging -# ----------------------------------- -alert() { - [[ "${LOG_LEVEL:-0}" -ge 1 ]] && _log alert "${@}"; - true; -} - -# critical -# ----------------------------------- -# Handles critical logging -# ----------------------------------- -critical() { - [[ "${LOG_LEVEL:-0}" -ge 2 ]] && _log critical "${@}"; - true; -} - -# error -# ----------------------------------- -# Handles error logging -# ----------------------------------- -error() { - [[ "${LOG_LEVEL:-0}" -ge 3 ]] && _log error "${@}"; - true; -} - -# warning -# ----------------------------------- -# Handles warning logging -# ----------------------------------- -warning() { - [[ "${LOG_LEVEL:-0}" -ge 4 ]] && _log warning "${@}"; - true; -} - -# notice -# ----------------------------------- -# Handles notice logging -# ----------------------------------- -notice() { - [[ "${LOG_LEVEL:-0}" -ge 5 ]] && _log notice "${@}"; - true; -} - -# info -# ----------------------------------- -# Handles info logging -# ----------------------------------- -info() { - [[ "${LOG_LEVEL:-0}" -ge 6 ]] && _log info "${@}"; - true; -} - -# debug -# ----------------------------------- -# Handles debug logging and prepends the name of the that called debug in front of the message -# ----------------------------------- -debug() { - [[ "${LOG_LEVEL:-0}" -ge 7 ]] && _log debug "${FUNCNAME[1]}() ${*}"; - true; -} diff --git a/ansible_collections/grafana/grafana/tools/includes/utils.sh b/ansible_collections/grafana/grafana/tools/includes/utils.sh deleted file mode 100755 index 13264ea..0000000 --- a/ansible_collections/grafana/grafana/tools/includes/utils.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env bash - -# heading -# ----------------------------------- -# Print standard heading -# ----------------------------------- -heading() { - local title="${1}" - local message="${2}" - local width="75" - local orange="\\033[38;5;202m" - local reset="\\033[0m" - local bold="\\x1b[1m" - echo "" - echo -e "${orange} ▒▒▓▓▒▒▒▓ ${reset} ____ __ _ _ " - echo -e "${orange} ▓▓▓ ▒ ${reset} / ___| _ __ __ _ / _| __ _ _ __ __ _ | | __ _ | |__ ___ " - echo -e "${orange} ▒▓ ▒▒▒▒▓ ${reset} | | _ | '__| / _ || |_ / _ || '_ \\ / _ | | | / _ || '_ \\ / __|" - echo -e "${orange} ▒▓▓ ▒ ▒▒ ${reset} | |_| || | | (_| || _|| (_| || | | || (_| | | |___ | (_| || |_) | \\__\\" - echo -e "${orange} ▒▓▒ ▒▓ ${reset} \\____||_| \\__,_||_| \\__,_||_| |_| \\__,_| |_____| \\__,_||_.__/ |___/" - echo -e "${orange} ▒▒▒ ▒▒▒ ${reset} " - echo -e "${orange} ▒▒▒▒▒ ${reset} $(repeat $(( ((width - ${#title}) - 2) / 2)) " ")${bold}$title${reset}" - echo -e "${reset} $(repeat $(( ((width - ${#message}) - 2) / 2)) " ")$message${reset}" - echo "" -} - -# repeat -# ----------------------------------- -# Repeat a Character N number of times -# ----------------------------------- -repeat(){ - local times="${1:-80}" - local character="${2:-=}" - local start=1 - local range - range=$(seq "$start" "$times") - local str="" - # shellcheck disable=SC2034 - for i in $range; do - str="$str${character}" - done - echo "$str" -} - -# lintWarning -# ----------------------------------- -# Output a Lint Warning Message -# ----------------------------------- -lintWarning() { - local msg="${1}" - local color_warning="\\x1b[33m" - local color_reset="\\x1b[0m" - local bold="\\x1b[1m" - echo -e " ‣ ${color_warning}${bold}[warn]${color_reset} $msg" -} - -# lintError -# ----------------------------------- -# Output a Lint Error Message -# ----------------------------------- -lintError() { - local msg="${1}" - local color_error="\\x1b[31m" - local color_reset="\\x1b[0m" - local bold="\\x1b[1m" - echo -e " ‣ ${color_error}${bold}[error]${color_reset} $msg" -} diff --git a/ansible_collections/grafana/grafana/tools/lint-ansible.sh b/ansible_collections/grafana/grafana/tools/lint-ansible.sh deleted file mode 100755 index 47cb90b..0000000 --- a/ansible_collections/grafana/grafana/tools/lint-ansible.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -source "$(pwd)/tools/includes/utils.sh" - -source "./tools/includes/logging.sh" - -# output the heading -heading "Grafana Ansible Collection" "Performing Ansible Linting using ansible-lint" - -# make sure pipenv exists -if [[ "$(command -v pipenv)" = "" ]]; then - echo >&2 "pipenv command is required, see (https://pipenv.pypa.io/en/latest/) or run: brew install pipenv"; - exit 1; -fi - -# make sure yamllint exists -if [[ "$(pipenv run pip freeze | grep -c "ansible-lint")" == "0" ]]; then - echo >&2 "ansible-lint command is required, see (https://pypi.org/project/ansible-lint/). Run \"make install\" to install it."; - exit 1; -fi - -# determine whether or not the script is called directly or sourced -(return 0 2>/dev/null) && sourced=1 || sourced=0 - -# run yamllint -echo "$(pwd)/.ansible-lint" -pipenv run ansible-lint --config-file "$(pwd)/.ansible-lint" --strict -statusCode="$?" - -if [[ "$statusCode" == "0" ]]; then - echo "no issues found" - echo "" -fi - -echo "" -# if the script was called by another, send a valid exit code -if [[ "$sourced" == "1" ]]; then - return "$statusCode" -fi diff --git a/ansible_collections/grafana/grafana/tools/lint-editorconfig.sh b/ansible_collections/grafana/grafana/tools/lint-editorconfig.sh deleted file mode 100755 index 9150f00..0000000 --- a/ansible_collections/grafana/grafana/tools/lint-editorconfig.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env bash - -source "$(pwd)/tools/includes/utils.sh" - -source "./tools/includes/logging.sh" - -# output the heading -heading "Grafana Ansible Collection" "Performing Editorconfig Linting using editorconfig-checker" - -# check to see if remark is installed -if [[ ! -f "$(pwd)"/node_modules/.bin/editorconfig-checker ]]; then - emergency "editorconfig-checker node module is not installed, please run: make install"; -fi - -# determine whether or not the script is called directly or sourced -(return 0 2>/dev/null) && sourced=1 || sourced=0 - -statusCode=0 -./node_modules/.bin/editorconfig-checker -config="$(pwd)/.editorconfig" -exclude "LICENSE|.+\.txt|.+\.py" -currentCode="$?" -# only override the statusCode if it is 0 -if [[ "$statusCode" == 0 ]]; then - statusCode="$currentCode" -fi - -if [[ "$statusCode" == "0" ]]; then - echo "no issues found" - echo "" -fi - -echo "" - -# if the script was called by another, send a valid exit code -if [[ "$sourced" == "1" ]]; then - return "$statusCode" -else - exit "$statusCode" -fi diff --git a/ansible_collections/grafana/grafana/tools/lint-markdown.sh b/ansible_collections/grafana/grafana/tools/lint-markdown.sh deleted file mode 100755 index 4d919ed..0000000 --- a/ansible_collections/grafana/grafana/tools/lint-markdown.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash - -source "$(pwd)/tools/includes/utils.sh" - -source "./tools/includes/logging.sh" - -# output the heading -heading "Grafana Ansible Collection" "Performing Markdown Linting using markdownlint" - -# check to see if remark is installed -if [[ ! -f "$(pwd)"/node_modules/.bin/markdownlint-cli2 ]]; then - emergency "markdownlint-cli2 node module is not installed, please run: make install"; -fi - -# determine whether or not the script is called directly or sourced -(return 0 2>/dev/null) && sourced=1 || sourced=0 - -statusCode=0 -while read -r dir; do - info "Checking file/directory: $dir" - ./node_modules/.bin/markdownlint-cli2-config "$(pwd)/.markdownlint.yaml" "$dir" - currentCode="$?" - # if the current code is 0, output the file name for logging purposes - if [[ "$currentCode" == 0 ]]; then - echo -e "\\x1b[32m$dir\\x1b[0m: no issues found" - fi - # only override the statusCode if it is 0 - if [[ "$statusCode" == 0 ]]; then - statusCode="$currentCode" - fi - echo "" -done < <(find . -type f -name "*.md" -not -path "./node_modules/*" -not -path "./.git/*" -print0 | \ - xargs -0 dirname | \ - sort -nr | \ - uniq | \ - sort | \ - xargs printf -- '%s/*.md\n' | \ - sed 's|\./\*\.md|./README.md|' - ) - -echo "" -echo "" - -# if the script was called by another, send a valid exit code -if [[ "$sourced" == "1" ]]; then - return "$statusCode" -else - exit "$statusCode" -fi diff --git a/ansible_collections/grafana/grafana/tools/lint-shell.sh b/ansible_collections/grafana/grafana/tools/lint-shell.sh deleted file mode 100755 index 633c7be..0000000 --- a/ansible_collections/grafana/grafana/tools/lint-shell.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash - -source "$(pwd)/tools/includes/utils.sh" - -source "./tools/includes/logging.sh" - -# output the heading -heading "Grafana Ansible Collection" "Performing Shell Linting using shellcheck" - -# check to see if shellcheck is installed -if [[ "$(command -v shellcheck)" = "" ]]; then - emergency "shellcheck is required if running lint locally, see: (https://shellcheck.net) or run: brew install nvm && nvm install 18"; -fi - -# determine whether or not the script is called directly or sourced -(return 0 2>/dev/null) && sourced=1 || sourced=0 - -statusCode=0 -while read -r file; do - shellcheck \ - --external-sources \ - --shell bash \ - --source-path "$(dirname "$file")" \ - "$file" - currentCode="$?" - # if the current code is 0, output the file name for logging purposes - if [[ "$currentCode" == 0 ]]; then - echo -e "\\x1b[32m$file\\x1b[0m: no issues found" - else - echo "" - fi - # only override the statusCode if it is 0 - if [[ "$statusCode" == 0 ]]; then - statusCode="$currentCode" - fi -done < <(find . -type f -name "*.sh" -not -path "./node_modules/*" -not -path "./.git/*") - -echo "" -echo "" - -# if the script was called by another, send a valid exit code -if [[ "$sourced" == "1" ]]; then - return "$statusCode" -else - exit "$statusCode" -fi diff --git a/ansible_collections/grafana/grafana/tools/lint-text.sh b/ansible_collections/grafana/grafana/tools/lint-text.sh deleted file mode 100755 index 17e4b5d..0000000 --- a/ansible_collections/grafana/grafana/tools/lint-text.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env bash - -source "$(pwd)/tools/includes/utils.sh" - -source "./tools/includes/logging.sh" - -# output the heading -heading "Grafana Ansible Collections" "Performing Text Linting using textlint" - -# check to see if remark is installed -if [[ ! -f "$(pwd)"/node_modules/.bin/textlint ]]; then - emergency "remark node module is not installed, please run: make install"; -fi - -# determine whether or not the script is called directly or sourced -(return 0 2>/dev/null) && sourced=1 || sourced=0 - -statusCode=0 -while read -r file; do - "$(pwd)"/node_modules/.bin/textlint --config "$(pwd)/.textlintrc" "$file" - currentCode="$?" - # if the current code is 0, output the file name for logging purposes - if [[ "$currentCode" == 0 ]]; then - echo -e "\\x1b[32m$file\\x1b[0m: no issues found" - fi - # only override the statusCode if it is 0 - if [[ "$statusCode" == 0 ]]; then - statusCode="$currentCode" - fi -done < <(find . -type f -name "*.md" -not -path "./node_modules/*" -not -path "./.git/*") - -echo "" -echo "" - -# if the script was called by another, send a valid exit code -if [[ "$sourced" == "1" ]]; then - return "$statusCode" -else - exit "$statusCode" -fi diff --git a/ansible_collections/grafana/grafana/tools/lint-yaml.sh b/ansible_collections/grafana/grafana/tools/lint-yaml.sh deleted file mode 100755 index 51deee6..0000000 --- a/ansible_collections/grafana/grafana/tools/lint-yaml.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash - -source "$(pwd)/tools/includes/utils.sh" - -source "./tools/includes/logging.sh" - -# output the heading -heading "Grafana Ansible Collection" "Performing YAML Linting using yamllint" - -# make sure pipenv exists -if [[ "$(command -v pipenv)" = "" ]]; then - echo >&2 "pipenv command is required, see (https://pipenv.pypa.io/en/latest/) or run: brew install pipenv"; - exit 1; -fi - -# make sure yamllint exists -if [[ "$(pipenv run pip freeze | grep -c "yamllint")" == "0" ]]; then - echo >&2 "yamllint command is required, see (https://pypi.org/project/yamllint/). Run \"make install\" to install it."; - exit 1; -fi - -# determine whether or not the script is called directly or sourced -(return 0 2>/dev/null) && sourced=1 || sourced=0 - -# run yamllint -pipenv run yamllint --strict --config-file "$(pwd)/.yamllint" . -statusCode="$?" - -if [[ "$statusCode" == "0" ]]; then - echo "no issues found" - echo "" -fi - -# if the script was called by another, send a valid exit code -if [[ "$sourced" == "1" ]]; then - return "$statusCode" -fi diff --git a/ansible_collections/grafana/grafana/tools/setup.sh b/ansible_collections/grafana/grafana/tools/setup.sh deleted file mode 100755 index 9a047e3..0000000 --- a/ansible_collections/grafana/grafana/tools/setup.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -source "$(pwd)/tools/includes/utils.sh" - -source "./tools/includes/logging.sh" - -# output the heading -heading "Grafana Ansible Collection" "Performing Setup Checks" - -# make sure Node exists -info "Checking to see if Node is installed" -if [[ "$(command -v node)" = "" ]]; then - warning "node is required if running lint locally, see: (https://nodejs.org) or run: brew install nvm && nvm install 18"; -else - success "node is installed" -fi - -# make sure yarn exists -info "Checking to see if yarn is installed" -if [[ "$(command -v yarn)" = "" ]]; then - warning "yarn is required if running lint locally, see: (https://yarnpkg.com) or run: brew install yarn"; -else - success "yarn is installed" -fi - -# make sure shellcheck exists -info "Checking to see if shellcheck is installed" -if [[ "$(command -v shellcheck)" = "" ]]; then - warning "shellcheck is required if running lint locally, see: (https://shellcheck.net) or run: brew install nvm && nvm install 18"; -else - success "shellcheck is installed" -fi - -# make sure pipenv exists -if [[ "$(command -v pipenv)" = "" ]]; then - warning "pipenv command is required, see (https://pipenv.pypa.io/en/latest/) or run: brew install pipenv"; -else - success "pipenv is installed" -fi diff --git a/ansible_collections/grafana/grafana/yarn.lock b/ansible_collections/grafana/grafana/yarn.lock deleted file mode 100644 index 84aa10b..0000000 --- a/ansible_collections/grafana/grafana/yarn.lock +++ /dev/null @@ -1,1721 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@azu/format-text@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@azu/format-text/-/format-text-1.0.2.tgz#abd46dab2422e312bd1bfe36f0d427ab6039825d" - integrity sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg== - -"@azu/style-format@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@azu/style-format/-/style-format-1.0.1.tgz#b3643af0c5fee9d53e69a97c835c404bdc80f792" - integrity sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g== - dependencies: - "@azu/format-text" "^1.0.1" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@textlint/ast-node-types@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/ast-node-types/-/ast-node-types-12.6.1.tgz#35ecefe74e701d7f632c083d4fda89cab1b89012" - integrity sha512-uzlJ+ZsCAyJm+lBi7j0UeBbj+Oy6w/VWoGJ3iHRHE5eZ8Z4iK66mq+PG/spupmbllLtz77OJbY89BYqgFyjXmA== - -"@textlint/ast-node-types@^13.0.2": - version "13.3.1" - resolved "https://registry.yarnpkg.com/@textlint/ast-node-types/-/ast-node-types-13.3.1.tgz#469cab986e43f4ffb39aa5c31d148888a36d2286" - integrity sha512-/qeEjW3hIFpGwESsCkJRroja7mBOlo9wqyx8G4fwayq4FZRvJMm/9DhIo77jd/4wm/VSJcVVr+fs+rVa4jrY5A== - -"@textlint/ast-tester@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/ast-tester/-/ast-tester-12.6.1.tgz#853a438829dbb0aec0456a437b5e3894692e970b" - integrity sha512-Gxiq6xmDR3PnX0RqRGth/Lu5fyFWoXNPfGxXTLORPFpfs8JKPh/eXGhlwc1f0v4VQzPay2KwVl6SGXvJD5qLXw== - dependencies: - "@textlint/ast-node-types" "^12.6.1" - debug "^4.3.4" - -"@textlint/ast-traverse@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/ast-traverse/-/ast-traverse-12.6.1.tgz#644e46c5ef2e946e1fe1ef2452686c8ba2131392" - integrity sha512-Y/j7ip7yDuTjuIV4kTRPVnkJKfpI71U+eqXFnrM9sE2xBA9IsqzqiLQeDY+S5hhfQzmcEnZFtAP0hqrYaT6gNA== - dependencies: - "@textlint/ast-node-types" "^12.6.1" - -"@textlint/config-loader@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/config-loader/-/config-loader-12.6.1.tgz#151e97d9258361267056dbf47fe4a034c84a193e" - integrity sha512-mvChF2pFusxyQC4gFzIgNcZ4izUt7ci+JdXZtGV+DOzykVUuGhgGo3TFTi/ccgYyqZdq9MxJG6I+dvYB1A2Fog== - dependencies: - "@textlint/kernel" "^12.6.1" - "@textlint/module-interop" "^12.6.1" - "@textlint/types" "^12.6.1" - "@textlint/utils" "^12.6.1" - debug "^4.3.4" - rc-config-loader "^4.1.2" - try-resolve "^1.0.1" - -"@textlint/feature-flag@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/feature-flag/-/feature-flag-12.6.1.tgz#20f8a3cf86be939186adc33744ef66084b06067a" - integrity sha512-cY/AraTLdzbwDyAhdpaXB7n1Lw6zA+k+7UaT8mmxMmjs0uYGzdMQa499I0rQatctJ6izrdZXYW0NdUQfG2ugiA== - -"@textlint/fixer-formatter@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/fixer-formatter/-/fixer-formatter-12.6.1.tgz#b05f28b635c8628f588414da7baab01cd1db6daf" - integrity sha512-BMhvoKQbME9LXvl6CfIM/hZckb+IMiAA6ioDvdM3o63N+xDypS42uzJNpRgzXKGYL1Dv/7R1hsmDzz3fgvGhBw== - dependencies: - "@textlint/module-interop" "^12.6.1" - "@textlint/types" "^12.6.1" - chalk "^4.1.2" - debug "^4.3.4" - diff "^4.0.2" - is-file "^1.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - try-resolve "^1.0.1" - -"@textlint/kernel@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/kernel/-/kernel-12.6.1.tgz#6e8e57a0ebd2bfe5ce5c218bb4eedd7b20c793e0" - integrity sha512-GjNaI36pYx/boy1Xf7NPJFbS0uWHhY9y9DMMl/8ZJZoldN7XrCvJFivNdeYQxu+LTmfGGaUJoTjDpnllOs6XSQ== - dependencies: - "@textlint/ast-node-types" "^12.6.1" - "@textlint/ast-tester" "^12.6.1" - "@textlint/ast-traverse" "^12.6.1" - "@textlint/feature-flag" "^12.6.1" - "@textlint/source-code-fixer" "^12.6.1" - "@textlint/types" "^12.6.1" - "@textlint/utils" "^12.6.1" - debug "^4.3.4" - deep-equal "^1.1.1" - structured-source "^4.0.0" - -"@textlint/linter-formatter@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/linter-formatter/-/linter-formatter-12.6.1.tgz#90314ddaa036197c36ccb75cc8fa3fb318895350" - integrity sha512-1fQy17vNZy5qem8I71MGEir7gVLSUWcIE4ruQbONiIko9as+AYibt6xX6GtTX+aJejuJJcb+KTeAxKJ+6FA8vg== - dependencies: - "@azu/format-text" "^1.0.1" - "@azu/style-format" "^1.0.0" - "@textlint/module-interop" "^12.6.1" - "@textlint/types" "^12.6.1" - chalk "^4.1.2" - debug "^4.3.4" - is-file "^1.0.0" - js-yaml "^3.14.1" - lodash "^4.17.21" - optionator "^0.9.1" - pluralize "^2.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - table "^6.8.1" - text-table "^0.2.0" - try-resolve "^1.0.1" - -"@textlint/markdown-to-ast@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/markdown-to-ast/-/markdown-to-ast-12.6.1.tgz#fcccb5733b3e76cd0db78a323763ab101f2d803b" - integrity sha512-T0HO+VrU9VbLRiEx/kH4+gwGMHNMIGkp0Pok+p0I33saOOLyhfGvwOKQgvt2qkxzQEV2L5MtGB8EnW4r5d3CqQ== - dependencies: - "@textlint/ast-node-types" "^12.6.1" - debug "^4.3.4" - mdast-util-gfm-autolink-literal "^0.1.3" - remark-footnotes "^3.0.0" - remark-frontmatter "^3.0.0" - remark-gfm "^1.0.0" - remark-parse "^9.0.0" - traverse "^0.6.7" - unified "^9.2.2" - -"@textlint/module-interop@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/module-interop/-/module-interop-12.6.1.tgz#82adf942281a8880e1ad70b305d8caba87356830" - integrity sha512-COyRctLVh2ktAObmht3aNtqUvP0quoellKu1c2RrXny1po+Mf7PkvEKIxphtArE4JXMAmu01cDxfH6X88+eYIg== - -"@textlint/source-code-fixer@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/source-code-fixer/-/source-code-fixer-12.6.1.tgz#a674d6250863e5e8aaf2ac4dc2cb679ff37d2c49" - integrity sha512-J9UZ3uitT+T50ug5X6AoIOwn6kTl54ZmPYBPB9bmH4lwBamN7e4gT65lSweHY1D21elOkq+3bO/OAJMfQfAVHg== - dependencies: - "@textlint/types" "^12.6.1" - debug "^4.3.4" - -"@textlint/text-to-ast@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/text-to-ast/-/text-to-ast-12.6.1.tgz#8f24a424ee08fb82235e5f0dc63ab9e6475388b1" - integrity sha512-22tgSBaNerpwb66eCivjXmdZ3CDX2Il38vpuAGchiI+cl+sENU9dpuntxwEJdZQePX5qrkmw8XGj5kgyMF015A== - dependencies: - "@textlint/ast-node-types" "^12.6.1" - -"@textlint/textlint-plugin-markdown@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-12.6.1.tgz#744e36c468141826edaa7d96eb6beb28a5709ef3" - integrity sha512-fRKsFCL2fGeu0Bt+08FuEc2WHiI8IMDRvy6KT1pmNWO5irS4yL2/OXNknLH3erXvwcJw/hQnd5WEl4hQzS0Erw== - dependencies: - "@textlint/markdown-to-ast" "^12.6.1" - -"@textlint/textlint-plugin-text@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/textlint-plugin-text/-/textlint-plugin-text-12.6.1.tgz#92570b4f53ab15b2e8412f928a54c8833fb97b94" - integrity sha512-ZUfG0Xb8qGymIPNp2eFTq9bHvkJo3N3Ia1Aff5W9fsgZib1/Eb55U16Sp60TjhBFns0/p7L7usBC3nd3+tB5mQ== - dependencies: - "@textlint/text-to-ast" "^12.6.1" - -"@textlint/types@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/types/-/types-12.6.1.tgz#d00c5d625287a113c2807587c2c0cdc1c7f182d8" - integrity sha512-t1SZYahu2olnF8MUhlP6qDIEDyl7WmyIaBYxQdE2qU6xUkZWXS2zIxoAT/pVgvFCzDw3KO5HhIYGVeWRp90dTg== - dependencies: - "@textlint/ast-node-types" "^12.6.1" - -"@textlint/utils@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/utils/-/utils-12.6.1.tgz#95d00b4b57197987b97bc8342e127d652a7454e1" - integrity sha512-HJkqYXT2FAAHDM5XLFpQLF/CEdm8c2ltMeKmPBSSty1VfPXQMi8tGPT1b58b8KWh6dVmi7w0YYB7NrquuzXOKA== - -"@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== - dependencies: - "@types/unist" "*" - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -boundary@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/boundary/-/boundary-2.0.0.tgz#169c8b1f0d44cf2c25938967a328f37e0a4e5efc" - integrity sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA== - -brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -debug@^4.0.0, debug@^4.1.1, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -deep-equal@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-properties@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -diff@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -editorconfig-checker@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/editorconfig-checker/-/editorconfig-checker-5.0.1.tgz#cb4bf7a9b80f1b63b141b8897d7cc326fce0d3ae" - integrity sha512-6hXq9VVDkyCxVYKdGtIj+yhVR1fi/6W6Ykz/+kItLPARulJvr2/VXgWZ5OGWx1UYm2RD6XOzWyx1JF6DLgQ/8Q== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" - integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.11: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fault@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-stdin@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" - integrity sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.1.3, glob@^7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globby@13.1.3: - version "13.1.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" - integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -graceful-fs@^4.1.2: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-file/-/is-file-1.0.0.tgz#28a44cfbd9d3db193045f22b65fce8edf9620596" - integrity sha512-ZGMuc+xA8mRnrXtmtf2l/EkIW2zaD2LSBWlaOVEF6yH4RTndHob65V4SwWWdtGKVthQfXPVKsXqw4TDUjbVxVQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-regex@^1.0.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -js-yaml@^3.12.0, js-yaml@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^2.1.1, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -linkify-it@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" - integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw== - dependencies: - uc.micro "^1.0.1" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -longest-streak@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== - -markdown-it@13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" - integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== - dependencies: - argparse "^2.0.1" - entities "~3.0.1" - linkify-it "^4.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -markdown-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" - integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== - dependencies: - repeat-string "^1.0.0" - -markdownlint-cli2-formatter-default@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.3.tgz#5aecd6e576ad18801b76e58bbbaf0e916c583ab8" - integrity sha512-QEAJitT5eqX1SNboOD+SO/LNBpu4P4je8JlR02ug2cLQAqmIhh8IJnSK7AcaHBHhNADqdGydnPpQOpsNcEEqCw== - -markdownlint-cli2@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/markdownlint-cli2/-/markdownlint-cli2-0.6.0.tgz#ffa6aee4098e61f781e5e69528db60f7f39f737c" - integrity sha512-Bv20r6WGdcHMWi8QvAFZ3CBunf4i4aYmVdTfpAvXODI/1k3f09DZZ0i0LcX9ZMhlVxjoOzbVDz1NWyKc5hwTqg== - dependencies: - globby "13.1.3" - markdownlint "0.27.0" - markdownlint-cli2-formatter-default "0.0.3" - micromatch "4.0.5" - strip-json-comments "5.0.0" - yaml "2.2.1" - -markdownlint@0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.27.0.tgz#9dabf7710a4999e2835e3c68317f1acd0bc89049" - integrity sha512-HtfVr/hzJJmE0C198F99JLaeada+646B5SaG2pVoEakLFI6iRGsvMqrnnrflq8hm1zQgwskEgqSnhDW11JBp0w== - dependencies: - markdown-it "13.0.1" - -md5@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - -mdast-util-find-and-replace@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" - integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== - dependencies: - escape-string-regexp "^4.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -mdast-util-footnote@^0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz#4b226caeab4613a3362c144c94af0fdd6f7e0ef0" - integrity sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w== - dependencies: - mdast-util-to-markdown "^0.6.0" - micromark "~2.11.0" - -mdast-util-from-markdown@^0.8.0: - version "0.8.5" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" - integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string "^2.0.0" - micromark "~2.11.0" - parse-entities "^2.0.0" - unist-util-stringify-position "^2.0.0" - -mdast-util-frontmatter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz#8bd5cd55e236c03e204a036f7372ebe9e6748240" - integrity sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ== - dependencies: - micromark-extension-frontmatter "^0.2.0" - -mdast-util-gfm-autolink-literal@^0.1.0, mdast-util-gfm-autolink-literal@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" - integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== - dependencies: - ccount "^1.0.0" - mdast-util-find-and-replace "^1.1.0" - micromark "^2.11.3" - -mdast-util-gfm-strikethrough@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" - integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== - dependencies: - mdast-util-to-markdown "^0.6.0" - -mdast-util-gfm-table@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" - integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== - dependencies: - markdown-table "^2.0.0" - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm-task-list-item@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" - integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== - dependencies: - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" - integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== - dependencies: - mdast-util-gfm-autolink-literal "^0.1.0" - mdast-util-gfm-strikethrough "^0.2.0" - mdast-util-gfm-table "^0.1.0" - mdast-util-gfm-task-list-item "^0.1.0" - mdast-util-to-markdown "^0.6.1" - -mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: - version "0.6.5" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" - integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== - dependencies: - "@types/unist" "^2.0.0" - longest-streak "^2.0.0" - mdast-util-to-string "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.0.0" - zwitch "^1.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromark-extension-footnote@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz#129b74ef4920ce96719b2c06102ee7abb2b88a20" - integrity sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ== - dependencies: - micromark "~2.11.0" - -micromark-extension-frontmatter@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz#61b8e92e9213e1d3c13f5a59e7862f5ca98dfa53" - integrity sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A== - dependencies: - fault "^1.0.0" - -micromark-extension-gfm-autolink-literal@~0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" - integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== - dependencies: - micromark "~2.11.3" - -micromark-extension-gfm-strikethrough@~0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" - integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-table@~0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" - integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-tagfilter@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" - integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== - -micromark-extension-gfm-task-list-item@~0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" - integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm@^0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" - integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== - dependencies: - micromark "~2.11.0" - micromark-extension-gfm-autolink-literal "~0.5.0" - micromark-extension-gfm-strikethrough "~0.6.5" - micromark-extension-gfm-table "~0.4.0" - micromark-extension-gfm-tagfilter "~0.3.0" - micromark-extension-gfm-task-list-item "~0.3.0" - -micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: - version "2.11.4" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" - integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== - dependencies: - debug "^4.0.0" - parse-entities "^2.0.0" - -micromatch@4.0.5, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -misspellings@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/misspellings/-/misspellings-1.1.0.tgz#53d500266cbd09cda9d94c4cf392e60589b5b324" - integrity sha512-4QT2u/8X7PccbiHUcsZeEZrt3jGIVEpfcQ1RU01wDHKHVNtNhaP+0Xmsg7YPxD7OCc8bO802BTEWeGPvAXBwuw== - -mkdirp@^0.5.1, mkdirp@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-glob-pattern@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-to-glob-pattern/-/path-to-glob-pattern-1.0.2.tgz#473e6a3a292a9d13fbae3edccee72d3baba8c619" - integrity sha512-ryF65N5MBB9XOjE5mMOi+0bMrh1F0ORQmqDSSERvv5zD62Cfc5QC6rK1AR1xuDIG1I091CkNENblbteWy1bXgw== - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -pluralize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-2.0.0.tgz#72b726aa6fac1edeee42256c7d8dc256b335677f" - integrity sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -rc-config-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rc-config-loader/-/rc-config-loader-3.0.0.tgz#1484ed55d6fb8b21057699c8426370f7529c52a7" - integrity sha512-bwfUSB37TWkHfP+PPjb/x8BUjChFmmBK44JMfVnU7paisWqZl/o5k7ttCH+EQLnrbn2Aq8Fo1LAsyUiz+WF4CQ== - dependencies: - debug "^4.1.1" - js-yaml "^3.12.0" - json5 "^2.1.1" - require-from-string "^2.0.2" - -rc-config-loader@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/rc-config-loader/-/rc-config-loader-4.1.2.tgz#e57fc874bde9b1e48d8a8564f2f824f91eafd920" - integrity sha512-qKTnVWFl9OQYKATPzdfaZIbTxcHziQl92zYSxYC6umhOqyAsoj8H8Gq/+aFjAso68sBdjTz3A7omqeAkkF1MWg== - dependencies: - debug "^4.3.4" - js-yaml "^4.1.0" - json5 "^2.2.2" - require-from-string "^2.0.2" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -regexp.prototype.flags@^1.2.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -remark-footnotes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-3.0.0.tgz#5756b56f8464fa7ed80dbba0c966136305d8cb8d" - integrity sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg== - dependencies: - mdast-util-footnote "^0.1.0" - micromark-extension-footnote "^0.3.0" - -remark-frontmatter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz#ca5d996361765c859bd944505f377d6b186a6ec6" - integrity sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA== - dependencies: - mdast-util-frontmatter "^0.2.0" - micromark-extension-frontmatter "^0.2.0" - -remark-gfm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" - integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== - dependencies: - mdast-util-gfm "^0.1.0" - micromark-extension-gfm "^0.3.0" - -remark-parse@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" - integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== - dependencies: - mdast-util-from-markdown "^0.8.0" - -repeat-string@^1.0.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve@^1.10.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.0.tgz#ec101b766476a703031bc607e3c712569de2aa06" - integrity sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw== - -strip-json-comments@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -structured-source@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/structured-source/-/structured-source-4.0.0.tgz#0c9e59ee43dedd8fc60a63731f60e358102a4948" - integrity sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA== - dependencies: - boundary "^2.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -table@^6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -textlint-rule-common-misspellings@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/textlint-rule-common-misspellings/-/textlint-rule-common-misspellings-1.0.1.tgz#8c4133cf3bb59aa159199d2c9bced12413365774" - integrity sha512-f5KWhQFJzJBUX3RirAS25aSkAaaOHeSHtBeb7d49O+vxnAX3dZBS5DB/e5M1kR4tifW4qae64oqWZygoGYWkjQ== - dependencies: - misspellings "^1.0.1" - textlint-rule-helper "^1.1.5" - -textlint-rule-helper@^1.1.5: - version "1.2.0" - resolved "https://registry.yarnpkg.com/textlint-rule-helper/-/textlint-rule-helper-1.2.0.tgz#be68d47a5146b16dd116278c9aeb7bd35631ccda" - integrity sha512-yJmVbmyuUPOndKsxOijpx/G7mwybXXf4M10U2up0BeIZSN+6drUl+aSKAoC+RUHY7bG4ogLwRcmWoNG1lSrRIQ== - dependencies: - unist-util-visit "^1.1.0" - -textlint-rule-helper@^2.0.0, textlint-rule-helper@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/textlint-rule-helper/-/textlint-rule-helper-2.3.0.tgz#5ab84db686d42fd2e39a63b40310501bb336520d" - integrity sha512-Ug78Saahb/qVImttL0NSFyT5/JJ5wXvOPepR2pYAjNi54BsQAAz/hAyyEgKuYeR0+yjFb0KPhby4f880X5vqHA== - dependencies: - "@textlint/ast-node-types" "^13.0.2" - structured-source "^4.0.0" - unist-util-visit "^2.0.3" - -textlint-rule-no-todo@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/textlint-rule-no-todo/-/textlint-rule-no-todo-2.0.1.tgz#86351ed3521ce8faa3b8224f88887f3cecbf2920" - integrity sha512-+adoWaBgoTN2g0WNcrERhVq7gdPKQIf1z7Ol+6XwMGv8XmuoFp5vJljHKtCmJBmGhBihjty2b8oaza2MY6UNlw== - dependencies: - textlint-rule-helper "^2.0.0" - -textlint-rule-terminology@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/textlint-rule-terminology/-/textlint-rule-terminology-3.0.4.tgz#5e51fffe4dc5d1f82c2fa0482137e5c75a7eaaae" - integrity sha512-obQ3y0hqX6OWCrM8K5K6WSJGE4BOyNfGF6hUGPet56taTm/xzkRu8XA6vpn2GFr4zom/oMa0sBJ3OtDWCgrS/g== - dependencies: - lodash "^4.17.15" - strip-json-comments "^3.0.1" - textlint-rule-helper "^2.1.1" - -textlint@^12.5.1: - version "12.6.1" - resolved "https://registry.yarnpkg.com/textlint/-/textlint-12.6.1.tgz#a8eb605ddfc45f7504e4876e4c50d1a1d5d25cbc" - integrity sha512-ro33XJnA9UpQVeheGbPalYa5qpyA2R2yZdIgfC8xEvlOTF5SWJkdeNMm24Ml6d36bgwbqIO2yISKu7vlzBxHRA== - dependencies: - "@textlint/ast-node-types" "^12.6.1" - "@textlint/ast-traverse" "^12.6.1" - "@textlint/config-loader" "^12.6.1" - "@textlint/feature-flag" "^12.6.1" - "@textlint/fixer-formatter" "^12.6.1" - "@textlint/kernel" "^12.6.1" - "@textlint/linter-formatter" "^12.6.1" - "@textlint/module-interop" "^12.6.1" - "@textlint/textlint-plugin-markdown" "^12.6.1" - "@textlint/textlint-plugin-text" "^12.6.1" - "@textlint/types" "^12.6.1" - "@textlint/utils" "^12.6.1" - debug "^4.3.4" - deep-equal "^1.1.1" - file-entry-cache "^5.0.1" - get-stdin "^5.0.1" - glob "^7.2.3" - is-file "^1.0.0" - md5 "^2.3.0" - mkdirp "^0.5.6" - optionator "^0.9.1" - path-to-glob-pattern "^1.0.2" - rc-config-loader "^3.0.0" - read-pkg "^1.1.0" - read-pkg-up "^3.0.0" - structured-source "^4.0.0" - try-resolve "^1.0.1" - unique-concat "^0.2.2" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -traverse@^0.6.7: - version "0.6.7" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" - integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -try-resolve@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" - integrity sha512-yHeaPjCBzVaXwWl5IMUapTaTC2rn/eBYg2fsG2L+CvJd+ttFbk0ylDnpTO3wVhosmE1tQEvcebbBeKLCwScQSQ== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== - -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unique-concat@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/unique-concat/-/unique-concat-0.2.2.tgz#9210f9bdcaacc5e1e3929490d7c019df96f18712" - integrity sha512-nFT3frbsvTa9rrc71FJApPqXF8oIhVHbX3IWgObQi1mF7WrW48Ys70daL7o4evZUtmUf6Qn6WK0LbHhyO0hpXw== - -unist-util-is@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-visit-parents@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" - integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== - dependencies: - unist-util-is "^3.0.0" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" - integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== - dependencies: - unist-util-visit-parents "^2.0.0" - -unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -word-wrap@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -yaml@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" - integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/requirements.yml b/requirements.yml index dffe9d3..8f48358 100644 --- a/requirements.yml +++ b/requirements.yml @@ -11,7 +11,3 @@ collections: - source: https://github.com/ansible-collections/community.docker type: git version: "5.0.5" - # grafana.grafana - - source: https://github.com/grafana/grafana-ansible-collection - type: git - version: "6.0.6" diff --git a/roles/alloy/defaults/main.yaml b/roles/alloy/defaults/main.yaml index 09c99ee..c2b326a 100644 --- a/roles/alloy/defaults/main.yaml +++ b/roles/alloy/defaults/main.yaml @@ -1,29 +1,33 @@ +--- +alloy_cap_net_bind_service: false +alloy_do_we_have_v6: "{{ (ansible_facts['all_ipv6_addresses'] | select('match', '^[23]') | list | length > 0) | ternary('true', 'false') }}" + alloy_config_default: | prometheus.remote_write "default" { endpoint { url = "https://metrics.hamburg.ccc.de/api/v1/write" basic_auth { username = "chaos" - password = "chaos_password" + password = "{{ metrics__chaos_password }}" } } } - prometheus.relabel "common" { + prometheus.relabel "chaosknoten_common" { forward_to = [prometheus.remote_write.default.receiver] rule { target_label = "org" - replacement = "noorg" + replacement = "ccchh" } rule { target_label = "site" - replacement = "nosite" + replacement = "wieske" } rule { source_labels = ["instance"] target_label = "instance" regex = "([^:]+)" - replacement = "${1}.hosts.test" + replacement = "${1}.hosts.hamburg.ccc.de" action = "replace" } } @@ -38,7 +42,56 @@ alloy_config_default: | prometheus.scrape "scrape_metrics" { targets = prometheus.exporter.unix.local_system.targets - forward_to = [prometheus.relabel.common.receiver] + forward_to = [prometheus.relabel.chaosknoten_common.receiver] } alloy_config_additional: "" + +alloy_blackbox_exporter_config_default: | + modules: + https4_2xx: + prober: http + http: + valid_status_codes: [] # Defaults to 2xx + method: GET + follow_redirects: true + fail_if_ssl: false + fail_if_not_ssl: true + preferred_ip_protocol: "ip4" + ip_protocol_fallback: false + + https6_2xx: + prober: http + http: + valid_status_codes: [] # Defaults to 2xx + method: GET + follow_redirects: true + fail_if_ssl: false + fail_if_not_ssl: true + preferred_ip_protocol: "ip6" + ip_protocol_fallback: false + + tcp4_connect: + prober: tcp + tcp: + preferred_ip_protocol: "ip4" + ip_protocol_fallback: false + + icmp4: + prober: icmp + icmp: + preferred_ip_protocol: "ip4" + ip_protocol_fallback: false + + icmp6: + prober: icmp + icmp: + preferred_ip_protocol: "ip6" + ip_protocol_fallback: false + +alloy_blackbox_exporter_config_additional: "" + +alloy_unpoller_enabled: false +alloy_unpoller_unifi_user: unpoller +alloy_unpoller_unifi_password: +alloy_unpoller_unifi_url: diff --git a/roles/alloy/handlers/main.yml b/roles/alloy/handlers/main.yml new file mode 100644 index 0000000..e24efcb --- /dev/null +++ b/roles/alloy/handlers/main.yml @@ -0,0 +1,31 @@ +--- +- name: Alloy.enabled + become: true + ansible.builtin.systemd: + name: alloy + enabled: true + +- name: Alloy.restarted + become: true + ansible.builtin.systemd: + name: alloy + state: restarted + enabled: true + +- name: Alloy.reloaded + become: true + ansible.builtin.systemd: + name: alloy + state: reloaded + enabled: true + +- name: Systemd.daemon_reload + become: true + ansible.builtin.systemd_service: + daemon_reload: true + +- name: Unpoller.restarted + become: true + ansible.builtin.systemd_service: + name: unpoller.service + state: restarted diff --git a/roles/alloy/tasks/blackbox-exporter.yaml b/roles/alloy/tasks/blackbox-exporter.yaml new file mode 100644 index 0000000..b4e784d --- /dev/null +++ b/roles/alloy/tasks/blackbox-exporter.yaml @@ -0,0 +1,11 @@ +--- +- name: Render blackbox exporter config + tags: [ blackbox-exporter, alloy ] + become: true + ansible.builtin.template: + src: config.blackbox-exporter.j2 + dest: /etc/alloy/blackbox-exporter.yaml + mode: "0644" + owner: root + notify: + - Alloy.reloaded diff --git a/roles/alloy/tasks/install_debian.yml b/roles/alloy/tasks/install_debian.yml new file mode 100644 index 0000000..438e5d5 --- /dev/null +++ b/roles/alloy/tasks/install_debian.yml @@ -0,0 +1,20 @@ +--- +- name: Add grafana apt repo with signing key + become: true + ansible.builtin.deb822_repository: + name: grafana + types: deb + uris: https://apt.grafana.com + suites: stable + components: + - main + signed_by: https://apt.grafana.com/gpg.key + +- name: Run cache update + ansible.builtin.apt: + update_cache: true + +- name: Install alloy + become: true + ansible.builtin.package: + name: alloy diff --git a/roles/alloy/tasks/main.yaml b/roles/alloy/tasks/main.yaml index 5e3cd64..69ceb63 100644 --- a/roles/alloy/tasks/main.yaml +++ b/roles/alloy/tasks/main.yaml @@ -1,50 +1,79 @@ -# https://github.com/grafana/grafana-ansible-collection/blob/main/roles/alloy/tasks/deploy.yml#L124 -- name: ensure alloy user exists - ansible.builtin.user: - name: alloy - system: true - append: true - create_home: false - state: present - -- name: ensure the `/etc/alloy/` config directory exists - ansible.builtin.file: - path: /etc/alloy - state: directory - mode: "0770" - owner: root - group: alloy - become: true - -- name: synchronize the additional configuration files directory, if present - when: alloy__additional_configs_dir is defined and alloy__additional_configs_dir != "" +--- +- name: Deploy Grafana Alloy with config + tags: [ alloy ] block: - - name: ensure rsync is installed - ansible.builtin.apt: - name: rsync + - name: Install Alloy on Debian + when: ansible_facts['distribution'] == "Debian" + ansible.builtin.include_tasks: install_debian.yml + + - name: Create systemd override for alloy become: true + when: alloy_cap_net_bind_service + notify: Systemd.daemon_reload + block: + - name: Create systemd override directory + ansible.builtin.file: + path: /etc/systemd/system/alloy.service.d + state: directory + mode: "0755" + owner: root + group: root + - name: Add CAP_NET_BIND_SERVICE capability + ansible.builtin.copy: + dest: /etc/systemd/system/alloy.service.d/override.conf + mode: "0755" + owner: root + group: root + content: | + [Service] + AmbientCapabilities=CAP_NET_BIND_SERVICE - - name: synchronize the additional configuration files directory, if present - ansible.posix.synchronize: - src: "{{ alloy__additional_configs_dir }}" - dest: /etc/alloy/additional - delete: true - recursive: true - use_ssh_args: true - rsync_opts: - - "--chown=root:alloy" + - name: Deploy the Alloy config file become: true + ansible.builtin.template: + src: "config.alloy.j2" + dest: "/etc/alloy/config.alloy" + owner: "alloy" + group: "alloy" + mode: "0640" + notify: + - Alloy.restarted + - Alloy.enabled -- name: delete the additional configuration files directory, if not present - when: alloy__additional_configs_dir is not defined or alloy__additional_configs_dir == "" - ansible.builtin.file: - path: /etc/alloy/additional - state: absent - become: true + - name: Validate Alloy configuration and print error if failed + block: + - name: Validate Alloy configuration + become: true + register: alloy_validation + changed_when: false + ansible.builtin.command: alloy validate /etc/alloy/config.alloy + rescue: + - name: Show error if validation failed + when: alloy_validation.rc != 0 + ansible.builtin.fail: + msg: | + Alloy configuration validation failed! + Return code: {{ alloy_validation.rc }} + Stdout: + {{ alloy_validation.stdout }} + Stderr: + {{ alloy_validation.stderr }} -- name: Setup Alloy - ansible.builtin.import_role: - name: grafana.grafana.alloy - vars: - alloy_config: "{{ alloy_config_default ~ alloy_config_additional }}" - become: true + - name: Deploy blackbox-exporter config + when: alloy_enable_blackbox_exporter + ansible.builtin.include_tasks: blackbox-exporter.yaml + - name: Deploy unpoller exporter + when: alloy_unpoller_enabled + ansible.builtin.include_tasks: unpoller.yaml + + - name: Flush handlers + ansible.builtin.meta: flush_handlers + + - name: Ensure that Alloy is working + ansible.builtin.uri: + url: "http://localhost:12345/-/ready" + method: GET + register: alloy_status_code + retries: 8 + delay: 6 + until: not alloy_status_code.failed diff --git a/roles/alloy/tasks/unpoller.yaml b/roles/alloy/tasks/unpoller.yaml new file mode 100644 index 0000000..ceefbbb --- /dev/null +++ b/roles/alloy/tasks/unpoller.yaml @@ -0,0 +1,76 @@ +--- +- name: Install and Setup unpoller + tags: [ unpoller, alloy, podman, container ] + block: + - name: Install Podman + become: true + ansible.builtin.package: + name: + - podman + - fuse-overlayfs + + - name: Create unpoller group + become: true + register: alloy_unpoller_group + ansible.builtin.group: + name: unpoller + + - name: Create unpoller user + become: true + register: alloy_unpoller_user + ansible.builtin.user: + name: unpoller + group: unpoller + system: true + + - name: Create unpoller configuration directory + become: true + ansible.builtin.file: + path: /etc/unpoller + state: directory + owner: "{{ alloy_unpoller_user.name }}" + mode: "0755" + + - name: Render unpoller configuration + become: true + notify: Unpoller.restarted + ansible.builtin.template: + src: unpoller.conf.j2 + dest: /etc/unpoller/up.conf + owner: "{{ alloy_unpoller_user.name }}" + mode: "0644" + + - name: Create /etc/containers/systemd directory + become: true + ansible.builtin.file: + path: /etc/containers/systemd + state: directory + owner: root + mode: "0755" + + - name: Configure unpoller quadlet + become: true + notify: Unpoller.restarted + register: alloy_unpoller_quadlet + vars: + container_image_with_tag: ghcr.io/unpoller/unpoller:v2 + container_unit_args: + container_exec: + container_envs: [ ] + container_volumes: + - { host: "/etc/unpoller", inside: "/etc/unpoller:ro" } + user_id: "{{ alloy_unpoller_user.uid }}" + group_id: "{{ alloy_unpoller_group.gid }}" + ansible.builtin.template: + src: podman.container.jinja + dest: /etc/containers/systemd/unpoller.container + owner: root + mode: "0644" + + - name: Ensure unpoller is running and enabled + become: true + ansible.builtin.systemd: + name: unpoller.service + state: started + enabled: true + daemon_reload: "{{ alloy_unpoller_quadlet.changed }}" diff --git a/roles/alloy/templates/config.alloy.j2 b/roles/alloy/templates/config.alloy.j2 new file mode 100644 index 0000000..cb94f04 --- /dev/null +++ b/roles/alloy/templates/config.alloy.j2 @@ -0,0 +1,3 @@ +// Ansible Managed +{{ alloy_config_default }} +{{ alloy_config_additional }} \ No newline at end of file diff --git a/roles/alloy/templates/config.blackbox-exporter.j2 b/roles/alloy/templates/config.blackbox-exporter.j2 new file mode 100644 index 0000000..88b9bbe --- /dev/null +++ b/roles/alloy/templates/config.blackbox-exporter.j2 @@ -0,0 +1,3 @@ +# {{ ansible_managed }} +{{ alloy_blackbox_exporter_config_default }} +{{ alloy_blackbox_exporter_config_additional }} diff --git a/roles/alloy/templates/podman.container.jinja b/roles/alloy/templates/podman.container.jinja new file mode 100644 index 0000000..4dab765 --- /dev/null +++ b/roles/alloy/templates/podman.container.jinja @@ -0,0 +1,29 @@ +# {{ ansible_managed }} +# man podman-systemd.unit + +{% if container_unit_args is not none %} +[Unit] +{% for container_unit_arg in container_unit_args %} +{{ container_unit_arg }} +{% endfor %} +{% endif %} + +[Container] +Image={{ container_image_with_tag }} +{% if container_exec is not none %} +Exec={{ container_exec }} +{% endif %} +{% for container_env in container_envs %} +Environment={{ container_env.key }}={{ container_env.value }} +{% endfor %} +Network=host +UserNS=host +User={{ user_id }} +Group={{ group_id }} +{% for container_vol in container_volumes %} +Volume={{ container_vol.host }}:{{ container_vol.inside }} +{% endfor %} +LogDriver=journald + +[Install] +WantedBy=default.target diff --git a/roles/alloy/templates/unpoller.conf.j2 b/roles/alloy/templates/unpoller.conf.j2 new file mode 100644 index 0000000..0d47955 --- /dev/null +++ b/roles/alloy/templates/unpoller.conf.j2 @@ -0,0 +1,248 @@ +# {{ ansible_managed }} +# Unpoller v2 primary configuration file. TOML FORMAT # +########################################################### + +[poller] + # Turns on line numbers, microsecond logging, and a per-device log. + # The default is false, but I personally leave this on at home (four devices). + # This may be noisy if you have a lot of devices. It adds one line per device. + debug = false + + # Turns off per-interval logs. Only startup and error logs will be emitted. + # Recommend enabling debug with this setting for better error logging. + quiet = false + + # Load dynamic plugins. Advanced use; only sample mysql plugin provided by default. + plugins = [] + +#### OUTPUTS + + # If you don't use an output, you can disable it. + +[prometheus] + disable = false + # This controls on which ip and port /metrics is exported when mode is "prometheus". + # This has no effect in other modes. Must contain a colon and port. + http_listen = "0.0.0.0:9130" + # Adding an SSL Cert and Cert Key will make Poller listen with SSL/https. + ssl_cert_path = "" + ssl_key_path = "" + # Errors are rare. Setting this to true will report them to Prometheus. + report_errors = false + ## Record data for disabled or down (unlinked) switch ports. + dead_ports = false + +[influxdb] + disable = true + # InfluxDB does not require auth by default, so the user/password are probably unimportant. + url = "http://127.0.0.1:8086" + user = "unifipoller" + # Password for InfluxDB user (above). + # If the password provided here begins with file:// then the password is read in from + # the file path that follows the file:// prefix. ex: file:///etc/influxdb/passwd.file + pass = "unifipoller" + # Be sure to create this database. See the InfluxDB Wiki page for more info. + db = "unifi" + # If your InfluxDB uses a valid SSL cert, set this to true. + verify_ssl = false + # The UniFi Controller only updates traffic stats about every 30 seconds. + # Setting this to something lower may lead to "zeros" in your data. + # If you're getting zeros now, set this to "1m" + interval = "30s" + ## Record data for disabled or down (unlinked) switch ports. + dead_ports = false + +# To enable output of UniFi Events to Loki, add a URL; it's disabled otherwise. +# User, pass and tenant_id are optional and most folks wont set them. +# Pick which logs you want per-controller in the [unifi.controller] section. +# This is a new feature. Feedback welcome! +[loki] + disable = true + url = "" + # The rest of this is advanced & optional. See wiki. + user = "" + pass = "" + verify_ssl = false + tenant_id = "" + interval = "2m" + timeout = "10s" + +[datadog] + # How often to poll UniFi and report to Datadog. + interval = "2m" + + # To enable this output plugin + enable = false + + # Datadog Custom Options + + # address to talk to the datadog agent, by default this uses the local statsd UDP interface + # address = "localhost:8125" + + # namespace to prepend to all data, default is no additional prefix. + # namespace = "" + + # tags to append to all data + # tags = [ "customer:abc_corp" ] + + # For more advanced options for very large amount of data collected see the upstream + # github.com/unpoller/unpoller/pkg/datadogunifi repository README. + + +# Unpoller has an optional web server. To turn it on, set enable to true. If you +# wish to use SSL, provide SSL cert and key paths. This interface is currently +# read-only; it just displays information, like logs, devices and clients. +# Notice: Enabling the web server with many sites will increase memory usage. +# This is a new feature and lacks a UI, enabling only recommended for testing. +[webserver] + enable = false + port = 37288 + # The HTML path is different on Windows and BSD/macOS. + html_path = "/usr/local/lib/unpoller/web" + ssl_cert_path = "" + ssl_key_path = "" + # How many events per event group to hold. 200-2000. Use fewer with many sites. + # With 1 site, you'll have a max total of 9 event groups; 1 per plugin, 4 per site. + # Each site adds 1 event group for each of these inputs that is enabled: + # save_ids, save_events, save_anomalies, save_alarms. + max_events = 200 + +# By default the web interface does not require authentication. You can change +# that by adding a username and password hash (or multiple) below. +# To create a hash, run unifi-poller with the -e CLI argument. See Wiki for more! +[webserver.accounts] +# username = "password-hash" +# captain = "$2a$04$mxw6i0LKH6u46oaLK2cq5eCTAAFkfNiRpzNbz.EyvJZZWNa2FzIlS" + +#### INPUTS + +[unifi] + # Setting this to true and providing default credentials allows you to skip + # configuring controllers in this config file. Instead you configure them in + # your prometheus.yml config. Prometheus then sends the controller URL to + # Unpoller when it performs the scrape. This is useful if you have many, + # or changing controllers. See wiki for more. + dynamic = false + +# The following section contains the default credentials/configuration for any +# dynamic controller (see above section), or the primary controller if you do not +# provide one and dynamic is disabled. In other words, you can just add your +# controller here and delete the following section. The internal defaults are +# shown below. Any missing values will assume these displayed defaults. + +[unifi.defaults] + # URL for the UniFi Controller. Do not add any paths after the host:port. + # Do not use port 8443 if you have a UDM; just use "https://ip". + url = "https://invalid.invalid:8443" + + # Make a read-only user in the UniFi Admin Settings, allow it access to all sites. + user = "{{ alloy_unpoller_unifi_user }}" + + # Password for UniFi controller user (above). + # If the password provided here begins with file:// then the password is read in from + # the file path that follows the file:// prefix. ex: file:///etc/unifi/password.file + # ex: file:///etc/unifi/passwd.file, windows: file://C:\\UserData\\Unifi\\Passwd.txt + pass = "" + + # API Key + # Unifi now supports API Key authentication. This is exclusive of user/pass auth. + # api_key = "unifiapikey" + + # If the controller has more than one site, specify which sites to poll here. + # Set this to ["default"] to poll only the first site on the controller. + # A setting of ["all"] will poll all sites; this works if you only have 1 site too. + sites = ["all"] + + # Added an example for overriding the default site name. + # default_site_name_override = "My Custom Default Site" + + # Specify a timeout, leave missing to declare infinite wait. This determines the maximum + # time to wait for a response from the unifi controller on any API request. + # timeout = 60s + + # Enable collection of site data. This data powers the Network Sites dashboard. + # It's not valuable to everyone and setting this to false will save resources. + save_sites = false + + # Hash, with md5, client names and MAC addresses. This attempts to protect + # personally identifiable information. Most users won't want to enable this. + hash_pii = false + + # Enable collection of Intrusion Detection System Data (InfluxDB/Loki only). + # Only useful if IDS or IPS are enabled on one of the sites. This may store + # a lot of information. Only recommended for testing and debugging. There + # may not be any dashboards to display this data. It can be used for annotations. + # Enable this only if using InfluxDB or Loki. This will leak PII data! + save_ids = false + + # Enable collection of UniFi Events (InfluxDB/Loki only). + # This may store a lot of information. Only recommended for testing and debugging. + # There are no dashboards to display this data. It can be used for annotations. + # This is a new (June, 2020) feature. Please provide feedback if you try it out! + # Enable this only if using InfluxDB or Loki. This will leak PII data! + save_events = false + + # Enable collection of UniFi Alarms (InfluxDB/Loki only). + # There are no dashboards to display this data. It can be used for annotations. + # This is a new (June, 2020) feature. Please provide feedback if you try it out! + # Enable this only if using InfluxDB or Loki. This will leak PII data! + save_alarms = false + + # Enable collection of UniFi Anomalies (InfluxDB/Loki only). + # There are no dashboards to display this data. It can be used for annotations. + # This is a new (June, 2020) feature. Please provide feedback if you try it out! + # Enable this only if using InfluxDB or Loki. + save_anomalies = false + + # Enable collection of Deep Packet Inspection data. This data breaks down traffic + # types for each client and site, it powers a dedicated DPI dashboard. + # Enabling this adds roughly 150 data points per client. That's 6000 metrics for + # 40 clients. This adds a little bit of poller run time per interval and causes + # more API requests to your controller(s). Don't let these "cons" sway you: + # it's cool data. Please provide feedback on your experience with this feature. + save_dpi = false + + ## Enabling save_rogue stores even more data in your time series databases. + ## This saves neighboring access point metrics in a dedicated table or namespace. + save_rogue = false + + # If your UniFi controller has a valid SSL certificate (like lets encrypt), + # you can enable this option to validate it. Otherwise, any SSL certificate is + # valid. If you don't know if you have a valid SSL cert, then you don't have one. + verify_ssl = false + + ## You may provide a list of SSL cert files (PEM format) that you expect your + ## controller to use. As long as one of the certs you provide here shows up in + ## the cert trust chain the controller presents it will be accepted and allowed. + ## These files may be re-read while poller is running. + ## Example: ssl_cert_paths = ["/path/to/cert.pem", "/another/cert.pem"] + ssl_cert_paths = [] + +# The following is optional and used for configurations with multiple UniFi controllers. + +# You may repeat the following [[unifi.controller]] section as many times as needed to +# poll multiple controllers. Uncomment the entire section including [[unifi.controller]]. +# Omitted variables will have their values taken from the defaults, above. +# +#[[unifi.controller]] +# url = "https://127.0.0.1:8443" +# user = "unifipoller" +# pass = "unifipoller" +# sites = ["all"] +# save_sites = true +# hash_pii = false +# save_ids = false +# save_events = false +# save_alarms = false +# save_anomalies = false +# save_dpi = false +# save_rogue = false +# verify_ssl = false +# ssl_cert_paths = [] + +[[unifi.controller]] +url = "{{ alloy_unpoller_unifi_url | mandatory }}" +user = "{{ alloy_unpoller_unifi_user }}" +pass = "{{ alloy_unpoller_unifi_password | mandatory }}" +hash_pii = true +save_anomalies = false diff --git a/roles/alloy/vars/main.yaml b/roles/alloy/vars/main.yaml new file mode 100644 index 0000000..d9fbe4b --- /dev/null +++ b/roles/alloy/vars/main.yaml @@ -0,0 +1,2 @@ +--- +alloy_enable_blackbox_exporter: "{{ 'prometheus.exporter.blackbox' in (alloy_config_default + alloy_config_additional) }}"