使用 systemd 和 Ansible 在一组 GNU/Linux 主机上完全禁用交换的最佳方法是什么?
无论出于何种原因,我的一些虚拟机在其 中配置了交换文件/etc/fstab
,该文件在启动时会自动拾取,systemd-fstab-generator
如下所示:
$ cat /run/systemd/generator/swapfile.swap
# Automatically generated by systemd-fstab-generator
[Unit]
SourcePath=/etc/fstab
Documentation=man:fstab(5) man:systemd-fstab-generator(8)
[Swap]
What=/swapfile
由于各种原因,在这些计算机上运行的某些服务在使用交换文件时会变得非常慢,因此我需要阻止它们使用它。我的 systemd 版本尚未包含MemorySwapMax
。
我想避免搞砸,/etc/fstab
而且我不介意将这些交换文件保留在原处。
对于上下文,我使用 ansible-3.0.0、ansible-base-2.10.6;这些机器是 CentOS 7,systemd 219。
答案1
您可以让 systemd 默认执行其操作,然后立即使用另一个 systemd 单元恢复它。
如果您检查,您将看到该单元所做的全部工作就是在该文件上systemd show swapfile.swap
运行。swapon
当您swapoff
手动发出时,交换将在下次启动时重新出现。
swapoff
之后立即运行swapon
只需要几分之一秒,因为没有任何内容可以从磁盘移回内存。但是你必须确保你跑了swapoff
后 swapon
,并且您可以告诉 systemd 这样做After=local-fs.target
。
将您的单元文件作为 j2 模板放置在您的剧本或角色的目录noswap.service.j2
中:templates/
{{ ansible_managed|comment }}
[Unit]
Description=Disable swapfile
Documentation=man:swapon(8) man:systemd.swap(5)
After=local-fs.target
[Service]
Type=oneshot
User=root
ExecStart=/usr/sbin/swapoff -a
[Install]
WantedBy=default.target
在你的剧本或角色中包含这样的内容:
---
- name: Your playbook
tasks:
- name: Write noswap systemd service config file
template:
src: noswap.service.j2
dest: /etc/systemd/system/noswap.service
owner: root
group: root
mode: 0644
notify: Enable noswap service
handlers:
- name: Enable noswap service
systemd:
name: noswap
state: started
enabled: true
daemon_reload: true
第一次之后,该服务将在引导期间启动,因此应该state: started
防止每次运行 ansible 时再次发出该服务。