如何在Ansible Playbook中生成指定用户序列列表并存储为可复用变量
原代码报错的核心原因
你的运行报错来自两处明确的书写错误:
- 第一次
set_fact任务的键值格式错误:userItem: userItem= "{{ item }}"这行多写了冗余的userItem=前缀,按照set_fact的语法,直接写键: 变量值即可,这种写法会导致存进fact的内容本身不符合预期。 - 第二次
set_fact任务的Jinja模板引号未闭合:map(attribute= 'ansible_facts.userItem)这段里给attribute参数传值的单引号在userItem后面没有闭合,直接接了右括号,模板解析走到这里直接中断,抛出“unexpected end of template”的错误。
简化后的正确实现
完全没必要绕两步循环、注册结果、再提取属性的流程,直接用Jinja内置的range和字符串处理逻辑,一行就能在内存里生成目标列表:
- name: 生成user1到user20的用户列表 set_fact: users: "{{ range(1, 21) | map('regex_replace', '^', 'user') | list }}" - name: 校验列表生成结果 debug: var: users
最终生成的列表完全符合预期格式:
['user1', 'user2', 'user3', ..., 'user20'],全程存在内存变量里,不需要落盘存文件,后续任意任务都可以直接调用。
SSH配置场景的适配调整
你原来写的lineinfile任务里,直接把列表变量插到配置行里,会生成带方括号、单引号的Python原生列表格式,根本不符合sshd_config的语法要求,需要把列表元素用空格拼成普通字符串再写入配置:
- name: 配置SSH允许登录的用户 lineinfile: path: /etc/ssh/sshd_config regexp: '^AllowUsers ' # 把列表元素拼接为空格分隔的普通字符串 line: 'AllowUsers ansible {{ users | join(" ") }}' notify: "restart ssh"
补充一个笔误提醒:你原代码里写的配置路径
/etc/ssh/shd_config是错的,sshd的主配置文件路径是/etc/ssh/sshd_config,写错了会直接导致修改的文件不存在。
如果你还是想沿用之前参考的with_sequence方案,修正语法后的可运行版本如下:
- name: 逐次采集用户条目 set_fact: userItem: "{{ item }}" with_sequence: start=1 end=20 format=user%d register: userResult - name: 整合采集结果为目标列表 set_fact: users: "{{ userResult.results | map(attribute='ansible_facts.userItem') | list }}" - name: 校验最终列表内容 debug: var: users
内容的提问来源于stack exchange,提问作者L.Gashi
相关产品推荐
相关产品推荐

