Ansible中嵌套循环格式化自动生成带增量索引字符串变量的疑问
Ansible中嵌套循环格式化自动生成带增量索引字符串变量的疑问
嘿,我懂你想要实现的效果——自动生成带两位补零索引的服务器地址列表,还想用上%02d这种省心的格式化语法对吧?你之前的思路方向其实没大问题,但卡在了两个小细节上,咱们来捋清楚怎么解决。
首先说你原来写法的核心问题:你写的[server-%02d.example.com]里,格式字符串没加引号,Ansible会把它当成一个变量名去解析,自然找不到对应的变量就报错了。另外其实你完全没必要用product过滤器,反而把简单的事情复杂化了。
给你一个更简洁的正确写法:
"{{ range(1, 4) | map('format', 'server-%02d.example.com') | join(',') }}"
咱们拆解下这个写法的逻辑:
range(1,4)生成从1到3的整数序列(因为Ansible里的range是左闭右开的,所以结束值写4就会包含1、2、3)map('format', 'server-%02d.example.com')会把range里的每个数字,依次作为参数传入format函数,和前面的格式字符串组合,生成server-01.example.com、server-02.example.com这类符合要求的字符串- 最后用
join(',')把所有生成的字符串用逗号连接起来,就得到了你想要的结果
要是你好奇原来的product思路怎么修正(虽然确实没必要,但可以试试),只要给格式字符串加上引号就行,写法如下:
"{{ ['server-%02d.example.com'] | product(range(1,4)) | map('format') | join(',') }}"
这里product会把格式字符串和range里的每个数字配对成元组,比如('server-%02d.example.com', 1),map('format')会自动把元组里的元素作为参数传给format函数,同样能得到正确的格式化结果。
总之,最省心的还是第一种写法,直接用range配合map(format),简洁又好维护。
备注:内容来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

