在Ansible中实现类似yum模块的条件

50次阅读
没有评论

问题描述

正在处理一个CentOS 5主机,并且需要使用yum安装一些软件包。然而,据他所知,CentOS 5不支持Ansible的yum模块,因为它需要python2绑定,而这已经过时了。所以他不得不使用commandshell模块,并且需要自己编写所有操作。用户的问题是:在使用commandshell模块时,应该实现哪些条件,使其类似于Ansible的yum模块,并且尽可能地保持’幂等性’?

解决方案

请注意以下操作可能会因不同环境而异,确保在操作前备份数据。

用户已经尝试了一些方法,下面将会根据他的示例代码,提供一些建议来改善方案。以下是根据他的问题描述和已有代码的一些建议:

安装/更新软件包

- name: INSTALL (C5) - Install package
  ansible.builtin.command:
    cmd: yum -y install <package>
  register: output_install
  changed_when: '"Installing:" in output_install["stdout"] or "Updating:" in output_install["stdout"]'
  failed_when: output_install["stdout"] is regex("No package.*available")

在这个任务中,用户已经制定了一个逻辑,用于在安装或更新软件包时判断是否有必要的更改。然而,还有一些改进的空间:

  1. Idempotency(幂等性):尽量保持任务的幂等性,即使任务已经执行过,也不会引起额外的更改。
  2. 可以将changed_when的条件更改为仅在确实发生更改时才将任务标记为已更改。
  3. 可以使用creates参数来检查软件包是否已经安装,如果已经安装,则不需要执行任务。

  4. 错误处理:需要添加更多的错误处理,以便在出现问题时能够及时识别和处理。

改进后的任务如下:

- name: INSTALL (C5) - Install package
  ansible.builtin.command:
    cmd: yum -y install <package>
    creates: /path/to/check/file/for/installed/package
  register: output_install
  changed_when: output_install["rc"] != 0  # Task will be marked as changed if the command returns non-zero exit code
  failed_when:
    - output_install["rc"] != 0
    - output_install["stdout"] is regex("No package.*available")

移除软件包

- name: UNINSTALL (C5) - Remove package
  ansible.builtin.command:
    cmd: yum -y remove <package>
  register: output_remove
  changed_when: '"Erasing" in output_remove["stdout"]'
  failed_when: "No Packages marked for removal" in output_remove["stdout"]

对于移除软件包的任务,同样需要进行改进:

  1. Idempotency(幂等性):同样需要尽量保持幂等性,确保任务不会引起额外的更改。
  2. 可以使用creates参数来检查软件包是否已经卸载,如果已经卸载,则不需要执行任务。

  3. 错误处理:同样需要更全面的错误处理,以便及时处理潜在的问题。

改进后的任务如下:

- name: UNINSTALL (C5) - Remove package
  ansible.builtin.command:
    cmd: yum -y remove <package>
    creates: /path/to/check/file/for/removed/package
  register: output_remove
  changed_when: output_remove["rc"] != 0  # Task will be marked as changed if the command returns non-zero exit code
  failed_when:
    - output_remove["rc"] != 0
    - "No Packages marked for removal" in output_remove["stdout"]

以上建议是基于已有代码的改进,以实现更好的幂等性和错误处理。希望这些改进能够帮助你在CentOS 5上以类似于Ansible的yum模块的方式执行操作。如有疑问或其他建议,欢迎继续提问。

请注意,在实际执行中,请确保适当地替换<package>为实际的软件包名称,并根据实际情况修改/path/to/check/file/for/installed/package/path/to/check/file/for/removed/package为合适的路径。

注意:根据你提供的问答数据,由于CentOS 5已经过时且不再支持,可能会出现一些不可预料的问题。最好的做法是尽早迁移到支持的操作系统版本,以获得更好的安全性和稳定性。

正文完