Não há looping ou iteração no fantoche.
Jogado um pouco mais, e aqui uma versão alternativa, que deve funcionar para qualquer número de ips em uma única interface e não usa um eval. to_hash.keys
retorna uma matriz de todos os nomes de variáveis, o find_all
filtra a lista com base na expressão regular, um map
ping é usado para procurar o valor real da variável e, finalmente, os resultados são mesclados de volta em um string.
$iplist=inline_template('<%= scope.to_hash.keys.find_all{|i| i =~ /ipaddress_.*/}.map{|j| scope.lookupvar(j)}.join(",")%>')
if $iplist =~ /10\.2\.93.*/ {
notify {"found $iplist": }
}
# on the client with a matching address we see "notice: found 10.2.93.5,127.0.0.1"
Eu tenho algo que funciona, mas não tenho certeza se é realmente a melhor solução, ou segura. Basicamente eu acho que você pode usar um inline_template. Dentro do modelo in-line, dividimos o fato de interfaces, que é uma lista de todas as interfaces. Usamos um mapeamento para construir uma nova matriz dos endereços IP de todas as interfaces e, finalmente, juntamos novamente a matriz a uma string.
Minha maior preocupação com essa ideia é que estou fazendo uma avaliação sobre algo que é basicamente fornecido pelo sistema do cliente. Eu não tenho certeza de como isso é mal.
Isso também será interrompido se uma interface tiver vários endereços ou se uma interface não tiver endereços. Talvez alguém possa sugerir algumas melhorias. Eu estou apenas aprendendo Ruby.
$iplist=inline_template('<%= interfaces.split(",").map{|x| eval ("ipaddress_"+x)}.join(",")%>')
if $iplist =~ /10\.2\.93.*/ {
notify {"found $iplist": }
}
# on the client with a matching address we see "notice: found 10.2.93.5,127.0.0.1"