是否可以用新值更新 ansible 中的字典?
Is it possible to update a dictionary in ansible with a new value?
是否可以用新值更新 ansible 中的字典?
这是我的:
vars:
LIST_OF_CERTS:
- url: "supercoolhost.org"
port: 443
expiry_date: ""
- url: "anotherHost.org"
port: 443
expiry_date: ""
然后在其中一个剧本中,我遇到了这种情况,我们循环 LIST_OF_CERTS 并对它们执行各种任务。其中一部分包括:
- name: Set Variables
set_fact:
CERT_NAME : "{{ item.url }}"
CERT_PORT : "{{ item.port }}"
有效,CERT_NAME 和 CERT_PORT 用于其他一些任务。除此之外,我正在尝试更新 expiry_date 位:
- name: Set expiry date
set_fact:
"{{ item.expiry_date }}" : "{{ EXPIRY_DATE.stdout }}"
虽然我认为这是一个错误:
fatal: [localhost]: FAILED! => {"changed": false, "msg": "The variable name '' is not valid. Variables must start with a letter or underscore character, and contain only letters, numbers and underscores."}
我做错了什么?看起来 "{{ item.expiry_date }}" 将输出我的空字符串,这是不正确的语法,这对我来说很有意义,但是我如何更新项目中的 expiry_date 键字典?
UPDATE 将 Set expiry date 设置为新内容,并尝试使用 combine:
更新 dict
- name: Set expiry date
set_fact:
CERT_EXPIRY : "{{ EXPIRY_DATE.stdout }}"
- name: Add in expiry date to list of certs and update dict.
set_fact:
LIST_OF_CERTS: "{ LIST_OF_CERTS|combine({{'url': CERT_NAME, 'port': CERT_PORT, 'expiry_date': CERT_EXPIRY }}) }"
虽然这似乎让我的口述空白了,因为我发送的通知电子邮件来自
The following certs were checked:
* {'url': 'supercoolhost.org', 'port': 443, 'expiry_date': ''}
* {'url': 'anotherHost.org', 'port': 443, 'expiry_date': ''}
仅:
The following certs were checked:
* url
* port
* expiry_date
我只是做了一个完全不同的解决方案:
创建了一个名为
的空列表
LIST_UPDATED_CERTS: []
然后像这样添加带有 expiry_date 的字典:
- name: Add in expiry date to list of certs.
set_fact:
LIST_UPDATED_CERTS: "{{ LIST_UPDATED_CERTS + [{'url': CERT_NAME, 'port': CERT_PORT, 'expiry_date': CERT_EXPIRY }]}}"
并且设置的电子邮件通知部分使用 LIST_UPDATED_CERTS 而不是 LIST_CERTS。
是否可以用新值更新 ansible 中的字典?
这是我的:
vars:
LIST_OF_CERTS:
- url: "supercoolhost.org"
port: 443
expiry_date: ""
- url: "anotherHost.org"
port: 443
expiry_date: ""
然后在其中一个剧本中,我遇到了这种情况,我们循环 LIST_OF_CERTS 并对它们执行各种任务。其中一部分包括:
- name: Set Variables
set_fact:
CERT_NAME : "{{ item.url }}"
CERT_PORT : "{{ item.port }}"
有效,CERT_NAME 和 CERT_PORT 用于其他一些任务。除此之外,我正在尝试更新 expiry_date 位:
- name: Set expiry date
set_fact:
"{{ item.expiry_date }}" : "{{ EXPIRY_DATE.stdout }}"
虽然我认为这是一个错误:
fatal: [localhost]: FAILED! => {"changed": false, "msg": "The variable name '' is not valid. Variables must start with a letter or underscore character, and contain only letters, numbers and underscores."}
我做错了什么?看起来 "{{ item.expiry_date }}" 将输出我的空字符串,这是不正确的语法,这对我来说很有意义,但是我如何更新项目中的 expiry_date 键字典?
UPDATE 将 Set expiry date 设置为新内容,并尝试使用 combine:
更新 dict- name: Set expiry date
set_fact:
CERT_EXPIRY : "{{ EXPIRY_DATE.stdout }}"
- name: Add in expiry date to list of certs and update dict.
set_fact:
LIST_OF_CERTS: "{ LIST_OF_CERTS|combine({{'url': CERT_NAME, 'port': CERT_PORT, 'expiry_date': CERT_EXPIRY }}) }"
虽然这似乎让我的口述空白了,因为我发送的通知电子邮件来自
The following certs were checked:
* {'url': 'supercoolhost.org', 'port': 443, 'expiry_date': ''}
* {'url': 'anotherHost.org', 'port': 443, 'expiry_date': ''}
仅:
The following certs were checked:
* url
* port
* expiry_date
我只是做了一个完全不同的解决方案: 创建了一个名为
的空列表LIST_UPDATED_CERTS: []
然后像这样添加带有 expiry_date 的字典:
- name: Add in expiry date to list of certs.
set_fact:
LIST_UPDATED_CERTS: "{{ LIST_UPDATED_CERTS + [{'url': CERT_NAME, 'port': CERT_PORT, 'expiry_date': CERT_EXPIRY }]}}"
并且设置的电子邮件通知部分使用 LIST_UPDATED_CERTS 而不是 LIST_CERTS。