Ansible 提取 JSON 已从列表中删除

问题描述 投票:0回答:2

尝试编写一个任务来解析 json 数据(influxdb 存储桶),为 influxdb.yml 文件中标识的每个存储桶创建 api 令牌,其中 api_token=yes。

这是列出所有项目的 influxdb.yml;然而 influxdb 有一些内部的,我不想为其制作令牌。

influxdb_buckets:
  - name: default
    api_token: no
  - name: linux
    api_token: yes
  - name: vmware
    api_token: yes
  - name: elasticsearch
    api_token: yes
  - name: windows
    api_token: yes

ansible任务:

- name: Get bucket IDs
  ansible.builtin.command: "influx bucket list --json"
  register: bucket_list

- name: Buckets ID and Name
  ansible.builtin.set_fact:
    buckets_ids_names: "{{ bucket_list.stdout | from_json | json_query('[].{id: id, name: name}') }}"

例如返回

"buckets_ids_names": [
        {
            "id": "f883cd9d1bc409e1",
            "name": "_monitoring"
        },
        {
            "id": "e68eb87555d06949",
            "name": "_tasks"
        },
        {
            "id": "c7ad12c4d667cde8",
            "name": "bucket"
        },
        {
            "id": "0b1f6d500a73f5cf",
            "name": "elasticsearch"
        },
        {
            "id": "e2881de1d38b0938",
            "name": "linux"
        },
        {
            "id": "6d279a8ef3d1a93d",
            "name": "vmware"
        },
        {
            "id": "4d93c36e6dc82f2d",
            "name": "windows-eventlogs"
        },
        {
            "id": "f30aa00ad510fee5",
            "name": "es-windows-performance"
        },
        {
            "id": "2baeba1ff0e2125a",
            "name": "windows-services"
        }
    ]

现在需要一种方法来比较两者的名称,如果它没有在 influxdb.yml 中列出,则丢弃它。

ansible influxdb-2
2个回答
1
投票

问:“丢弃未在 influxdb_buckets 中列出的”

A:获取 names 并选择属性 name

  names: "{{ influxdb_buckets | map(attribute='name') }}"
  result: "{{ buckets_ids_names | selectattr('name', 'in', names) }}"

给予

  result:
    - {id: 0b1f6d500a73f5cf, name: elasticsearch}
    - {id: e2881de1d38b0938, name: linux}
    - {id: 6d279a8ef3d1a93d, name: vmware}

用于测试的完整剧本示例

- hosts: all

  vars:

    influxdb_buckets:
      - {api_token: false, name: default}
      - {api_token: true, name: linux}
      - {api_token: true, name: vmware}
      - {api_token: true, name: elasticsearch}
      - {api_token: true, name: windows}

    buckets_ids_names:
      - {id: f883cd9d1bc409e1, name: _monitoring}
      - {id: e68eb87555d06949, name: _tasks}
      - {id: c7ad12c4d667cde8, name: bucket}
      - {id: 0b1f6d500a73f5cf, name: elasticsearch}
      - {id: e2881de1d38b0938, name: linux}
      - {id: 6d279a8ef3d1a93d, name: vmware}
      - {id: 4d93c36e6dc82f2d, name: windows-eventlogs}
      - {id: f30aa00ad510fee5, name: es-windows-performance}
      - {id: 2baeba1ff0e2125a, name: windows-services}

    names: "{{ influxdb_buckets | map(attribute='name') }}"
    result: "{{ buckets_ids_names | selectattr('name', 'in', names) }}"

  tasks:

    - debug:
        var: result | to_yaml

0
投票

因此,如果人们有同样的问题,我可以通过以下方式解决它:

- name: Get bucket IDs
  ansible.builtin.command: "influx bucket list --json"
  register: bucket_list

- name: Populate buckets_with_api_token_yes
  ansible.builtin.set_fact:
    bucket_ids_names: "{{ bucket_list.stdout | from_json | json_query('[].{id: id, name: name}') }}"

- name: Populate buckets_with_api_token_yes
  ansible.builtin.set_fact:
    buckets: "{{ lookup('file', '../../../group_vars/influxdb.yml') | from_yaml }}"

- name: Get bucket
  ansible.builtin.set_fact:
    filtered_buckets: "{{ buckets.influxdb_buckets | selectattr('api_token', 'equalto', true) | map(attribute='name') | list }}"

- name: Create variable with matching bucket names and ids
  ansible.builtin.set_fact:
    matching_bucket_names_and_ids: "{{ matching_bucket_names_and_ids | default([]) + [{'name': item.name, 'id': item.id}] }}"
  loop: "{{ bucket_ids_names }}"
  when: item.name in buckets.influxdb_buckets | selectattr('api_token', 'equalto', true) | map(attribute='name') | list

- name: Create authorization tokens
  ansible.builtin.command: "influx auth create -d '{{ item.1 }} write token' --write-bucket '{{ item.0 }}'"
  loop: "{{ matching_bucket_names_and_ids }}"
© www.soinside.com 2019 - 2024. All rights reserved.