Ansible 的 with_sequence(或现代 loop + range)适合批量创建结构对称的测试账户,通过序列生成规律命名、UID、组名等字段,实现声明式、无重复、可复用的批量构造。

Ansible 的 with_sequence(在 Ansible 2.5+ 中推荐改用 loop + range(),但 with_sequence 仍兼容)适合生成编号规律的资源,比如批量创建结构一致的测试账户。关键不在于“秒级”(实际耗时取决于目标主机响应和账户创建逻辑),而在于**声明式、无重复、可复用的批量构造能力**。
用 with_sequence 生成连续数字序列
with_sequence 可指定起始、结束、步长和格式,常用于构造用户名、UID、组名等有规律的字段。例如创建 100 个用户 testuser001 到 testuser100:
- name: Create test users with sequential names
user:
name: "testuser{{ item | pad(3) }}"
state: present
create_home: yes
shell: /bin/bash
with_sequence: start=1 end=100 format="%03d"
其中 format="%03d" 保证三位数字补零,pad(3) 是 Jinja2 过滤器(需 Ansible ≥ 2.10),若版本较低可直接用 item | string | zfill(3)。
组合多个序列字段构建对称结构
测试账户常需配套 UID、GID、家目录、SSH 公钥路径等。可用 with_sequence 控制主索引,再通过算术推导其他字段:
- 设起始 UID 为 2000,则第
n个用户 UID =2000 + n - 让每个用户属于同名私有组(
group: "testuser{{ item | pad(3) }}") - 家目录统一为
/home/testuser{{ item | pad(3) }} - SSH 公钥文件名映射为
/tmp/keys/testuser{{ item | pad(3) }}.pub
这样所有账户字段由同一序列驱动,天然“结构对称”,无需硬编码或外部清单。
配合 loop_control 提升可读性与调试效率
当序列较长(如 500 个用户),建议启用 loop_control.label 简化日志输出,并用 when 条件跳过已存在用户(避免重复失败):
- name: Create symmetric test accounts
user:
name: "{{ username }}"
uid: "{{ 2000 + item }}"
group: "{{ username }}"
home: "/home/{{ username }}"
shell: /bin/bash
create_home: yes
vars:
username: "testuser{{ item | pad(3) }}"
with_sequence: start=1 end=500 format="%03d"
loop_control:
label: "user={{ username }}, uid={{ 2000 + item }}"
when: not (username in ansible_facts['users'] | default({}))
注意:ansible_facts['users'] 需提前用 setup 模块收集(或改用 getent 模块查用户是否存在),确保幂等性。
迁移到现代 loop + range(推荐长期维护)
Ansible 官方已标记 with_* 为 legacy。等效的现代写法更清晰、易组合:
- name: Create users using loop + range
user:
name: "testuser{{ '%03d' % item }}"
uid: "{{ 2000 + item }}"
group: "testuser{{ '%03d' % item }}"
home: "/home/testuser{{ '%03d' % item }}"
loop: "{{ range(1, 501) | list }}"
range(1, 501) 生成 1–500 整数列表(Python 语义),配合字符串格式化,逻辑直白,且支持嵌套表达式、过滤器链,扩展性更强。











