我正在尝试从属性文件(ansible hosts文件)中使用shell脚本从hosts文件的特定部分获取值。
所以我有一个主机文件:

[windows]
myd-vm14945.company.net
myd-vm01431.company.net

[windows-web]
vmpweb314.company.net

[linux]
myd-vm11409.company.net
myd-vm14296.company.net
myd-vm20125.company.net
mydvm0091.company.net

当Linux部分下的每个服务器都应该替换shell脚本中的参数${REMOTE_server}时,我要运行这个脚本:
#add remote server to ansible host known_host file
ssh-keyscan ${REMOTE_SERVER}>> /root/.ssh/known_hosts
#remmber password
sshpass -p ROOT_PASSWORD ssh root@${REMOTE_SERVER}

最终的结果是这样的:
#add remote server to ansible host known_host file
ssh-keyscan myd-vm11409.company.net >> /root/.ssh/known_hosts
ssh-keyscan myd-vm14296.company.net>> /root/.ssh/known_hosts
#remmber password
sshpass -p ROOT_PASSWORD ssh root@myd-vm11409.company.net
sshpass -p ROOT_PASSWORD ssh root@myd-vm14296.company.net

等等……Linux下的所有值。

最佳答案

如果您真的想从bash中完成,请参阅下面的awk魔术,部分摘自Read certain key from certain section of ini file (sed/awk ?)
因此,您可以创建以下脚本,调整您的库存文件和部分,并运行它!
添加键.sh

#!/bin/bash
INVENTORY="inventory.ini"
SECTION="[linux]"

I_HOSTS="$(awk -v section="$SECTION" ' # Enable a flag when the line is like your section
$0==section{ f=1; next }               # For any lines with [ disable the flag
/\[/{ f=0; next }                      # If flag is set - print the line
f && $0' "$INVENTORY")"

for I_HOST in $I_HOSTS
do
    #add remote server to ansible host known_host file
    echo "ssh-keyscan "$I_HOST" >> /root/.ssh/known_hosts"
    #remmber password
    echo "sshpass -p ROOT_PASSWORD ssh "root@$I_HOST""
done

带有回音sshpass和keyscan命令的结果:
ssh-keyscan myd-vm11409.company.net >> /root/.ssh/known_hosts
sshpass -p ROOT_PASSWORD ssh root@myd-vm11409.company.net
ssh-keyscan myd-vm14296.company.net >> /root/.ssh/known_hosts
sshpass -p ROOT_PASSWORD ssh root@myd-vm14296.company.net
ssh-keyscan myd-vm20125.company.net >> /root/.ssh/known_hosts
sshpass -p ROOT_PASSWORD ssh root@myd-vm20125.company.net
ssh-keyscan mydvm0091.company.net >> /root/.ssh/known_hosts
sshpass -p ROOT_PASSWORD ssh root@mydvm0091.company.net

09-30 13:53
查看更多