请教一个 pssh 的问题: pssh 执行一个命令的时候,能否包括控制机本身

2019-05-12 17:03:21 +08:00
 BIAOXYZ

我有三台机器,分别为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,内容如下:

root@9.116.2.59
root@9.116.2.70
root@9.116.2.254

在控制机(也就是druidcluster1)上执行pssh -h hostpssh -P date,期待的结果是三个全成功返回日期的,实际是控制机失败,其他成功。

[root@druidcluster1 generalsoftware]# pssh -h hostpssh -P date
[1] 01:33:34 [FAILURE] root@9.116.2.59 Exited with error code 255
9.116.2.254: Sun May 12 01:33:37 CDT 2019
[2] 01:33:37 [SUCCESS] root@9.116.2.254
9.116.2.70: Sun May 12 01:33:37 CDT 2019
[3] 01:33:37 [SUCCESS] root@9.116.2.70

所以,是我理解的不对吗?pssh 反而不能在控制机上执行命令?

4380 次点击
所在节点    Linux
12 条回复
omph
2019-05-12 17:52:59 +08:00
换个非 root 用户执行试试
yangg
2019-05-12 18:13:43 +08:00
试试 ansible 指定本机为 local 就行了
BIAOXYZ
2019-05-12 18:17:09 +08:00
@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
test@9.116.2.59
root@9.116.2.70
root@9.116.2.254
```

执行命令,依然是控制机不成功,但是被控机器成功。
```
[test@druidcluster1 .ssh]$ pssh -h ~/hostpssh -P date
[1] 05:14:52 [FAILURE] test@9.116.2.59 Exited with error code 255
9.116.2.70: Sun May 12 05:14:54 CDT 2019
[2] 05:14:54 [SUCCESS] root@9.116.2.70
9.116.2.254: Sun May 12 05:14:54 CDT 2019
[3] 05:14:54 [SUCCESS] root@9.116.2.254
```
BIAOXYZ
2019-05-12 18:18:55 +08:00
@yangg thx,ansible 确实没问题。我就是好奇心起了想着试试 pssh 吧,结果就碰到这个问题了。不过这项目基本已经很久没啥动静了,还是用回 ansible 吧。。。
xiaket
2019-05-12 18:20:41 +08:00
看下`9.116.2.59`这台机器上的日志? 一般在 /var/log/auth.log.
BIAOXYZ
2019-05-12 18:27:57 +08:00
@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
```
BIAOXYZ
2019-05-12 18:38:22 +08:00
@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'
```
好像是登陆的问题?
knktc
2019-05-12 18:56:29 +08:00
pssh 本身就是在用 python 调用 ssh 命令。
你试试直接 ssh root@9.116.2.59 ,不用 hostname,看看有什么效果
BIAOXYZ
2019-05-12 20:16:28 +08:00
@knktc 尝试直接 ssh root@9.116.2.59 ,发现竟然提示认证问题(类似首次连接时候的认证)。同意之后,再次执行,发现解决了~所以看是还是互信的问题?但是我之前互信确实建好了啊。感谢~总之是解决了。过程如下:

```
[root@druidcluster1 ~]# ssh root@9.116.2.59 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 root@9.116.2.59 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] root@9.116.2.59
9.116.2.254: Sun May 12 07:13:47 CDT 2019
[2] 07:13:47 [SUCCESS] root@9.116.2.254
9.116.2.70: Sun May 12 07:13:47 CDT 2019
[3] 07:13:47 [SUCCESS] root@9.116.2.70
```
knktc
2019-05-12 22:52:57 +08:00
因为你配置文件里面写的是 ip,但是在测试的时候用的是 hostname 啊~
BIAOXYZ
2019-05-12 23:01:48 +08:00
@knktc 查看了下控制机上的 known_hosts 后,彻底明白了。是因为我用 hostname 建立互信时,对控制机用的内部的 10 开头的 IP,对其他两台被控机,用的是 9 开头的外部 IP。而我的 hostpssh 文件里都是 9 开头的 IP。所以后面在控制机上用 IP 的方式连接控制机一次,写入 known_hosts,就可以了。
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,个人免费,公司收费。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/563378

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX