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