【问题标题】:Ansible - grab a key from a dictionary (but not in a loop)Ansible - 从字典中获取一个键(但不在循环中)
【发布时间】:2016-07-28 22:38:54
【问题描述】:

关于 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 不是这里最好的策略,但有人知道什么是正确的吗?

在此先感谢,已经卡了一段时间了...

【问题讨论】:

  • 我认为您不小心删除了部分问题?我指的是“我试过了”之后的神秘空地。

标签: python yaml ansible ansible-playbook


【解决方案1】:

给定一个嵌套字典...

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"
}

【讨论】:

  • 不幸的是,这似乎给了我字典中的值:{u'accessible_from': u'localhost', u'user': u'db1user', u'pass': u'jdhfksjdf'}",有什么办法可以抓住钥匙?
  • 当然。只需添加另一个点;我希望这很明显:mysql_dbs.db1.usermysql_dbs.db2.pass 等。或者,mysql_dbs['db1']['user'] 等。
  • 对不起,我认为我的问题不够清楚 - 我想呈现例如db1db2,而不是字典中的值:userpassaccessible_from。这可能吗?
  • 这似乎不是完成的事情,但感谢你的坚持,成功了! :)
  • remember that it is simply a Python dictionary and you have available all the standard dictionary methods 正是我需要听到的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 2022-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 2011-07-08
  • 1970-01-01
相关资源
最近更新 更多