在创建k8s机密时ansible中嵌套了循环



我试图用ansible的结果模块中存储的用户名和机密创建k8s机密,但我为名称和命名空间部分创建了一个循环,我试图从json结果输出再创建一个循环

变量:

project_namespaces:
- projectName: helm
Namespaces: 
- default
- core

robot_result.results

"robot_result.results | json_query('[].json')": [
{
"creation_time": "2022-03-21T10:29:18.331Z",
"expires_at": -1,
"id": 75,
"username": "robot@helm-robot",
"secret": "YzDDEtJcqYoBL2soZHfTqZxvhIfGKURT"
},
{
"creation_time": "2022-03-21T10:29:22.129Z",
"expires_at": -1,
"id": 76,
"username": "robot@proxy-robot",
"secret": "7imXCVAGHV91AkeN7LAhWxQHabmYDRmg"
}
]
}

任务:

- name: Create secrets
k8s: 
state: present
definition:
apiVersion: v1
kind: Secret
metadata:
name: "{{ item.0.projectName }}"
namespace: "{{ item.1 }}"
stringData:
password: "{{ project.secret }}"
username: "{{ project.name }}"
type: Opaque
vars:
project: "{{ robot_result.results | json_query('[*].json') | first }}"  
loop: "{{ project_namespaces | subelements('Namespaces') }}"
loop_control:
label: "{{ item.0.projectName }}"

当我尝试执行这些任务时,它正在创建秘密,但它正在创建具有相同名称和秘密的每个秘密,因为我使用的是project: "{{ robot_result.results | json_query('[*].json') | first }}",它每次只打印结果的第一个值。

我不太清楚在这个任务中创建两个循环的可能性。有人能帮我实现这一点吗。。我正在发布机器人帐户的结果和输出。

我得到的输出像

name: "helm" , namespace: "default", username: "robot@helm-robot", secret: "YzDDEtJcqYoBL2soZHfTqZxvhIfGKURT"
name: "helm" , namespace: "core", username: "robot@helm-robot", secret: "YzDDEtJcqYoBL2soZHfTqZxvhIfGKURT" 

但我正在寻找输出应该是

name: "helm" , namespace: "default", username: "robot@helm-robot", secret: "YzDDEtJcqYoBL2soZHfTqZxvhIfGKURT"
name: "helm" , namespace: "core", username: "robot@proxy-robot", secret: "7imXCVAGHV91AkeN7LAhWxQHabmYDRmg" 

我收到了类似的错误

FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'secret'nnThe error appears to be in '/home/ubuntu/konvoy/ansible/roles/harbor/tasks/main.yml': line 47, column 3, but maynbe elsewhere in the file depending on the exact syntax problem.nnThe offending line appears to be:nnn- name: Create secretsn  ^ heren"}

提前谢谢。

robot_result:

