如何在 ansible ini_file 值中使用命令的输出

如何在 ansible ini_file 值中使用命令的输出

我想在 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包含您上次从远程服务器收集事实的时间,不一定是当前时间。如果您在每次运行剧本时都收集事实,那么这应该不是问题。

相关内容