Bash能力对于一个运维重要吗?
这个问题本身该不该问?我觉得是有必要的思考的。这关乎团队的能力建设。
对于这个问题的答案,我的答案是看情况。
先说一个现实中真实发生的案例。
多年前,某部门所维护的系统经常出现一些“异常”的流量。部长让架构师对20多台机器上的系统日志进行分析,以确认是否真的有“异常IP”在做坏事。
这下可难倒这位架构师了,三天时间没有搞定这个需求。
最后,过了没有多久,这位架构师就被毕业了。
纵然这位架构师被毕业的原因很多,但是他是真不会做这个事情,也是事实。
在手工运维情况下,使用Bash对日志进行分析,在运维行业里一件很常见的事情,是必备技能。
所以,这位架构师在部长面前就是“没有能力”。
这时,你觉得Shell/Bash的能力重要吗?
再说我做DevOps这几年的感受。
我经历过将手工运维升级至自动化运维的过程。这整个过程,从手工,到使用Ansible自动化部署到虚拟机,再到使用Helm实现自动化部署应用到Kubernetes。
以上的那位架构师遇到问题,在手工运维阶段,我们也遇到过。
而且这个问题,是有一个专门的“熟手”负责。他可以熟练的同时登录上多台服务器,然后在多个窗口中娴熟地敲打命令。因为只有他懂grep哪些关键字能快速找到问题,所以,团队里的成员经常找他grep排查问题。
然而,在我们将日志进行结构化后,所有有权限的人(不论开发还是运维),只要简单的学习一个sql就可以轻松统计分析日志了。
结果就是不仅这位“熟手”的生产力被释放了,团队里其他经常排队等他帮忙的人的生产力也被释放了。
在这样的场景下,Shell/Bash的能力重要吗?
Shell/Bash的能力,除了被应用于日志分析,还有一个很大应用:部署。
比如以下类似的Bash脚本(示例代码是从网上获取的):
group1_deploy(){ # 代码解压部署函数
writelog "group1_code_deploy"
for node in ${GROUP1_LIST};do # 循环生产服务器节点列表
cluster_node_remove $node
echo "group1, cluster_node_remove $node"
ssh ${node} "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz" # 分别到各web服务器节点执行压缩包解压命令
ssh ${node} "rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo" # 整个自动化的核心,创建软连接
done
scp ${CONFIG_DIR}/other/192.168.3.13.server.xml 192.168.3.13:/webroot/web-demo/server.xml # 将差异项目的配置文件scp到此web服务器并以项目结尾
}
当你所在部门还在使用这样的脚本进行自动化部署时,你就必须要有Shell/Bash的能力。但是,当你使用Ansible来实现wordpress的部署,几乎不需要写任何Bash脚本。
因此,团队里,你不需要招Bash高手,你只需要招一个刚毕业没多久的运维或者开发,就可以维护此Ansible脚本。代码如下:
- hosts: all
become: true
# 省略部分代码
tasks:
- name: ==> 0 - add host info
lineinfile: dest=/etc/hosts line="10.0.0.10 {{ hostname }}" state=present
- name: ==> 1 - add PPA of php7 (community)
apt_repository: repo="ppa:ondrej/php"
- name: add Nginx stable repository (deb)
apt_repository: >
repo='deb http://nginx.org/packages/ubuntu/ trusty nginx'
state=present
# 省略部分代码
- name: ==> 4 - install nginx, php-fpm, and php-mysql
apt: name={{ item }} state=present
with_items:
- nginx
- php7.0-fpm
- php7.0-mysql
- name: download wordpress tarball
get_url:
url: "https://tw.wordpress.org/wordpress-{{ wordpress_version }}-zh_TW.tar.gz"
dest: /tmp/
- name: extract wordpress tarball
unarchive:
src: "/tmp/wordpress-{{ wordpress_version }}-zh_TW.tar.gz"
dest: "{{ wordpress_parent_path }}"
owner: "{{ wordpress_owner }}"
group: "{{ wordpress_group }}"
copy: no
# 省略部分代码
- name: copy wordpress site conf for nginx
template:
src: ./templates/nginx-wordpress.conf.j2
dest: /etc/nginx/conf.d/nginx-wordpress.conf
- name: fix listen.owner for php-fpm
lineinfile:
dest: /etc/php/7.0/fpm/pool.d/www.conf
regexp: '^listen.owner\s*=.*$'
line: "listen.owner=nginx"
state: present
- name: restart php-fpm
service: name=php7.0-fpm state=restarted
在这样的场景下,Shell/Bash的能力重要吗?
小结
在手工运维或者基于Bash的运维的场景下,Shell/Bash的能力很重要,他关乎你的饭碗。
在基于声明式的自动化运维场景,Shell/Bash的能力就没有那么重要了。你能看懂Bash脚本就可以了。即使要写,你让GPT给你写个模板出来即可。
当然,即使真要写非声明式的自动化脚本,写Python脚本会不会更好?
Last modified on 2023-10-22