Ansible 2.8:访问列表对象元素
Ansible 2.8: Access a list object element
在 Ansible 2.8 中,我需要在 Ubuntu 服务器虚拟机上部署和配置 Bind 9 DNS。我有一个:
- DNS Ansible 角色进行安装和配置,
- 每个域区域的变量列表(如 DNS 记录类型、域名、dns 条目...)。直到这里,它才起作用,当我试图让它接受下一个要求时出现问题:
- 可能会在同一个调用中配置多个域区域,因此,我向它发送了一个包含变量组的列表(在 2 中提到)。
目前,在 shell 中,我用 1 个元素列表调用它,使用:
--extra-vars "{"dns_entry_conf":
[domain=example.gal ip=192.168.167.166
nameserver1=example.gal nameserver1_ip=192.168.167.164
dns_record1_type=A ...]}"
在角色内部,roles/dns/tasks/configure.yml
文件收到正确的值,但后面的文件却没有:它说 "list object has no attribute",我开始在 configure.yml 中调试文件,但我不确定如何访问列表对象项:
---
- debug:
msg: "{{dns_entry_conf}}"
- debug:
msg: "{{dns_entry_conf | json_query(\"domain\") }}"
第一行打印了它应该打印的内容,但第二行没有...我如何访问该值
ASK [dns : debug] **********************************************************************************
task path: /etc/ansible/roles/dns/tasks/configure.yml:2
ok: [ubuntuServer16_test] => {
"msg": [
"domain=example.gal ip=192.168.167.166 nameserver1=example.gal nameserver1_ip=192.168.167.164
dns_record1_type=A ...
]
}
TASK [dns : debug] **********************************************************************************
task path: /etc/ansible/roles/dns/tasks/configure.yml:4
ok: [ubuntuServer16_test] => {
"msg": ""
}
在调试中,尝试使用消息:"{{ dns_entry_conf.domain }}"
、"{{ dns_entry_conf.0 }}"
、"{{dns_entry_conf | json_query(\"domain\") }}"
、"{{ dns_entry_conf.list | json_query('[*].domain') }}"
和其他语法错误的消息,但它从未输出我想要的想要。
可能还有更多错误(我不是 Ansible 专家),但是,目前,只是尝试逐一调试和修复,所以,我只想知道如何访问"dns_entry_conf.domain" 项,请...有什么想法吗?
选项 1:
带有如下额外变量:
--extra-vars '{"dns_entry_conf":{"domain":example,"ip":1.2.3.4}}'
剧本:
- debug:
msg: "{{dns_entry_conf.domain}}"
输出:
ok: [localhost] => {
"msg": "example"
}
选项2:
具有如下额外变量:
--extra-vars '{"dns_entry_conf":["domain":example,"ip":1.2.3.4]}'
在剧本中如下:
- debug:
msg: "{{dns_entry_conf[0].domain}}"
输出:
ok: [localhost] => {
"msg": "example"
}
选项 3:
传递剧本中的变量。
vars:
dns_entry_conf:
domain: example
ip: 1.2.34.4
tasks:
- debug:
msg: "{{dns_entry_conf.domain}}"
输出:
ok: [localhost] => {
"msg": "example"
}
在 Ansible 2.8 中,我需要在 Ubuntu 服务器虚拟机上部署和配置 Bind 9 DNS。我有一个:
- DNS Ansible 角色进行安装和配置,
- 每个域区域的变量列表(如 DNS 记录类型、域名、dns 条目...)。直到这里,它才起作用,当我试图让它接受下一个要求时出现问题:
- 可能会在同一个调用中配置多个域区域,因此,我向它发送了一个包含变量组的列表(在 2 中提到)。
目前,在 shell 中,我用 1 个元素列表调用它,使用:
--extra-vars "{"dns_entry_conf":
[domain=example.gal ip=192.168.167.166
nameserver1=example.gal nameserver1_ip=192.168.167.164
dns_record1_type=A ...]}"
在角色内部,roles/dns/tasks/configure.yml
文件收到正确的值,但后面的文件却没有:它说 "list object has no attribute",我开始在 configure.yml 中调试文件,但我不确定如何访问列表对象项:
---
- debug:
msg: "{{dns_entry_conf}}"
- debug:
msg: "{{dns_entry_conf | json_query(\"domain\") }}"
第一行打印了它应该打印的内容,但第二行没有...我如何访问该值
ASK [dns : debug] **********************************************************************************
task path: /etc/ansible/roles/dns/tasks/configure.yml:2
ok: [ubuntuServer16_test] => {
"msg": [
"domain=example.gal ip=192.168.167.166 nameserver1=example.gal nameserver1_ip=192.168.167.164
dns_record1_type=A ...
]
}
TASK [dns : debug] **********************************************************************************
task path: /etc/ansible/roles/dns/tasks/configure.yml:4
ok: [ubuntuServer16_test] => {
"msg": ""
}
在调试中,尝试使用消息:"{{ dns_entry_conf.domain }}"
、"{{ dns_entry_conf.0 }}"
、"{{dns_entry_conf | json_query(\"domain\") }}"
、"{{ dns_entry_conf.list | json_query('[*].domain') }}"
和其他语法错误的消息,但它从未输出我想要的想要。
可能还有更多错误(我不是 Ansible 专家),但是,目前,只是尝试逐一调试和修复,所以,我只想知道如何访问"dns_entry_conf.domain" 项,请...有什么想法吗?
选项 1: 带有如下额外变量:
--extra-vars '{"dns_entry_conf":{"domain":example,"ip":1.2.3.4}}'
剧本:
- debug:
msg: "{{dns_entry_conf.domain}}"
输出:
ok: [localhost] => { "msg": "example" }
选项2:
具有如下额外变量:
--extra-vars '{"dns_entry_conf":["domain":example,"ip":1.2.3.4]}'
在剧本中如下:
- debug:
msg: "{{dns_entry_conf[0].domain}}"
输出:
ok: [localhost] => { "msg": "example" }
选项 3: 传递剧本中的变量。
vars:
dns_entry_conf:
domain: example
ip: 1.2.34.4
tasks:
- debug:
msg: "{{dns_entry_conf.domain}}"
输出:
ok: [localhost] => { "msg": "example" }