Ansible Core 2.15.2:如何在shell模块中实现大括号展开?
问题解决方法
一、大括号展开失效的原因及解决办法
你遇到的问题是因为Ansible的shell模块默认使用/bin/sh执行命令,而sh不支持{1..32}这种大括号展开语法(该语法是bash的专属特性)。有两种解决方式:
1. 指定shell模块用bash执行
修改任务,通过args.executable参数指定使用bash运行命令,让大括号展开生效:
- name: Create panel directories in /vista shell: mkdir /vista/board{1..32} args: executable: /bin/bash
注:如果目录已存在,该命令会报错,建议加上-p参数避免错误:mkdir -p /vista/board{1..32}
2. 推荐使用Ansible原生file模块(符合最佳实践)
不依赖shell特性,直接用file模块配合循环创建目录,还能同时设置权限和归属,一步完成需求:
- name: Create panel directories in /vista file: path: "/vista/board{{ item }}" state: directory owner: joe group: joe mode: '0755' # 可根据需求调整权限,默认即为0755 loop: "{{ range(1, 33) | list }}"
也可以用with_sequence语法简化循环写法:
- name: Create panel directories in /vista file: path: "/vista/board{{ item }}" state: directory owner: joe group: joe with_sequence: start=1 end=32
二、目录权限修改的问题
你原来的chown joe:joe /vista/board*命令是可行的,但存在两个不足:
- 依赖shell通配符匹配,若系统默认
sh是dash这类不兼容的shell,可能出现匹配失败; - 非幂等操作——重复执行时即使权限已正确,仍会执行命令,而Ansible的file模块是幂等的,仅当权限/归属不符合时才会修改。
更优的处理方式:
- 若为新创建目录:直接用上面的file模块,创建时就指定
owner和group,无需额外任务; - 若目录已存在,批量修改归属:
- name: Update ownership of board directories file: path: "/vista/board{{ item }}" owner: joe group: joe loop: "{{ range(1, 33) | list }}"
内容的提问来源于stack exchange,提问作者rocky_alpine
相关产品推荐
相关产品推荐

