V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mhycy
V2EX  ›  问与答

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

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

    曾经 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 也合乎情理。但是从大环境看,要解决的问题很多,也不存在只能用 nodejs 才能解决痛点。
    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   ·   实用小工具   ·   1468 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:29 · PVG 01:29 · LAX 09:29 · JFK 12:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.