我目前正在使用Ansible广告资源托管平台,并且我的脚本需要解析它们才能完成某些任务。
这里的问题是将字符串模式转换为数组或可以迭代的字符串,例如:
x="mymachine[1:2]cluster[1:2]"
for host in `parse_ansible_hosts $x`; do
echo $host
应该打印:
mymachine1cluster1
mymachine1cluster2
mymachine2cluster1
mymachine2cluster2
是否可以通过正则表达式或类似的方法来完成此任务?语法无法更改,因为它直接从ansible库存中解析。
答案 0 :(得分:1)
如果我对您的理解正确,则需要一个主机名生成器。如果这是正确的,并且模式像您的示例一样简单,那么bash已经覆盖了您:
$ for host in mymachine{1,2}cluster{1,2}; do
> echo $host
> done
mymachine1cluster1
mymachine1cluster2
mymachine2cluster1
mymachine2cluster2
也支持范围:
$ for host in mymachine{1..3}cluster{1..3}; do echo $host; done
mymachine1cluster1
mymachine1cluster2
mymachine1cluster3
mymachine2cluster1
mymachine2cluster2
mymachine2cluster3
mymachine3cluster1
mymachine3cluster2
mymachine3cluster3
要从示例模式转换为shell扩展可能是eval
安全使用的极少数情况之一-仅在模式源安全且受信任的情况下才使用此方式,例如网络界面:
$ x="mymachine[1:2]cluster[1:2]"
$ for host in $(eval \
echo $(sed 's/\[/{/g' <<<${x} | \
sed 's/]/}/g' | \
sed 's/:/,/g' )); do
echo $host
done
mymachine1cluster1
mymachine1cluster2
mymachine2cluster1
mymachine2cluster2
对于范围,它将显示为
$ for host in $(eval \
echo $(sed 's/\[/{/g' <<<${x} | \
sed 's/]/}/g' | \
sed 's/:/../g' )); do
echo $host
done
Nota Bene:
如果您有可能使用其他工具(例如python或ruby),则可以使用“反向regexp”实现。例如。 'regex-examples'作为ruby-gem:
irb(main):003:0> require 'regexp-examples'
=> true
irb(main):004:0> /a[bc]/.examples()
=> ["ab", "ac"]
irb(main):005:0> /mymachine[12]cluster[12]/.examples()
=> ["mymachine1cluster1", "mymachine1cluster2", "mymachine2cluster1", "mymachine2cluster2"]
答案 1 :(得分:0)
如果您的计算机/集群计数<10,请在变量:
中将-
替换为x
,这将成为正则表达式。
答案 2 :(得分:0)
我确定在您的主机上安装ansible类时,它们是公开可用的,因此您可以将其用作ansible类来解析清单。 我认为有趣的部分在https://github.com/ansible/ansible/tree/devel/lib/ansible/inventory
中