Sugestão:
#!/bin/bash
# Location where bash scripts are located.
phy_ssh=/opt/wiki_scripts/servers.sh
# Hosts where we will ssh into.
Phy_Hosts=( vmfarm1 p12 barclay maximus backupfirefly accountant 10.6.6.90 )
SendFiles () {
local host="$1"
ssh "root@$host" 'bash -s' <"$phy_ssh"
ssh "root@$host" cat /root/phy_machines.txt
}
# backup databases
for host in "${Phy_Hosts[@]}"; do
SendFiles "$host"
done >/opt/wiki_scripts/phy_machines.txt
- O loop pode ser feito diretamente na matriz, sem necessidade de usar indexação.
- Você nunca usou a variável
host
na função. - Limpeza geral, incluindo a remoção da variável não usada
vm_ssh
, duplicação das expansões de variáveis e remoção doexit 0
desnecessário no final. - Redirecionamento da saída movida de dentro da função para o loop
for
. Isso pode não ser necessário, ou pode, de fato, ser a coisa errada a se esperar que a primeira chamadassh
na função produza algo, mas torna a função mais limpa.
Após algumas iterações de comentários:
Defina apenas a função SendFiles
uma vez (as definições posteriores dela substituirão as anteriores). Deixe que as informações todas sejam necessárias para qualquer conjunto específico de hosts.
#!/bin/bash
# Location where bash scripts are located.
phy_ssh=/opt/wiki_scripts/servers.sh
vm_ssh=/opt/wiki_scripts/virtualservers.sh
others_ssh=/opt/wiki_scripts/others.sh
# Hosts where we will ssh into.
Phy_Hosts=( vmfarm1 p12 barclay maximus backupfirefly accountant 10.6.6.90 )
Vm_Hosts=( icinga.stacc.ee ldap.stacc.ee mail.stacc.ee openvpn.stacc.ee dns.stacc.ee redmine.stacc.ee owncloud.stacc.ee www.stacc.ee git.stacc.ee )
SomeOther_list ( more machines )
SendFiles () {
local host="$1"
local script="$2"
local remotefile="$3"
ssh "root@$host" 'bash -s' <"$script"
ssh "root@$host" cat "$remotefile"
}
# backup databases
for host in "${Phy_Hosts[@]}"; do
SendFiles "$host" "$phy_ssh" /root/phy_machines.txt
done >/opt/wiki_scripts/phy_machines.txt
for host in "${Vm_Hosts[@]}"; do
SendFiles "$host" "$vm_ssh" /root/vm_machines.txt
done >/opt/wiki_scripts/vm_machines.txt
# and then, for example
for host in "${SomeOther_list[@]}"; do
SendFiles "$host" "$others_ssh" /root/other_machines.txt
done >/opt/wiki_scripts/other_machines.txt