如何用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 }}'
逻辑说明
- 检查启用状态:通过
check_mode判断配置文件中是否存在已启用的HideUsers=行,结果存入hideusers_enabled变量,changed_when: false避免标记为任务变更。 - 启用配置:仅当未检测到启用行时,才在注释行后插入初始启用行,值为当前用户名。
- 追加用户:正则匹配不含当前用户名的
HideUsers=行,通过backrefs拼接内容。若为刚启用的场景(无历史启用行),直接写入用户名;若已启用,则在原有内容后追加,用户名。
运行效果
- 运行第一个playbook(username=frodo):生成
HideUsers=frodo - 运行第二个playbook(username=sam):检测到已启用行,直接追加为
HideUsers=frodo,sam
内容的提问来源于stack exchange,提问作者Harold123
相关产品推荐
相关产品推荐

