尝试编写一个任务来解析 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 中列出,则丢弃它。
问:“丢弃未在 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
因此,如果人们有同样的问题,我可以通过以下方式解决它:
- 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 }}"