ok: [harbor_stg1_dkp1] => {
"robot_result": {
"changed": false,
"msg": "All items completed",
"results": [
{
"ansible_loop_var": "item",
"content_type": "application/json",
"cookies": {
"sid": "557b377ba2bbe3f054d68bd56b0e10ef"
},
"invocation": {
"module_args": {
"attributes": null,
"body": {
"description": "pull artifacts for helm",
"disable": true,
"duration": -1,
"level": "system",
"name": "helm-robot",
"permissions": [
{
"access": [
{
"action": "pull",
"resource": "repository"
}
],
"kind": "project",
"namespace": "helm"
}
]
},
"body_format": "json",
"headers": {
"Accept": "application/json",
"Authorization": "Basic ",
"Content-Type": "application/json"
},
"http_agent": "ansible-httpget",
"status_code": [
201
],
"timeout": 30,
"unix_socket": null,
"validate_certs": false
}
},
"item": {
"name": "helm-robot",
"projectName": "helm"
},
"json": {
"creation_time": "2022-03-21T10:05:49.248Z",
"expires_at": -1,
"id": 67,
"name": "robot@helm-robot",
"secret": "Q8mjthgRJFmscjfmqW1QzXEyKjmLEPQm"
},
"x_envoy_upstream_service_time": "18",
"x_request_id": "496faaa6-bdc4-4e83-890a-2c577576f16b"
},
{
"ansible_loop_var": "item",
"content_type": "application/json",
"cookies": {
"sid": "6275d7bfe74e71db0a3947f4beb1e159"
},
"cookies_string": "sid=6275d7bfe74e71db0a3947f4beb1e159",
"date": "Mon, 21 Mar 2022 10:05:56 GMT",
"elapsed": 1,
"failed": false,
"failed_when_result": false,
"invocation": {
"module_args": {
"attributes": null,
"body": {
"description": "pull artifacts for proxy",
"disable": true,
"duration": -1,
"level": "system",
"name": "proxy-robot",
"permissions": [
{
"access": [
{
"action": "pull",
"resource": "repository"
}
],
"kind": "project",
"namespace": "proxy"
}
]
},
"body_format": "json",
"group": null,
"headers": {
"Accept": "application/json",
"Authorization": "Basic ",
"Content-Type": "application/json"
},
"http_agent": "ansible-httpget",
"method": "POST"
],
"timeout": 30,
"unix_socket": null,
"validate_certs": false
}
},
"item": {
"name": "proxy-robot",
"projectName": "proxy"
},
"json": {
"creation_time": "2022-03-21T10:05:56.807Z",
"expires_at": -1,
"id": 68,
"name": "robot@proxy-robot",
"secret": "slPnm8Zkp0OGBLec6tTcPuPITgOU2PAn"
},
"msg": "OK (144 bytes)",
"x_envoy_upstream_service_time": "15",
"x_request_id": "93478b05-897b-4df9-abb4-e07e03723af0"
}

如果我添加一个以上的变量

project_namespaces:
- projectName: helm
Namespaces: 
- default
- core
- projectName: proxy
Namespaces: 
- default
- core

根据变量,预期输出应该是:

ok: [localhost] => (item=helm) => {
"msg": "name: helm, namespace: default, password: Q8mjthgRJFmscjfmqW1QzXEyKjmLEPQm, username: robot@helm-robot"
}
ok: [localhost] => (item=helm) => {
"msg": "name: helm, namespace: core, password: Q8mjthgRJFmscjfmqW1QzXEyKjmLEPQm, username: robot@helm-robot"
}
ok: [localhost] => (item=proxy) => {
"msg": "name: proxy, namespace: default, password: slPnm8Zkp0OGBLec6tTcPuPITgOU2PAn, username: robot@proxy-robot"
}
ok: [localhost] => (item=proxy) => {
"msg": "name: proxy, namespace: core, password: slPnm8Zkp0OGBLec6tTcPuPITgOU2PAn, username: robot@proxy-robot"
}

在不知道结果的确切内容的情况下,您可以尝试:

- name: Reproduce issue
hosts: localhost
gather_facts: no
vars:
project_namespaces:
- projectName: helm
Namespaces: 
- default
- core
robot_result:
results:
- json:
creation_time: '2022-03-21T10:29:18.331Z'
expires_at: -1
id: 75
username: robot@helm-robot
secret: YzDDEtJcqYoBL2soZHfTqZxvhIfGKURT
- json:
creation_time: '2022-03-21T10:29:22.129Z'
expires_at: -1
id: 76
username: robot@proxy-robot
secret: 7imXCVAGHV91AkeN7LAhWxQHabmYDRmg
tasks:
- debug: 
msg: "name: {{ item.0.projectName }}, namespace: {{ item.1 }}, password: {{ project.secret }}, username: {{ project.username }}"  #{{ ansible_loop.index0 }}"
vars:
project: "{{ (robot_result.results | json_query('[*].json'))[ansible_loop.index0] }}"         
loop: "{{ project_namespaces | subelements('Namespaces') }}"
loop_control:
extended: yes
label: "{{ item.0.projectName }}"

结果:

ok: [localhost] => (item=helm) => {
"msg": "name: helm, namespace: default, password: YzDDEtJcqYoBL2soZHfTqZxvhIfGKURT, username: robot@helm-robot"
}
ok: [localhost] => (item=helm) => {
"msg": "name: helm, namespace: core, password: 7imXCVAGHV91AkeN7LAhWxQHabmYDRmg, username: robot@proxy-robot"
}

最新更新