我有一个 Ansible 剧本,用于配置新的 Linux VM。我最近用 Ubuntu 22.04 构建了一个新的 VM。剧本将编写一些与网络等相关的配置文件,然后该过程的最后一步是使用 Ansiblesansible.builtin.package
安装所有软件包更新。
- name: "Install updates"
become: true
ansible.builtin.package:
upgrade: "dist"
register: res_pkg_updates
notify: "reboot system"
tags: [ never, updates ]
我的虚拟机是根据几个月前制作的模板创建的,因此 Ubuntu 操作系统中有几个软件包已经过期,这并不出乎意料。问题是其中一个软件包必须支持或提供网络功能。因此,当模块package
在安装更新的路径上启动虚拟机时,网络守护程序会重新启动,并且虚拟机会获取之前在我的剧本中配置的新 IP。这会导致 Ansible 任务挂起,等待重新连接到现在处于不同 IP 的机器。
我想知道如何配置我的ansible.builtin.package
任务来安装软件包更新,但是不是重新启动所有服务,尤其是网络服务。
答案1
将 IP 地址更改与包裹交易及其余部分分开。
首先更新软件包并做其他事情。
作为此操作的最后一项,更新此主机的 IP 地址,但不要将接口调到新 IP 上。也许可以通过更改配置文件来实现。安排稍后重新启动此主机,例如使用模块ansible.posix.at
。最后,更新 DNS,以便 Ansible 清单知道 IP 更改。操作结束。稍后主机将自行重新启动,完成软件更新和 IP 更改。
ansible.builtin.wait_for_connection
如果尚未启动且无法访问,则可以从开始进行未来的播放,作为一种方便的重试方式。
ansible.builtin.reboot
理论上,模块可以重启,等待主机恢复,然后继续。但是它没有很好的方法可以重启一个 IP 地址,然后以另一个 IP 地址恢复。
答案2
另一种可能的方法是我为虚拟机使用静态 IP,而不是动态分配 IP。不重新启动网络守护进程可能会导致运行剧本时出现其他问题
或者你可以这样做
- name: Update package cache and install updates
ansible.builtin.package:
name: "*"
state: latest
update_cache: yes
force: no
become: yes
force: no 阻止包管理器强制更新或重新启动服务