Ansible - 从字典中获取一个键(但不是在循环中)
Ansible - grab a key from a dictionary (but not in a loop)
关于 Ansible 中字典的另一个问题!
为方便起见,我在字典中保存了 mysql 数据库的某些值,这可以很好地使用 with_dict
循环创建数据库和数据库用户。
mysql_dbs:
db1:
user: db1user
pass: "jdhfksjdf"
accessible_from: localhost
db2:
user: db2user
pass: "npoaivrpon"
accessible_from: localhost
任务:
- name: Configure mysql users
mysql_user: name={{ item.value.user }} password={{ item.value.pass }} host={{ item.value.accessible_from }} priv={{ item.key }}.*:ALL state=present
with_dict: "{{ mysql_dbs }}"
但是,我想在另一个任务中使用其中一个词典中的键,但我不想遍历词典,我只想一次使用一个。我如何获取描述字典的键(抱歉,不确定术语)?
问题任务:
- name: Add the db1 schema
shell: mysql {{ item }} < /path/to/db1.sql
with_items: '{{ mysql_dbs[db1] }}'
ansible 错误 运行:
fatal: [myhost]: FAILED! => {"failed": true, "msg": "'item' is undefined"}
我愿意相信 with_items
不是最好的策略,但是有人知道什么是正确的策略吗?
在此先感谢,现在已经坚持了一段时间...
给定一个嵌套字典...
mysql_dbs:
db1:
user: db1user
pass: "jdhfksjdf"
accessible_from: localhost
db2:
user: db2user
pass: "npoaivrpon"
accessible_from: localhost
您可以使用点分符号:
- debug:
var: mysql_dbs.db1
或者您可以使用更 Python 风格的语法:
- debug:
var: mysql_dbs['db1']
看起来你试图使用一个邪恶的混合体:
mysql_dbs[db1]
在这种情况下,您正在尝试取消引用名为 db1
的变量,
这大概不存在并会导致“变量是
未定义”的错误。
更新
你的问题不清楚,因为在你的例子中你有...
with_items: '{{ mysql_dbs[db1] }}'
...看起来您正在尝试执行我在此处描述的操作。如果您真正想要做的是遍历 mysql_dbs
字典的键,请记住它只是一个 Python 字典并且您可以使用所有标准字典方法,因此:
- debug:
msg: "key: {{ item }}"
with_items: "{{ mysql_dbs.keys() }}"
其输出为:
TASK [debug] *******************************************************************
ok: [localhost] => (item=db1) => {
"item": "db1",
"msg": "key: db1"
}
ok: [localhost] => (item=db2) => {
"item": "db2",
"msg": "key: db2"
}
关于 Ansible 中字典的另一个问题!
为方便起见,我在字典中保存了 mysql 数据库的某些值,这可以很好地使用 with_dict
循环创建数据库和数据库用户。
mysql_dbs:
db1:
user: db1user
pass: "jdhfksjdf"
accessible_from: localhost
db2:
user: db2user
pass: "npoaivrpon"
accessible_from: localhost
任务:
- name: Configure mysql users
mysql_user: name={{ item.value.user }} password={{ item.value.pass }} host={{ item.value.accessible_from }} priv={{ item.key }}.*:ALL state=present
with_dict: "{{ mysql_dbs }}"
但是,我想在另一个任务中使用其中一个词典中的键,但我不想遍历词典,我只想一次使用一个。我如何获取描述字典的键(抱歉,不确定术语)?
问题任务:
- name: Add the db1 schema
shell: mysql {{ item }} < /path/to/db1.sql
with_items: '{{ mysql_dbs[db1] }}'
ansible 错误 运行:
fatal: [myhost]: FAILED! => {"failed": true, "msg": "'item' is undefined"}
我愿意相信 with_items
不是最好的策略,但是有人知道什么是正确的策略吗?
在此先感谢,现在已经坚持了一段时间...
给定一个嵌套字典...
mysql_dbs:
db1:
user: db1user
pass: "jdhfksjdf"
accessible_from: localhost
db2:
user: db2user
pass: "npoaivrpon"
accessible_from: localhost
您可以使用点分符号:
- debug:
var: mysql_dbs.db1
或者您可以使用更 Python 风格的语法:
- debug:
var: mysql_dbs['db1']
看起来你试图使用一个邪恶的混合体:
mysql_dbs[db1]
在这种情况下,您正在尝试取消引用名为 db1
的变量,
这大概不存在并会导致“变量是
未定义”的错误。
更新
你的问题不清楚,因为在你的例子中你有...
with_items: '{{ mysql_dbs[db1] }}'
...看起来您正在尝试执行我在此处描述的操作。如果您真正想要做的是遍历 mysql_dbs
字典的键,请记住它只是一个 Python 字典并且您可以使用所有标准字典方法,因此:
- debug:
msg: "key: {{ item }}"
with_items: "{{ mysql_dbs.keys() }}"
其输出为:
TASK [debug] *******************************************************************
ok: [localhost] => (item=db1) => {
"item": "db1",
"msg": "key: db1"
}
ok: [localhost] => (item=db2) => {
"item": "db2",
"msg": "key: db2"
}