解析Ansible库存主机模式

时间:2018-07-16 10:55:10

标签: regex bash ansible

我目前正在使用Ansible广告资源托管平台,并且我的脚本需要解析它们才能完成某些任务。

这里的问题是将字符串模式转换为数组或可以迭代的字符串,例如:

x="mymachine[1:2]cluster[1:2]"
for host in `parse_ansible_hosts $x`; do
    echo $host

应该打印:

mymachine1cluster1
mymachine1cluster2
mymachine2cluster1
mymachine2cluster2

是否可以通过正则表达式或类似的方法来完成此任务?语法无法更改,因为它直接从ansible库存中解析。

3 个答案:

答案 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