代码之家  ›  专栏  ›  技术社区  ›  azzid

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

  •  0
  • azzid  · 技术社区  · 2 年前

    我正在尝试在内核中禁用transparent_hugepage。根据 this article意味着添加子字符串 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"
    

    肯定有更好的方法来处理这一问题,而不是试图用regex负前瞻来做一些花哨的事情吗?

    我尝试了前瞻性方法,使用:

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

    但它的行为是一样的。

    1 回复  |  直到 2 年前
        1
  •  1
  •   U880D    2 年前

    当然,一定有更好的方法来处理。。。

    为了确保在其他服务启动之前禁用THP,应该创建一个在启动期间禁用THP的服务文件。这是某些开源项目推荐的方法,例如 MongoDB - Disable Transparent Huge Pages (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]
    

    进一步阅读

    推荐文章