Ansible lineinfile - 仅在缺失时添加子字符串

问题描述 投票:0回答:1

我正在尝试禁用内核中的transparent_hugepage。根据 this 文章,这意味着将子字符串

transparent_hugepage=never
添加到
GRUB_CMDLINE_LINUX
中的
/etc/default/grub
变量。

我的尝试看起来像:

- name: disable transparent_hugepage
  ansible.builtin.lineinfile:
    path: /etc/default/grub
    regexp: '^(GRUB_CMDLINE_LINUX="[^"]+)"'
    line: '\g<1> transparent_hugepage=never"'
    backrefs: yes

然而,每次 ansible 运行时都会添加子字符串,而不仅仅是在缺少子字符串时。

# grep CMD /etc/default/grub
GRUB_CMDLINE_LINUX="resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet transparent_hugepage=never transparent_hugepage=never"

肯定有一种更好的方法来处理这个问题,而不是尝试用正则表达式负向前瞻来做一些奇特的事情?

我尝试使用前瞻方法:

regexp: '^(GRUB_CMDLINE_LINUX="[^"]+)(?! transparent_hugepage=never)"'

但它的行为是一样的。

string file text ansible insert
1个回答
1
投票

肯定有更好的方法来处理这个问题......

为了确保在其他服务启动之前禁用 THP,应该创建一个在启动过程中禁用 THP 的服务文件。这是某些开源项目推荐的方法,示例之一是 MongoDB - 禁用透明大页 (THP)

放置服务文件

[Unit]
Description=Disable Transparent Huge Pages (THP)

[Service]
Type=simple
ExecStart=/bin/sh -c "echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

在远程节点上通过

- name: Create a service file in order to disable THP automatically
  copy: 
    src: disable-thp.service
    dest: /etc/systemd/system/disable-thp.service

比,一项任务就可以完成工作

- name: Make sure Transparent Huge Pages (THP) are disabled
  systemd:
    state: started
    enabled: yes
    name: disable-thp

双重检查 CLI 结果到

的输出
systemctl status disable-thp
○ disable-thp.service - Disable Transparent Huge Pages (THP)
     Loaded: loaded (/etc/systemd/system/disable-thp.service; enabled; preset: disabled)
     Active: inactive (dead) since Thu 2024-03-01 10:00:00 CET; 11 days ago
   Duration: 39ms
    Process: 884 ExecStart=/bin/sh -c echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && ...
   Main PID: 884 (code=exited, status=0/SUCCESS)
        CPU: 4ms

cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

cat /sys/kernel/mm/transparent_hugepage/defrag
always defer defer+madvise madvise [never]

进一步阅读

© www.soinside.com 2019 - 2024. All rights reserved.