我有一个文件(例如“thisfile.sh”),我想在启动 bash 文件时将其一次性复制到多个服务器(其中一些可能需要密码验证),大概使用 SCP。所有服务器地址都一行一行地写在一个文本文档中,假设该文件名为“ServerList”,例如:
[email protected]
[email protected]
[email protected]
[...]
我怎样才能实现这个目标?
编辑:我对此又想了想,我仍然希望使用 bash 作为启动器来完成此操作,稍后我将使用其他方法。我打算如何使用 SCP 复制命令来完成此操作,并使用变量代替我的目标,如下所示scp myfile $Server:~/myfile。这样,我很确定我需要使用某种循环,这样在我复制时它就会遍历所有行。
答案1
如果你想留在仅限 bash 的域中:
while read server
scp thisfile.sh $server:/some/location
ssh $server /some/location/thisfile.sh
done < servers.txt
这将提示一次执行一项工作,并在需要时要求您进行身份验证
答案2
有几种方法可以实现这一点。您可以使用 ansible 或 fabric 之类的东西来编写一个脚本,该脚本将连接到您的所有计算机并将文件复制到它们并运行该脚本。或者您可以编写一个 bash/shell 脚本来将文件复制到那里,然后运行该脚本。
Fabric 和 Ansible 的学习曲线稍微高一些,但是更有用,并且可以轻松添加更多计算机或更改脚本。
bash 或 shell 脚本会更容易编写,但如果将来需要它,适应起来会稍微困难一些。
http://docs.ansible.com/ansible/intro_getting_started.html -- Ansible
以下是 ansible 和 fabric 的指南
答案3
尽管 Felipe 对于仅限 bash 的解决方案给出了最好的答案,但我认为 Ansible 在这项任务上表现更出色。
您只需将所有服务器放入如下清单文件中:
[default]
firstserver.com ansible_ssh_user=firstuser
secondserver.com ansible_ssh_user=seconduser
thirdserver.com ansible_ssh_user=thirduser
剧本如下:
--- #copyfiles.yml
hosts: all
tasks:
- name: copy file to servers
copy:
src: /path/to/local/file
dest: /path/to/remote/file
然后运行:
ansible-playbook -i /path/to/inventory copyfiles.yml --ask-pass