使用 node.js 作为粘合剂混合 shell 脚本运维 Linux 服务器的可能性 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mhycy
V2EX    问与答

使用 node.js 作为粘合剂混合 shell 脚本运维 Linux 服务器的可能性

  •  
  •   mhycy 2019-08-22 20:16:33 +08:00 3793 次点击
    这是一个创建于 2271 天前的主题,其中的信息可能已经有所发展或是发生改变。

    曾经 python 是 shell 脚本之外运维服务器的首选语言
    现在 node 有着更容易运维的运行时环境,更方便的包管理模式
    是否意味着 node 能替代 python 作为运维脚本的选择之一呢?

    25 条回复    2023-09-22 13:45:41 +08:00
    panda1001
        1
    panda1001  
       2019-08-22 20:21:51 +08:00 via Android
    预装环境 shell>python>node
    singerll
        2
    singerll  
       2019-08-22 20:22:47 +08:00 via Android   1
    1、每个机器自带 python。2、不是写个脚本就叫自动化运维
    mhycy
        3
    mhycy  
    OP
       2019-08-22 20:40:09 +08:00
    @panda1001
    @singerll

    特地装个 node 进去也没什么吧?
    毕竟一般来说 python 3.x 也是需要手动装上去的
    Python 还有 2.x、3.x 不兼容以及 2.x cli 输出时候的一些坑....
    感觉这不成理由...

    话说...我有提到自动化运维这事么?
    ETiV
        4
    ETiV  
       2019-08-22 20:56:01 +08:00
    我能用 shell 的都用了 bash …

    我用 nodejs 的时候遇到过一类问题,child_process.spawn 的 on-exit 和 stdout/stderr.on-data 的调用次序并不能保证

    发生过子进程 exit 了,但是收到的 stdout 的内容不完整,导致没法解析子进程的输出内容

    所以跟 nodejs 比,Python 的优势还是在的…(但是我并不会 Python )
    airyland
        5
    airyland  
       2019-08-22 20:56:34 +08:00
    我一直是这样用的,主要原因是 node 写起来更方便。
    k9982874
        6
    k9982874  
       2019-08-22 21:02:34 +08:00 via iPad
    我选择 python
    singerll
        7
    singerll  
       2019-08-22 21:07:59 +08:00 via Android
    @mhycy 你最后一句不是要替代 Python 吗。Python 就是干这个的。而且还有各种成熟的自动化软件也是依赖 python。。
    mhycy
        8
    mhycy  
    OP
       2019-08-22 21:43:22 +08:00
    @singerll 说的是运维脚本...不是说自动化运维...别搞混
    mhycy
        9
    mhycy  
    OP
       2019-08-22 21:48:06 +08:00
    @ETiV
    这个问题不知道封装一层 Promise 能否规避, 感觉是个异步问题...
    singerll
        10
    singerll  
       2019-08-22 21:56:43 +08:00 via Android
    @mhycy 只是脚本的话 shell 就足够了,python 都很少用
    cubecube
        11
    cubecube  
       2019-08-22 22:09:19 +08:00 via Android
    在公司内部,推动所有环境的服务器都部署一个特定的软件,需要很大的能量才能完成。开发视角和运维视角很不同的
    Symo
        12
    Symo  
       2019-08-22 22:12:00 +08:00
    主要还是生态 python 已经做得足够好了. shell 其实还是有些跨发行版不一致的情况.
    jaskle
        13
    jaskle  
       2019-08-22 22:14:07 +08:00 via Android
    哪个简单用哪个
    panda1001
        14
    panda1001  
       2019-08-22 22:23:28 +08:00 via Android
    @mhycy 并不是特指自动化运维,选 shell 和 python2.6 是有预装环境的优势,如果考虑配环境的话,我觉得 go 比 node 还更有优势
    hcymk2
        15
    hcymk2  
       2019-08-22 22:26:06 +08:00 via Android
    怎么不选 ruby 呢
    coolair
        16
    coolair  
       2019-08-22 22:40:34 +08:00 via Android
    装个 node 都觉得恶心
    echo1937
        17
    echo1937  
       2019-08-22 23:02:04 +08:00   1
    @mhycy #3

    脚本这块,现在有三种方向:
    1. 传统型,基本上都是 shell > python > 其他,
    2. 类似 ansible 之类的 playbook ;
    3. docker/k8s,

    Python 的版本问题,已经度过了最困难的时候,
    Py2 现在已经接近 EOS,连最老旧的 RHEL/CentOS 在 8 版本都默认 Py3 了,

    影响脚本语言流行度很重要的两个问题是:
    1. 要比前辈足够优秀,比如 python 之于 bash,它增强了非常多,但是 node 之于 python 并没有那么大优势;
    2. 流行度,在目前的服务器领域,真的很少有运维去学 node,因为真的不太用得到;
    Osk
        18
    Osk  
       2019-08-22 23:02:31 +08:00   2
    我来歪个楼,powershell

    主要是管道传递的是对象真的太方便了,虽然我没仔细学过 powershell,但我自己靠 Google 写过几个脚本,真的太爽了。
    shell 里面|传递文本,后面的命令得考虑下前一个命令的输出格式,python/js 里面怕是没有|,虽然可以获得返回的列表 /对象也挺好的但感觉没管道爽。

    举个例子:
    powershell 里面显示网卡的 ip,筛选条件是公司局域网地址

    ```ps1
    >>> Get-NetIPAddress |? {$_.IPAddress -like "10.*"}| ft -Property IPAddress,InterfaceAlias

    IPAddress InterfaceAlias
    --------- --------------
    10.1.1.28 Wi-Fi
    ```

    看起来 powershell 的命令又臭又长, 但是,全程 tab 补全,我根本没记忆过参数和 cmdlet 的全称,最牛的是|后面的 cmdlet 居然能补全前一个命令的输出!!!!



    希望 ms 加把力,以后 linux 上也能有完善的 powershell 也是不错的


    不知道各位怎么看 powershell,我觉得也是挺优秀的,准备学习下
    Osk
        19
    Osk  
       2019-08-22 23:03:43 +08:00   1
    顺便 node_modules 真的是噩梦,太多小文件了,崩溃
    tomczhen
        20
    tomczhen  
       2019-08-22 23:29:02 +08:00 via Android   1
    可以,自己用的话没所谓,PHP,Ruby 也一样可以。

    但是 Python 的优势很大,首先发行版自带解释器,其次 Python 标准库功能很多,最后一些需要编译的库大多数发行版都有二进制分发,通过包管理器即可安装。

    如果使用环境默认就有 nodejs,人员也足够熟悉,那么用 nodejs 也合乎情理。但是从大环境看,要解决的问题很多,也不存在只能用 nodjs 才能解决痛点。
    mhycy
        21
    mhycy  
    OP
       2019-08-23 10:22:13 +08:00
    @panda1001
    @echo1937
    @tomczhen

    感谢三位的详细回复。
    我突然冒出这个想法其实是因为最近用 node 写了个用于对接 routeros api 的包
    完事了之后在想如果是 python 我会怎么弄...

    于是就冒出了这么个问题...

    感受上,node 的包管理器相比于 PyPI 来说有着更丰富的私有库方案可供选择
    而命名上的私有域概念也能很好的把私有代码与公有库隔离开来,模块化上比 python 好处理
    从这点上说我是觉得用 node 来替代 python 做粘合剂没什么不妥的情况
    PS. node_modules 小文件噩梦,但版本隔离也是个优点,现在磁盘不值钱

    另:感觉跟 shell 扯上关系的脚本语法上都不怎么友好。。。
    msg7086
        22
    msg7086  
       2019-08-23 11:54:47 +08:00
    说得挺有道理的,所以我用 Ruby 做运维……
    julyclyde
        23
    julyclyde  
       2019-08-23 15:16:35 +08:00
    我只想说“你们 js 界”请不要拿着锤子看啥都像钉子
    artandlol
        24
    artandlol  
       2019-08-23 16:46:07 +08:00 via Android
    挺有道理的,所以我用 golang
    c1462066778
        25
    c1462066778  
       2023-09-22 13:45:41 +08:00
    实在受不了 Python 的自动补全,就是一坨 x 。node 至少还能写 ts 增强一下补全功能。Python 的那个类型,有几个人写,又有几个第三方库大量在用。感觉 py 太动态了。但是用 ansible 的时候还是避免不了用 Python ,做数据分析的时候也避免不了 pandas numpy ,深度学习的时候也避免不了 pytorch ,最烦的就是要在运行的时候打 type()才知道类型,写的太累了。list map filter 也不太受得了,为啥不做成类上面的方法。js 还好可以用 Promise 勉强做成链式调用,或者等新规范完善之后可以直接用|>来链式调用,也有想能不能 java 来做,java 还是太束缚手脚了,小脚本里面不太适合
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3209 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 11:38 PVG 19:38 LAX 03:38 JFK 06:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86