You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ansible启用配置项并向其追加用户名?

问题描述

需求:若配置项HideUsers处于禁用状态则启用它,随后向该配置项追加用户名。预期转换效果:

#HideUsers
变为:
#HideUsers
HideUsers=frodo,sam

但先后运行两个几乎相同的playbook后,得到错误结果:

#HideUsers
HideUsers=sam
HideUsers=frodo,sam

两个playbook内容如下:

Test playbook 1

---
  - name: "Test playbook 1."
    hosts: localhost
    tasks:
      - name: "Set the user to be added"
        set_fact:
          username: "frodo"

      - name: "Add {{ username }} to HideUsers option - if HideUsers has been enabled."
        lineinfile:
          path: "files/sddm.conf"
          regexp: "^HideUsers=((?!.*{{ item }}.*$).*$)"  # 检查用户名是否不在HideUsers中
          backrefs: True
          line: 'HideUsers=\1,{{ item }}'
        loop:
          - "{{ username }}"
 
      - name: "Enable HideUsers option if it is disabled."
        lineinfile:
          path: "files/sddm.conf"
          insertafter: '^#HideUsers=$'
          line: "HideUsers={{ username }}"

Test playbook 2

---
  - name: "Test playbook 2."
    hosts: localhost
    tasks:
      - name: "Set the user to be added"
        set_fact:
          username: "sam"

      - name: "Add {{ username }} to HideUsers option - if HideUsers has been enabled."
        lineinfile:
          path: "files/sddm.conf"
          regexp: "^HideUsers=((?!.*{{ item }}.*$).*$)"  # 检查用户名是否不在HideUsers中
          backrefs: True
          line: 'HideUsers=\1,{{ item }}'
        loop:
          - "{{ username }}"
 
      - name: "Enable HideUsers option if it is disabled."
        lineinfile:
          path: "files/sddm.conf"
          insertafter: '^#HideUsers=$'
          line: "HideUsers={{ username }}"

需要纯Ansible的实现方式,避免生成重复的HideUsers=配置行。

纯Ansible解决方案

问题核心是第二个playbook运行时,启用任务会因注释行#HideUsers仍存在而重复插入新行,同时追加任务的逻辑未适配初始启用场景。以下是改进后的实现:

改进后的可复用playbook

---
- name: Manage HideUsers configuration
  hosts: localhost
  vars:
    username: "sam"  # 可替换为frodo,或通过extra_vars传入
    conf_path: "files/sddm.conf"
  tasks:
    - name: 检查HideUsers是否已启用
      lineinfile:
        path: "{{ conf_path }}"
        regexp: "^HideUsers="
        state: present
        check_mode: yes
        register: hideusers_enabled
      changed_when: false

    - name: 未启用时启用HideUsers
      lineinfile:
        path: "{{ conf_path }}"
        insertafter: '^#HideUsers$'
        line: "HideUsers={{ username }}"
      when: not hideusers_enabled.found

    - name: 向HideUsers追加用户名(去重)
      lineinfile:
        path: "{{ conf_path }}"
        regexp: "^HideUsers=((?!.*{{ username }}).*)$"
        backrefs: yes
        line: 'HideUsers=\1{{ "\," if hideusers_enabled.found else "" }}{{ username }}'

逻辑说明

  1. 检查启用状态:通过check_mode判断配置文件中是否存在已启用的HideUsers=行,结果存入hideusers_enabled变量,changed_when: false避免标记为任务变更。
  2. 启用配置:仅当未检测到启用行时,才在注释行后插入初始启用行,值为当前用户名。
  3. 追加用户:正则匹配不含当前用户名的HideUsers=行,通过backrefs拼接内容。若为刚启用的场景(无历史启用行),直接写入用户名;若已启用,则在原有内容后追加,用户名。

运行效果

  • 运行第一个playbook(username=frodo):生成HideUsers=frodo
  • 运行第二个playbook(username=sam):检测到已启用行,直接追加为HideUsers=frodo,sam

内容的提问来源于stack exchange,提问作者Harold123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:47:38