我想在 ini_file 中设置一个值,但这个值是当前时间的 MD5 哈希值。(我不担心意外替换该值,或者神奇地运行两次并在两个不同的服务器中得到相同的值。)
这是我尝试过的,但只得到了命令作为文件中的值(不确定为什么我认为它会起作用......):
- name: Replace HardwareID with new MD5
ini_file:
path: /etc/app/config.ini
section: DEFAULT
option: hardware_token
value: $(date | md5sum | cut -d" " -f1)
有没有简单的方法可以使它工作?
答案1
问:“如何使用 Ansible ini_file 里面命令的输出值?“
A:注册命令的结果并作为值,例如
- hosts: test_24
gather_facts: false
tasks:
- shell: 'date | md5sum | cut -d" " -f1'
register: result
check_mode: false
- debug:
var: result
- name: Replace HardwareID with new MD5
ini_file:
path: etc/app/config.ini
section: DEFAULT
option: hardware_token
value: "{{ result.stdout }}"
给出(使用--check --diff 运行)
TASK [Replace HardwareID with new MD5] ***********************************
--- before: etc/app/config.ini (content)
+++ after: etc/app/config.ini (content)
@@ -0,0 +1,3 @@
+
+[DEFAULT]
+hardware_token = ba3f11c4f1ecfe9d1e805dc8c8c8b149
changed: [test_24]
如果您想使用数据和时间作为输入,使用 Ansible 事实会更容易。例如,字典ansible_date_time如果您收集了事实,则保留日期和时间。在剧本中,我们设置了gather_facts: false
。因此字典没有定义
- debug:
var: ansible_date_time.iso8601
给出
ok: [test_24] =>
ansible_date_time.iso8601: VARIABLE IS NOT DEFINED!
你必须gather_facts: true
在开始游戏或运行时收集事实setup
,例如
- setup:
gather_subset: min
- debug:
var: ansible_date_time.iso8601
给出
ok: [test_24] =>
ansible_date_time.iso8601: '2021-07-29T21:32:26Z'
这不太实用,因为要获取当前时间,您必须运行setup
。相反,过滤器时间字符串始终为您提供当前时间,例如
- debug:
msg: "{{ '%Y-%m-%d %H:%M:%S' | strftime }}"
- name: Replace HardwareID with new MD5
ini_file:
path: etc/app/config.ini
section: DEFAULT
option: hardware_token
value: "{{'%Y-%m-%d' | strftime | hash('md5') }}"
给出
TASK [debug] ***************************************************************
ok: [test_24] =>
msg: '2021-07-29'
TASK [Replace HardwareID with new MD5] *************************************
--- before: etc/app/config.ini (content)
+++ after: etc/app/config.ini (content)
@@ -0,0 +1,3 @@
+
+[DEFAULT]
+hardware_token = 5847924805aa614957022ed73d517e7e
附注:如果日期时间(以秒为单位)作为索引,则使用此哈希可能会非常快速地进行搜索。
答案2
Ansible 可以生成自己的日期和时间字符串,并进行自己的 MD5 计算,而无需调用外部程序。考虑:
---
- hosts: localhost
connection: local
tasks:
- debug:
msg: "{{ ansible_date_time.iso8601 | hash('md5') }}"
请注意,ansible_date_time
包含您上次从远程服务器收集事实的时间,不一定是当前时间。如果您在每次运行剧本时都收集事实,那么这应该不是问题。