我必须在许多机器上用hello world
在特定的目录下创build一个文件functon.txt
。 这是我到目前为止手动逐一login到每个框中并创build文件。 该目录是由root
拥有的,所以我必须确保新文件也由root
用户拥有。
david@machineA:~$ sudo su [sudo] password for david: root@machineA:/home/david# cd /opt/Potle/ouyt/wert/1 root@machineA:/opt/Potle/ouyt/wert/1# vi functon.txt root@machineA:/opt/Potle/ouyt/wert/1# ssh david@machineB david@machineB:~$ sudo su [sudo] password for david: root@machineB:/home/david# cd /opt/Potle/ouyt/wert/1 root@machineB:/opt/Potle/ouyt/wert/1# vi functon.txt root@machineB:/opt/Potle/ouyt/wert/1# ssh david@machineC .....
现在我必须在200台左右的机器上这样做。 有什么办法可以通过一些脚本来做这些事情吗? 我可以多次input密码,但如果必须的话,我不想手动login到这些盒子,手工完成所有其他步骤。
我有一个文件hosts.txt
,其中包含每台机器逐行。 我可以逐行阅读这个文件,做上面的事情,但我不知道如何?
这只是我一次练习,所以任何简单或简单的方法应该没问题。 我甚至可以在脚本中对我的密码进行硬编码来完成这项工作。 什么是完成这项任务的最好方法?
安装Ansible之后:
ansible -i /path/to/hosts.txt -m ping -u david --ask-pass all
看看你是否可以ping通机器。 如果成功,则用两台机器尝试以下操作(仅用两台机器创建另一个txt文件,并将其传递给-i
选项)。 那么你可以运行这个所有的机器。 如果该目录不存在,则该命令将失败,您将看到总结失败的机器。
ansible -i /path/to/hosts.txt -m copy -a "src=/path/to/functon.txt dest=/opt/Potle/ouyt/wert/1/functon.txt" -u david --ask-pass --become --become-user root --ask-become-pass all
我没有测试这个。 所以请谨慎使用。
-i
:输入主机(s) -m
:模块 -a
:模块参数 -u
:用户 --ask-pass
:询问用户密码 --become-user
:新用户 --ask-become-pass
:请求成为用户密码 您可以使用expect
来自动执行SSH复制/ SSH登录:
#!/usr/bin/expect set password [lindex $argv 1] spawn scp -P 22 [lindex $argv 2] [lindex $argv 0] expect "*password:*" send -- "$password\r" send -- "\r" expect eof
expect
命令将等待你在参数中给出的字符串被接收。
您可以从hosts.txt
遍历主机,并为每个主机运行以下脚本:
./create_config.sh david@machineA:/opt/Potle/ouyt/wert/1/ somePassword functon.txt
如果你没有可能做SSH复制,但只有SSH,你仍然可以发送命令与期望:
#!/usr/bin/expect set password [lindex $argv 1] spawn ssh -p 22 [lindex $argv 0] expect "*password:*" send -- "$password\r" send -- "\r" # expect the command prompt : change this if needed expect "*$*" # execute some commands send -- "echo 'some text to write to some file' > ~/some_file.txt\r" # exit vm send -- "exit\r" expect eof
你可以运行这个:
./create_config.sh david@machineA somePassword
你可以使用sshfs:挂载一台机器,做你想做的,卸载并传递给下一个。