Centos

如何通過 Ansible 禁用 systemd 配置的交換文件?

  • February 26, 2021

使用 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。

你可以讓 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 時再次發出該服務。

引用自:https://unix.stackexchange.com/questions/636525