如何通过 Ansible 禁用由 systemd 配置的交换文件?

如何通过 Ansible 禁用由 systemd 配置的交换文件?

使用 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 时再次发出该服务。

相关内容