如何根据文件内容定义changed_when?

问题描述 投票:0回答:2

我在我们的服务器和工作站上进行了一些安装,这些安装是通过专有的安装脚本(例如 MATLAB)执行的。

保持幂等性我想分析在该过程中创建的日志文件。如何根据这些日志文件的内容定义

changed_when

例如,

command
任务目前如下所示:

- name: Run MATLAB installer
  ansible.builtin.command:
    argv:
      - /mnt/matlabiso/install
      - -inputFile
      - /mnt/downloads/Software/MATLAB/R2024a/installer_input_linux.txt
  changed_when: false

因此,此命令会在 /tmp/ML2024.log 中创建一个日志文件,其中最后一行为“安装成功”,如果不成功则为“安装失败”。如果记住正确的话,命令本身通常不会失败。

如果我正确理解了我的linter,

changed_when: false
,那么读取日志文件的内容并通过调试进行打印并不是调用命令的真正幂等方式,因为更改已经通过命令完成了。

所以实际问题:我是否错过了命令如何处理文件内容的方法,而无需创建自定义脚本,该脚本随后执行、设置并读取内容。

ansible
2个回答
1
投票

问:“为了保持幂等性,我想分析在此过程中创建的日志文件。

不过,这对我来说看起来像是自定义事实的工作。

问:“

command
如何能够处理文件内容,而无需创建自定义脚本,然后执行、设置并读取内容?

事实并非如此,它也不是为此而设计的。请参阅

command
模块 – 在目标上执行命令 - 注释 并至少“如果需要这些功能,请使用 ansible.builtin.shell
 模块。

问:“此命令在 /tmp/ML2024.log

 处创建一个日志文件,其中 
Succesful installed
 行作为最后一行,如果不成功,则为 
Installation failed

这听起来更像是

定义失败failed_when

的状态,因为它不告诉它之前是否已经安装过。查看最小的示例手册

--- - hosts: localhost become: false gather_facts: false tasks: - shell: cmd: echo 'Installation failed' > /tmp/ML2024.log | grep 'Succesful installed' /tmp/ML2024.log register: result - debug: var: result
产生

的输出

TASK [shell] ******************************************************************* fatal: [localhost]: FAILED! => changed=true cmd: echo 'Installation failed' > /tmp/ML2024.log | grep 'Succesful installed' /tmp/ML2024.log delta: '0:00:00.007761' end: '2024-11-12 09:30:00.347773' msg: non-zero return code rc: 1 start: '2024-11-12 09:30:00.340012' stderr: '' stderr_lines: <omitted> stdout: '' stdout_lines: <omitted>
只需 

注册 result

 并检查 通用返回值 就已经提供了一些相关功能。
    


0
投票
您可以编写自己的自定义模块,该模块将根据日志文件设置其值“已更改”。但这是很多工作。

正如您所说,命令本身大多会成功,并且您想要更广泛的“成功”概念。

你最好的选择似乎是将多个命令包装在一个

中。

块允许您按顺序运行多个命令,并将该组命令视为成功或失败,以及在失败时可以执行一些清理步骤。

© www.soinside.com 2019 - 2024. All rights reserved.