我有三台机器,分别为druidcluster1
, druidcluster2
, druidcluster4
,对应 ip 分别为9.116.2.59
, 9.116.2.70
, 9.116.2.254
。其中第一台装了 pssh,拿来当控制机(不知道这个术语准确不- -)。
ssh 互信全都见好了,包括机器和自身的互信:
[root@druidcluster1 generalsoftware]# ssh druidcluster1 date
Sun May 12 02:02:49 CDT 2019
[root@druidcluster1 generalsoftware]# ssh druidcluster2 date
Sun May 12 02:02:55 CDT 2019
[root@druidcluster1 generalsoftware]# ssh druidcluster4 date
Sun May 12 02:03:01 CDT 2019
[root@druidcluster2 .ssh]# ssh druidcluster2 date
Sun May 12 02:02:19 CDT 2019
[root@druidcluster2 .ssh]# ssh druidcluster1 date
Sun May 12 02:02:25 CDT 2019
[root@druidcluster2 .ssh]# ssh druidcluster4 date
Sun May 12 02:02:31 CDT 2019
[root@druidcluster4 .ssh]# ssh druidcluster4 date
Sun May 12 02:02:01 CDT 2019
[root@druidcluster4 .ssh]# ssh druidcluster1 date
Sun May 12 02:02:08 CDT 2019
[root@druidcluster4 .ssh]# ssh druidcluster2 date
Sun May 12 02:02:14 CDT 2019
新建一个记录需要并行执行命令的 host 文件的列表hostpssh
,内容如下:
[email protected]
[email protected]
[email protected]
在控制机(也就是druidcluster1
)上执行pssh -h hostpssh -P date
,期待的结果是三个全成功返回日期的,实际是控制机失败,其他成功。
[root@druidcluster1 generalsoftware]# pssh -h hostpssh -P date
[1] 01:33:34 [FAILURE] [email protected] Exited with error code 255
9.116.2.254: Sun May 12 01:33:37 CDT 2019
[2] 01:33:37 [SUCCESS] [email protected]
9.116.2.70: Sun May 12 01:33:37 CDT 2019
[3] 01:33:37 [SUCCESS] [email protected]
所以,是我理解的不对吗?pssh 反而不能在控制机上执行命令?
又仔细看了看,算是彻底弄明白了原因。这边的机器有两套IP,一套对内一套对外。开始使用hostname建立互信的时候,对于控制机本身,在known_hosts文件里添加的是对内的那个IP。
在下图中可以看到,最开始使用druidcluster1这个hostname去建互信的时候,系统(对本机)默认选用了对内的那个IP地址10.129.203.59(对druidcluster2和druidcluster4还是用9开头的外部IP地址)。最后那个9.116.2.59是我自己(用ssh root@IP的形式)又连了控制机一次以后,添加上了。至此,pssh命令就可以对本机执行了。
[root@druidcluster1 ~]# cat ~/.ssh/known_hosts
druidcluster1,10.129.203.59 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzd密钥后面部分省略
druidcluster2,9.116.2.70 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGRzuV9cxRVOkDESx3fhMj8pXHa4密钥后面部分省略
druidcluster3 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCN7iIherrtnj5b+Ru3zMwicJtjjQc+密钥后面部分省略
druidcluster4,9.116.2.254 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBBa2oNjufGaFk6qcmlkcAI/7pq7Kf密钥后面部分省略
9.116.2.59 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCN7iIherrtnj5b+Ru3zMwicJtjjQc+密钥后面部分省略
1
omph 2019-05-12 17:52:59 +08:00
换个非 root 用户执行试试
|
2
yangg 2019-05-12 18:13:43 +08:00 via iPhone
试试 ansible 指定本机为 local 就行了
|
3
BIAOXYZ OP @omph 试了一下,还是不行。过程如下:
在控制机上新建一个用户 test,并配置好和其他两台机器的互信。 ``` [test@druidcluster1 .ssh]$ ssh test@druidcluster1 date Sun May 12 05:14:02 CDT 2019 [test@druidcluster1 .ssh]$ ssh root@druidcluster1 date Sun May 12 05:14:08 CDT 2019 [test@druidcluster1 .ssh]$ ssh root@druidcluster2 date Sun May 12 05:14:16 CDT 2019 [test@druidcluster1 .ssh]$ ssh root@druidcluster4 date Sun May 12 05:14:22 CDT 2019 ``` 修改 hostpssh 文件如下: ``` [test@druidcluster1 .ssh]$ cat ~/hostpssh [email protected] [email protected] [email protected] ``` 执行命令,依然是控制机不成功,但是被控机器成功。 ``` [test@druidcluster1 .ssh]$ pssh -h ~/hostpssh -P date [1] 05:14:52 [FAILURE] [email protected] Exited with error code 255 9.116.2.70: Sun May 12 05:14:54 CDT 2019 [2] 05:14:54 [SUCCESS] [email protected] 9.116.2.254: Sun May 12 05:14:54 CDT 2019 [3] 05:14:54 [SUCCESS] [email protected] ``` |
4
BIAOXYZ OP @yangg thx,ansible 确实没问题。我就是好奇心起了想着试试 pssh 吧,结果就碰到这个问题了。不过这项目基本已经很久没啥动静了,还是用回 ansible 吧。。。
|
5
xiaket 2019-05-12 18:20:41 +08:00
看下`9.116.2.59`这台机器上的日志? 一般在 /var/log/auth.log.
|
6
BIAOXYZ OP @xiaket 看了下这个位置没有这个日志文件。不过我看到 audit 那个目录下有个 audit.log 文件, 打开看看是一堆日志,正在找看有没有相关的信息。
``` [root@druidcluster1 log]# pwd /var/log [root@druidcluster1 log]# ll total 644 drwxr-xr-x. 2 root root 4096 Apr 1 15:02 anaconda drwx------. 2 root root 4096 Oct 30 2018 audit -rw-------. 1 root root 0 May 12 03:15 boot.log -rw-------. 1 root root 17712 May 12 03:15 boot.log-20190512 -rw-------. 1 root utmp 384 May 11 10:20 btmp drwxr-xr-x. 2 chrony chrony 4096 Apr 12 2018 chrony -rw-------. 1 root root 904 May 12 05:01 cron ``` |
7
BIAOXYZ OP @xiaket
看了一下前面说到的 /var/log/audit/audit.log 。当我再次执行一下 pssh 显示 date 命令,依然是控制机失败,两台被控机成功的结果。不过这个文件末尾多了一些内容,其中有一条是失败的信息: ``` type=USER_LOGIN msg=audit(1557657314.113:2468): pid=939 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op= login acct="(unknown)" exe="/usr/sbin/sshd" hostname=? addr=9.116.2.59 terminal=ssh res=failed' ``` 好像是登陆的问题? |
8
knktc 2019-05-12 18:56:29 +08:00 1
pssh 本身就是在用 python 调用 ssh 命令。
你试试直接 ssh [email protected] ,不用 hostname,看看有什么效果 |
9
BIAOXYZ OP @knktc 尝试直接 ssh [email protected] ,发现竟然提示认证问题(类似首次连接时候的认证)。同意之后,再次执行,发现解决了~所以看是还是互信的问题?但是我之前互信确实建好了啊。感谢~总之是解决了。过程如下:
``` [root@druidcluster1 ~]# ssh [email protected] date The authenticity of host '9.116.2.59 (9.116.2.59)' can't be established. ECDSA key fingerprint is SHA256:V9315377iDHed0ETyHal4dBTUUJ4WopShNjXIW/5giw. ECDSA key fingerprint is MD5:aa:cc:8d:c5:a4:c1:3c:9b:78:f6:75:e2:48:b5:81:e7. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '9.116.2.59' (ECDSA) to the list of known hosts. Sun May 12 07:13:27 CDT 2019 [root@druidcluster1 ~]# [root@druidcluster1 ~]# ssh [email protected] date Sun May 12 07:13:33 CDT 2019 [root@druidcluster1 ~]# [root@druidcluster1 ~]# pssh -h ~/generalsoftware/hostpssh -P date 9.116.2.59: Sun May 12 07:13:45 CDT 2019 [1] 07:13:45 [SUCCESS] [email protected] 9.116.2.254: Sun May 12 07:13:47 CDT 2019 [2] 07:13:47 [SUCCESS] [email protected] 9.116.2.70: Sun May 12 07:13:47 CDT 2019 [3] 07:13:47 [SUCCESS] [email protected] ``` |
10
knktc 2019-05-12 22:52:57 +08:00 via iPhone
因为你配置文件里面写的是 ip,但是在测试的时候用的是 hostname 啊~
|
11
BIAOXYZ OP @knktc 查看了下控制机上的 known_hosts 后,彻底明白了。是因为我用 hostname 建立互信时,对控制机用的内部的 10 开头的 IP,对其他两台被控机,用的是 9 开头的外部 IP。而我的 hostpssh 文件里都是 9 开头的 IP。所以后面在控制机上用 IP 的方式连接控制机一次,写入 known_hosts,就可以了。
|
12
ps1aniuge 2019-05-14 14:07:20 +08:00
pssh 本身就是在用 python 调用 ssh 命令。
让我来谈谈,shell 和 python 组合有几个癌症。shell 本身是面向字符的,shell 调用 py 也不是强类型的。 比如 date,返回的是字符串,无法进行日期计算。 比如没有布尔型变量。计算是否,if 判断困难。 问:那么说,纯 py 就强了么? 答:的确很强。但用起来很不方便。而且经过 ssh 传递的还是字符串。或者说 py 中,远程传递强类型对象看,需要手动序列化,反序列化。 那么,linux 下最强的还是 powershell。请看优势: 1 本地管道之间,能传递对象。shell 不行,而 py 由于不是命令行,没有传统的 shell 管道。或管道用起来很麻烦。 如: 'a' | foreach-object { $_.toupper()} 2 远程能传递对象。不需要手动序列化,反序列化。 3 使用起来和 shell 语法类似。 4 没有 shell 的坑,没有 py 的坑。 运维这一块。 linux 下最强的 shell 脚本语言,还是 powershell。 linux 下最强的 shell 脚本语言,还是 powershell。 linux 下最强的 shell 脚本语言,还是 powershell。 今日格言: win+bat 界,linux+bash 界,对待 powershell 的态度,就是脚本运维人进步的尺度。 powershell 交+流+群 专门教学 linux 版 powershell,个人免费,公司收费。 |