Ansible - 从字典中获取一个键(但不是在循环中)

tic*_*use 2 python yaml ansible ansible-playbook

关于Ansible字典的另一个问题!

为方便起见,我对字典中保存的mysql数据库有一定的价值,可以循环使用with_dict来创建数据库和数据库用户.

mysql_dbs:
  db1:
    user: db1user
    pass: "jdhfksjdf"
    accessible_from: localhost
  db2:
    user: db2user
    pass: "npoaivrpon"
    accessible_from: localhost
Run Code Online (Sandbox Code Playgroud)

任务:

- 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 }}"
Run Code Online (Sandbox Code Playgroud)

但是,我想在另一个任务中使用其中一个字典中的密钥,但我不想遍历字典,我只想一次使用一个.我如何获取描述字典的密钥(抱歉,不确定术语)?

问题任务:

- name: Add the db1 schema
  shell: mysql {{ item }} < /path/to/db1.sql 
  with_items: '{{ mysql_dbs[db1] }}'
Run Code Online (Sandbox Code Playgroud)

ansible运行错误:

fatal: [myhost]: FAILED! => {"failed": true, "msg": "'item' is undefined"}
Run Code Online (Sandbox Code Playgroud)

我愿意相信with_items这不是最好的策略,但有没有人有任何想法什么是正确的?

提前谢谢,现在已经坚持了一段时间......

lar*_*sks 11

给出一个嵌套字典......

mysql_dbs:
  db1:
    user: db1user
    pass: "jdhfksjdf"
    accessible_from: localhost
  db2:
    user: db2user
    pass: "npoaivrpon"
    accessible_from: localhost
Run Code Online (Sandbox Code Playgroud)

您可以使用点分表示法:

- debug:
    var: mysql_dbs.db1
Run Code Online (Sandbox Code Playgroud)

或者您可以使用更多Python式语法:

- debug:
    var: mysql_dbs['db1']
Run Code Online (Sandbox Code Playgroud)

看起来你试图使用邪恶的混合:

mysql_dbs[db1]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您试图取消引用一个名为的变量db1,该变量可能不存在,并且会导致"变量未定义"类型的错误.

更新

你的问题不清楚,因为在你的例子中你有......

with_items: '{{ mysql_dbs[db1] }}'
Run Code Online (Sandbox Code Playgroud)

......看起来你正试图完全按照我在这里描述的那样做.如果您真正想要做的是迭代mysql_dbs字典的键,请记住它只是一个Python字典,并且您可以使用所有标准字典方法,因此:

- debug:
    msg: "key: {{ item }}"
  with_items: "{{ mysql_dbs.keys() }}"
Run Code Online (Sandbox Code Playgroud)

其输出将是:

TASK [debug] *******************************************************************
ok: [localhost] => (item=db1) => {
    "item": "db1", 
    "msg": "key: db1"
}
ok: [localhost] => (item=db2) => {
    "item": "db2", 
    "msg": "key: db2"
}
Run Code Online (Sandbox Code Playgroud)

  • `请记住,它只是一个 Python 词典,您可以使用所有标准词典方法`正是我需要听到的。谢谢。 (2认同)