「Linux」- 以其他用户的身份运行命令
问题描述
在 Linux 中,有时候我们需要以其他用户身份来运行命令,而不是当前登录用于。像 Nginx 或者其他某些应用程序,可以指定在运行时所属的用户和组,但是有些程序则不支持指定用户和组(因为它们自身不支持)。
本笔记将介绍以其他用户身份来运行特定命令的方法。
解决方案
方法一、使用 systemd 的单元文件
在.service文件中,使用User=和Group=来指定运行命令的用户的组。如下示例:
[Unit]
Description=xxxxxxx
[Service]
User=www-data
Group=www-data
ExecStart=xxxxxxx
方法二、使用 sudo(8) 命令
可以用 sudo(8) 命令,它的作用本来就是“excute a command as another user”,默认为root用户,可以用-u指定所要使用的用户名。
sudo(8)以另一个用户身份执行命令,但遵循一组规则,这些规则决定了哪些用户可以作为哪些其他用户来执行哪些命令。在/etc/sudo(8)ers文件中进行配置。与su(1)不同的是对用户进行身份验证时,sudo(8)使用调用sudo(8)命令的用户的密码,而不是目标用户的密码。 sudo(8)允许系统管理员授权某些用户(或用户组)以root用户或其他用户身份来运行命令的能力,同时提供命令及其参数的审计跟踪。这允许将特定命令委派给特定主机上的特定用户,而无需在其中共享密码。
假设要以user身份执行prog程序:
#!/bin/sh
sudo -u user prog
方法三、使用 su(1) 命令
还可以使用 su(1) 命令。使用su(1)命令切换到另一个身份,运行Shell,再用新的Shell运行指定程序。命令su(1)只能运行Shell程序,虽然可以把命令写成类似于sudo(8)的样子(比如,su -c user prog),但它的实现原理实际上还是先运行一个Shell,再通过Shell运行其他程序。
假设要以user身份执行prog程序,有两种方法:
先切换到user用户,然后执行prog程序:
#!/bin/bash
su – user
prog arg0 arg1 …
使用命令su(1)的-c选项指定要执行的命令:
#!/bin/bash
su -user -c “prog arg0 arg1 …”
这两者方法只是形式上的不同,本质上还是相同的。不管使用哪一个,它都会提示你输入用户的密码。
因此,如果要在Shell脚本中使用su命令:
#!/bin/bash[……]
「Linux」- 找到用户的创建时间
问题描述
在某些场景下,我们需要知道用户的创建时间。
比如 Jumpserver 推送用户到系统,我们想知道该用户是何时推送到系统的。
该笔记将记录:在系统中,如何确定用户的创建时间。
解决方法
方法有很,但都不是常规方法。
如果用户没有修改密码,可以使用如下方法(只能查看时间):
# passwd -S test
test P 12/03/2020 0 99999 7 -1
# chage -l k4nz
Last password change : Mar 16, 2020
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
通过系统日志获取:
// CentOS
# cat /var/log/secure | grep -i “<your username>”
// Ubuntu 18.04.4 LTS
# cat /var/log/auth.log | grep -E ‘useradd.+test’
Dec 3 09:33:10 localhost useradd[13160]: new group: name=test, GID=1002
Dec 3 09:33:10 localhost useradd[13160]: new user: name=test, UID=1002, GID=1002, home=/home/test, shell=/bin/bash
创建用户的最佳实践
在创建用户时,建议使用 –comment 选项添加注释,并补充相关的信息。
参考文献
HowTo Find Linux User Created Date Is There Any Way – ARKIT[……]
「Linux」- 强制用户下线
内容简介
本文将介绍如何显示已登录系统的用户,以及如何强制已登录用户下线。
问题描述
之前有些开发拿到ROOT帐号。现在,要回收ROOT帐号,修改密码,并强制已登录用户下线。如果不强制下线,他们还可以使用ROOT用户继续操作。
解决办法
找到用户登录进程,然后结束这些进程即可。
#1 查看已登录用户
查看当前用户
#!/bin/sh
################################################################################
# 显示当前登录的用户的用户名
################################################################################
whoami # 没有其他选项
################################################################################
# 显示当前登录的用户的用户名
################################################################################
id -un
上述命令是等价的,都显示了当前登录的用户。
查询已登录用户
#!/bin/sh
################################################################################
# 显示系统中登录的用户,及正在执行的动作
################################################################################
w
################################################################################
# 显示当前登录的用户
################################################################################
who
################################################################################
# 显示当前登录用户(特殊一些)
# 没有其他的选项,功能单一。如果用户具有多个进程,则显示多次用户名。
####################################################################[……]
「CentOS」- 重置 ROOT 密码
问题描述
未做文档,交接疏忽……总之会出现各种需要重置密码的场景…………本文将介绍如何重置ROOT密码。
该笔记将记录:在 Linux 中,如何重置密码,以及相关问题的解决办法。
解决方案
本文只进行简单记录,不深入操作细节。
Ubuntu 20.04 LTS
How to Reset Forgotten Root Password in Ubuntu grub2 – How to get to the GRUB menu at boot-time? – Ask Ubuntu
1)当进入 GURB 菜单时,按 [e] 编辑启动项; 2)编辑 linux /boot/… 行尾,类似 ro quiet splash 内容; 3)修改为 rw init=/bin/bash 并 [F10] 以继续启动; 4)进入系统,passwd,修改密码; 5)最后,exec /sbin/init,启动系统;
Q:某些系统,/etc/default/grub: GRUB_HIDDEN_TIMEOUT=0,导致无法显示 GRUB 菜单 A:当开机时:基于 BIOS 系统,按 [Shift] 键;基于 UEFI 系统,按 [Esc] 键;
CentOS 7
How To Reset Root Password On CentOS 7
GRUB => 编辑对应启动菜单项 => 找到 linux16 行 => 将 ro 替换为 rw init=/sysroot/bin/sh 配置 => 启动,进入单用户模式
chroot /sysroot
passwd root
touch /.autorelabel (如果系统加载SELinux模块)
exit
reboot[……]
「PAM」- Pluggable Authentication Modules
可插拔认证模块,将低层认证方案集成到高层接口中,为操作系统的应用及服务提供认证支持,而需要关注低层认证方案。简单地说,如果你的应用程序想要使用系统帐号登录,不需要自己解析 passwd 和 shadow 文件,使用 PAM 模块即可。
Linux Pluggable Authentication Modules
从 Unix Pluggable Authentication Modules 架构中演变而来。它将身份验证任务分为四个独立的管理组:
(1)Account Module,帐户模块:检查帐号是否为有效认证对象。帐号可能存在过期、密码失效等等问题。
(2)Authentication Module,认证模块:由于验证密码或其他密钥。该模块也肯能将认证信息传递给其他系统,比如 keyring 服务。
(3)Password Module,密码模块:负责更新密码,通常耦合到认证步骤中使用。也被用于强制使用强密码。
(4)Session Module,会话模块:定义会话在开始与结束时执行的动作。会话开始与用户成功认证后。
该四个模块与 pam.conf(5) 手册所属的 type 属性对应。
注意事项
1)调整 PAM 会改变系统的安全性。 2)错误的配置将导致系统部分功能无法访问,或者全部无法访问。请做好回滚准备,比如备份原文件。 3)无需过多关心 PAM 内部细节,要更多关注配置文件如何定义应用与PAM之间执行认证任务的连接。
配置实例(谨慎参考)
错误配置可能导致系统认证不可用,请谨慎参考本部分内容,这只在我们自身环境中测试通过。请参考官方文档或手册获取准确内容。
检查应用程序是否使用 PAM 认证
我们希望使用 su root 命令时无需输入密码,则先检查 su 是否集成 PAM 认证:
# ldd $(which su) | grep libpam.so
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007ff1da47c000)
从输出中可以看出 su 命令使用 PAM 库,所以我们可以说 su 支持 PAM 认证。
配置文件的语法格式
第一步,阅读 How to Configure and Use PAM in Linux 文章,有个初步认识。 第二步,在 Debian 中,请参考 man 5 pam.d 或 man 5 pam.conf 手册。
参考文献
Wikipedia/Linux PAM Wikipedia/Pluggable authentication module What is PAM[……]
「su」- substitute user
在切换用户时无需输入密码
Allow user1 to “su – user2” without password
问题描述
当前为 k4nz 用户,当切换到 root 用户时,我们希望无需输入密码。
解决办法
由于 su 支持 PAM 认证,因此我们可以通过调整 /etc/pam.d/su 来实现“当用户 k4nz 切换到 root 用户时无需输入密码”,用 PAM 的话来说(配置文件)就是:
auth [success=ignore default=1] pam_succeed_if.so use_uid user = k4nz
auth sufficient pam_succeed_if.so user = root
也可以使用如下配置行(两者是等价的,但不知晓是否存在安全隐患)
auth [success=ignore default=1] pam_succeed_if.so user = root
auth sufficient pam_succeed_if.so user = k4nz
注意配置文件要家到 /etc/pam.d/su 的开始部分,因为配置行是以栈的形式存在(这是我们的理解)
附加说明
要理解配置行的含义,需要理解 PAM 配置文件。[……]
「sudo」- superuser do
配置文件语法
关于配置文件(/etc/sudoers)的语法:第一步、阅读 Understanding sudoers(5) syntax 文章;第二步、阅读 man 5 sudoers 或者 Sudoers Manual 手册。理解配置文件语法的关键在于理解在文档中表述的 EBNF 语法。
# 03/23/2020 那个 EBNF 语法确实让人头疼,但是静心看下去还不算复杂,就是内容较多而已。
常用配置
无密码运行 sudo 命令
这里指定用户 k4nz 可以在运行命令时无需输入密码:
#!/bin/sh
cat > /etc/sudoers.d/k4nz <<EOF
k4nz ALL = (ALL:ALL) NOPASSWD: ALL
EOF
在输入密码时,显示星号(模式 macOS 样式)
How to Make Password Asterisks Visible in the Terminal Window in Linux Ubuntu Tips – Display Asterisks When Typing Your Password in Terminal
在 Linux 中,终端输入密码是没有用户反馈的,等同于盲按(在感觉自己输入正确时,按下回车键即可)。在 macOS 中,终端输入密码则以星号显示。虽然对高手来说这完全没有必要,但是这种用户体验还是很好的。我们希望在 Linux 中也可以有这种用户反馈,本笔记将介绍如何实现(配置)。
第一步、执行 visudo 命令,进入编辑页面;第二步、在编辑页面加入:Defaults pwfeedback;第三步、保存退出并测试;
常见错误汇总
#1 sudo: unable to resolve host xxxxx
Error message “sudo: unable to resolve host (none)”
问题描述: 在执行 sudo 命令时,控制台提示错误:
sudo: unable to resolve host (none)
问题原因: 没找具体原因,就是简单的搜索了一下。
解决办法: 修改 /etc/hostname 和 /etc/hosts 文件,确保主机名和解析是正确的。
参考文献
Wikipedia/sudo[……]
「macOS」- 我们的使用经验
问题描述
我们曾经是 macOS 用户,但现在的工作还需要继续接触 macOS 系统(主要是提供相关的技术支持及答疑);
例如:编写与 macOS 相关的打印机连接文档;寻找其能在 macOS 中运行的某些客户端或替代品;
该笔记将记录:在 macOS 中,与其相关常见的使用经验、运维管理、技术支持,以常见问题的解决办法;[……]
「macOS」- 应用程序运行
在 ARM 中,运行 x86 程序
知乎 / M1 是怎么兼容 x86 的?MacBook 是否会有软件兼容性问题
M1 不能识别 x86 的指令,那是不是可以把 x86 的复杂指令,先翻译成 ARM 的精简指令呢?
于是乎,苹果就开发了一个叫做 Rosetta 2 的转译机制,对于针对 x86 指令集编译的代码,在映像执行路径中就会被内核识别,内核则会把控制权交给 Rosetta 转译存根。此后转译存根会在映像执行期间转译,这个模式下转译和执行可以理解为是同时执行的。这种也被称作即时转译,Just In Time(JIT);
苹果系统之家 / 在 Apple Silicon M1/M2 Mac 电脑上安装 Rosetta 2 运行 intel 应用[……]
「macOS」- 包管理器
Homebrew
Homebrew
Fink
Homepage: http://www.finkproject.org
Fink is akin to (and iirc based on) the Debian/Ubunutu apt system: it delivers pre-compiled binaries.
MacPorts
Homepage: https://www.macports.org
MacPorts is related to the older BSD Ports collections: rather than pre-built binaries, it containers pointers to the original source + patches required to make that source work on your platform (and with the other apps that you’ve installed via ports).[……]
「Homebrew」- 适用于 macOS 的包管理器
问题描述
用于 macOS 或 Linux 的包管理器,而我们更多用于 macOS 系统的应用包管理。
也可以在 LFS 中使用 Homebrew 工具。LFS 是个 Linux 项目,教我们如何使用源码包一步步编译出可运行的 Linux 系统。但是,在 LFS 中没有可用的包管理器,所有的应用只能编译安装。编译安装是件非常痛苦的是事情,而有了 Homebrew,可以简化 LFS 的包管理工作。当然,LFS 不是这篇笔记要介绍的内容,我们的重点还是放在 Homebrew 的使用,我们只是突然想到可以在 LFS 中使用 Homebrew 工具。
该部分笔记将整理:与 Homebrew 有关的内容,以及常见问题处理。
解决方案
第一步、安装 brew 命令
安装方法建议参考官方主页(brew.sh),我们不能保证与官方站点同步:
/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)”
国内访问 raw.githubusercontent.com 经常失败,参考 CunKai/HomebrewCN 项目。如果有条件,还是使用网络加速服务比较好。
第二步、安装软件服务
与其他包管理器的使用方法类似(首先 search 应用,然后 install 应用):
# 搜索 MySQL 服务
brew search mysql
# 安装 MySQL 服务
brew install mysql
# 安装特定版本的 MySQL 服务
brew install mysql@5.7
在安装应用时,由于网络原因,可能考虑需要使用网络加速服务。如下是 SOCKS5 示例:
# 使用 socks5 代理
ALL_PROXY=”socks5://127.0.0.1:1080″ brew install “<pkg-name>”
第三步、启动服务(并设置开机启动)
在 Homebrew 中,内置服务管理工具(这使我们无需了解 launchctl 的使用方法):
# 服务管理工具
brew tap homebrew/services
# 启动服务
brew services start mysql@5.7
# 查看服务
brew services list
# 重启服务
brew services restart mysql@5.7
设置服务开机启动: 1)以命令 brew services start mysql@5.7 启动,则在每次用户登录时,服务将自动启动; 2)以[……]
「Homebrew」- Error: Failed to upgrade Homebrew Portable Ruby!
问题描述
当执行 brew 命令时,产生如下错误:
# brew doctor
==> Downloading https://homebrew.bintray.com/bottles-portable-ruby/portable-ruby-2.6.3_2.yosemite.bottle.tar.gz
Already downloaded: /Users/pengfeiwang/Library/Caches/Homebrew/portable-ruby-2.6.3_2.yosemite.bottle.tar.gz
==> Pouring portable-ruby-2.6.3_2.yosemite.bottle.tar.gz
portable-ruby/2.6.3_2/: Can’t create ‘portable-ruby/2.6.3_2’
portable-ruby/2.6.3_2/.brew/: Failed to create dir ‘portable-ruby/2.6.3_2’
….
portable-ruby/2.6.3_2/bin/rdoc: Failed to create dir ‘portable-ruby/2.6.3_2’
portable-ruby/2.6.3_2/bin/ri: Failed to create dir ‘portable-ruby/2.6.3_2’
portable-ruby/2.6.3_2/bin/ruby: Failed to create dir ‘portable-ruby/2.6.3_2’
portable-ruby/2.6.3_2/.brew/portable-ruby.rb: Failed to create dir ‘portable-ruby/2.6.3_2’
tar: Error exit delayed from previous errors.
Error: Failed to install ruby 2.6.3_2!
Error: Failed to upgrade Homebrew Portable Ruby!
该笔记将记录:如何解决该问题,以及注意事项。
问题原因
在 Google 后,我们发现导致该问题的原因有很多,但是究其根本,正如错误信息的提示:Failed to create dir ‘portable-ruby/2.6.3_2’。因此,我们尝试查找 portable-ruby/2.6.3_2 无法写入的原因。
Homebrew 的安装目录为 /usr/local/Homebrew ,而 portable-ruby/ 在 /usr/local/Homebrew/Library/Homebrew/vend[……]
「LINUX MANUAL PAGES」- 命令手册
为什么要创建这部分笔记
创建命令的完整中文手册
首先,感谢要各位博主能够在互联网上传播与分享在 Linux 中的命令及使用方法,对大家做出的努力表示钦佩与感谢。但有的时候因为精力有限或者一些其他的原因导致这些文章并无法覆盖命令所有的功能,有的时候往往只有几个常用选项的介绍。
我们的目标是为大家提供命令的完整说明,这包括:完整介绍、选项含义、使用方法,并以通俗易懂的方式来解释命令。
使用命令来简化日常工作
在工作中,我们进程要处理一些问题。比如: 1)生成一些“格式化”的文本。这些文本很显然都带有了一定的格式,做为一个懂得编程的人,如果你还在手写、复制粘贴,而不是用一小段程序自动生成,那就…emmmmmm…。 2)使用SQL查询数据,一条SQL语句,即使使用了子查询有时也无法获得目标数据,还有的时候要使用一份查询结果数据生成两种不同的数据报表。 3)对于某些日志的过滤,数据库数据的筛选。 4)…
还有很多类似的“零散问题”,我们不是说编程语言解决不了这些问题,我们只是在说,有时候使用Shell命令直接处理这些问题可能会更方便。打开一个终端,输入指令,回车运行,得到输出,或者直接重定向到文件。想想编程语言中的文件代开,命令行参数读取,图片处理,文本处理,…。Shell中还可以直接使用其他编程语言的运行工具,不是其他语言不能,只是Shell更方便。(不想写了)。总之,Shell对日常的这种“零散操作”非常有用。
我们不是在安利你Shell。学习有时候需要根据自己的需要、兴趣、工作重心,这个需要你自己把握。而我们这是深刻体会到了掌握这种技能在我们的工作环境中的便捷。
通过命令来创建知识体系
与其他行业类似,我们这个行业也是博大精深,知识众多,规范众多,还有各种实践经验,散落在世界各处,隐藏在网络的各种角落。并不是每个概念术语都有与之对应的书籍来进行完整的诠释。
命令是工具,用来操纵系统的工具,它能操纵系统的方方面面。通过这工具,我们也可以了解到系统的方方面面,了解到在系统中的各种概念。在翻译手册的过程中,我们学到非常多的知识,了解到某些东西是怎么出现的,了解到哪些东西是历史遗留。
我们的 RHCE 经历(07/16/2018)
因为准备转运维了,改行穷三年。熟悉这些命令能给工作带来多少方便我们就不说了。这些也是基本,但不时所有的命令都必须掌握,只是说技多不压身。你若你还是初级阶段,也不建议看所有的命令,应该先把常用的学会了。
其他的原因
市面上的书太多了,但也正是由于是“书籍”的原因,它的存在着篇幅、更新、付费、查阅、及时勘误、交流等诸多方面的限制。虽然如此,我们还是喜欢纸质的书籍。但使用Web站点终究是一个处理“技术文档的查阅参考手册”更好的方案。
我们[……]
「C」- 学习笔记
语言起源
1972年,贝尔实验室的丹尼斯·里奇(Dennis Ritch)和肯·汤普逊(Ken Thompson)在开发UNIX操作系统时设计了C语言。然而,C语言不完全是里奇突发奇想而来,他是在B语言(汤普逊发明)的基础上进行设计。至于B语言的起源,那是另一个故事。C语言设计的初衷是将其作为程序员使用的一种编程工具,因此,其主要目标是成为有用的语言。
虽然绝大多数语言都以实用为目标,但是通常也会考虑其他方面。例如,Pascal的主要目标是为更好地学习编程原理提供扎实的基础:而BASIC的主要目标是开发出类似英文的语言,让不熟悉计算机的学生轻松学习编程,这些目标周然很重要,但是随着计算机的讯猛发展,它们已经不是主流语言,然而,最初为程序员设计开发的C语言,现在已成为首选的编程语言之一。
特性特征
设计特性、高效、可移植性、强大、灵活、面向程序员;
缺点:简洁紧凑,运算符较多,导致容易写出费解的代码;指针往往容易带来不易察觉的错误;
应用范围
操作系统、嵌入式、计算机语言[……]
「DevOps, CI, CD」- 提高效率;保证质量;降低成本;
Continuous Integration Continuous Delivery Continuous Deployment Continuous Upgrade —— 我们早晚都会出先这个词语(04/17/2022),持续交付并不是结束,而是客户持续部署(持续升级、不断升级)的开始,交付太频繁客户也会反感,要求我们能保证无感升级)
持续集成平台/持续交付平台
Jenkins, Build great things at any scale
Travis CI – Test and Deploy with Confidence
Open Source Continuous Delivery and Release Automation Server | GoCD GoCD概念篇
代码审查与代码分析
Gerrit Code Review Code Quality and Security | SonarQube
TODO 使用 Redmine 进行代码统计 https://www.redmine.org/projects/redmine/wiki/RedmineRepositoryStatistics
软件测试(Software Testing)
Wikipedia/Software testing
图形界面的测试工具(GUI testing tools)
Comparison of GUI testing tools – Wikipedia
GitHub – appium/appium: Automation for iOS, Android, and Windows Apps. openstf/stf: Control and manage Android devices from your browser. AutoIt: a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting.
其他概念
Agile development – 敏捷开发
使用分支,你就无法做持续集成 http://www.aiuxian.com/article/p-836173.html
# The Twelve-Factor App The Twelve-Factor App[……]
「DevOps」- 关于过于依赖基础设备的应用程序
在我们的日常开发中,前端程序和后端程序都存在大量 Nginx 配置,通过 Nginx 配置进行 URL 的处理以及实现用户请求的路由。
采用这种方法的优点是:简单,拦截一切请求,然后直接进行跳转或进行其他处理。
但是,解决问题的方案 和 解决问题的最方案 是两回事情,这样处理请求也存在很多问题,所以我们尝试将应用程序与 Nginx 解耦。
将业务配置从Nginx中脱离的原因: 1)应用与基础设施的解耦性,增加可移植性:将Nginx与业务应用的解耦,提高程序的可移植性,应用程序应是基础设置无关的。 2)应用程序的可维护性:简化应用程序的维护成本,在问题排查追踪过程中可快速溯源。 3)个人技能技能:由于基础设施并不是每个人的专长领域,部分基础设置配置中会忽略某些潜在的问题,可能会存在可移植性差、稳定性差的问题。
不是说不能在 Nginx 中进行处理,而是说能在应用层面解决的问题尽量放在应用程序层面解决,尽量避免放在基础层面。除非应用层面解决不了,万不得已才放入 Nginx 之类的基础设置中处理。
实际上 Nginx 把请求传递给应用,我们应该在应用的路由来决定这个资源的请求该如何处理,而不是再 Nginx 的配置中混入业务相关的东西。
相关链接
Yii2 cors filters error that No ‘Access-Control-Allow-Origin’ header is present[……]
「DevOps」- 部署环境
问题描述
软件开发通常会涉及各种环境,比如开发、测试、生产等等。那么各个环境对应哪个英文单词呢?
在软件开发中,通过会涉及很多的环境。在简单情况下,可能只有一个环境,例如在同一台机器上开发和立即执行程序。但在工业应用中,开发环境(进行最初更改)和生产环境(用户最终使用)是分开的;经常分为几个阶段。使用此结构化发布管理过程,允许在出现问题时分阶段部署(部署),测试和回滚;
本文将简单介绍这些环境以及这些环境的含义、作用;
环境列表
部署体系结构,从广义上讲,层级是通过从开发(DEV)开始到生产(PROD)结束来预订的。常见的四层体系结构是开发,测试,模型,生产(DEV,TEST,MODL,PROD),并按顺序部署软件;
但是,这个过程中涉及的部署环境可能有很多。比说说,开发过程中可能包含开发环境与集成环境;
Local
开发人员的桌面 / 工作站。直白的说就是开发者本地的环境;
dev: Development/Trunk
开发服务器充当沙箱,其中单元测试可由开发人员执行。为开发人员提供一个类似生产环境的运行环境;
比如,开发者在 Windows 中进行开发,但是线上环境是 Linux 服务器。此时,开发者可以在开发环境(运行 Linux 主机,保证类似于生产)中运行程序,进行某些单元测试等等;
Integration
持续集成构建目标,或开发人员测试副作用。汇集开发人员的成果,发现其中的问题;
tst: Testing/Test/QC/Internal Acceptance
执行测试的环境。在测试环境中部署新代码后,质量控制团队确保新代码不会对现有功能产生任何影响,并测试系统的主要功能;
质量团队工作于该环境中,对产品功能进行测试;
stg: Staging/Stage/Model/Pre-production/External-Client Acceptance/Demo
生产环境的镜像,是一种完全类似于生产环境的测试环境。旨在尽可能地对实际的生产环境进行镜像,并可以连接到其他生产服务和数据,例如数据库;
pro: Production/Live
为最终用户 / 客户提供服务的环境;
其他常见术语
DEV: Development FAT: Factory Acceptance Test UAT: User Acceptance Test PRO: Production
最后总结
英文
中文
Development environment
开发环境
Testing environme[……]
「DevOps」- 服务升级策略
问题描述
在践行 DevOps 理念时,需要引入大量的工具(诸如 Jenkins GitLab Harboar Nexus SonarQube Rancher Kubernetes 等等)。
针对日常管理,我们面临的最大问题是这些工具集的升级问题。鉴于 DevOps 盛行,这些工具的发布周期短,新版本发布速度快。例如,Gitlab 每月更新次版本,Jenkins 每周更新次版本;
作为开源软件下游的用户,我们要决定是否进行升级、升级带来的问题、升级频率 等等问题。
该笔记将记录:针对升级操作,我们需要考虑哪些问题、我们的所采用的升级策略、相关的升级问题的解决办法。
解决方案
版本选择策略
我们当前采用「版本间隔」的升级策略,具体细节如下: 1)假如官方发布 14.5 版本,虽然经过官方测试,但我们不会升级到最新版本; 2)我们会查看 14.4 版本所修复的问题,来发现 14.3 版本中潜在的问题; 3)如果 14.3 版本中潜在的问题是我们所能接受的,我们将升级到 14.3 版本;
服务升级周期
当前服务升级周期,跟随官方版本发布周期,最快每 6 周进行一次服务升级,最晚 3 月进行服务升级; 若未跟随官方版本发布周期进行升级,则下次升级时将会进行连续升级;
服务升级规范
该升级规范流程借鉴于《华为网路升级规范》,并结合当前的实际应用场景进行调整。
阶段一、前期准备
调研升级环境
1)在开始升级前,需要与 技术负责人、研发工程师 等等多方进行沟通,以进行相关使用及当前配置信息的收集; 2)针对收到收集到的信息,分析服务当前情况以及升级前后服务情况进行对比分析,判断升级前后服务是否正常; 3)静态信息采集分析:当前服务拓扑信息;当前服务版本信息;当前软件许可信息;当前服务配置信息; 4)动态信息采集分析:服务资源使用情况;服务带宽使用信息;服务运行状态;服务网络时延、抖动、丢包率; 5)业务模型采集分析:在调研阶段中,还需要对服务的业务流量走向、业务流量大小进行观察,包括流量走向的变化和链路流量大小,可用于升级前后进行对比;
分析升级内容
当调研升级完成后,需要分析此次升级内容: 1)针对研发需求进行分析、梳理,分析用户服务升级的需求,诸如 问题修复、引入新特性 等等; 2)输出《服务升级变更内容》,在该文档中,明确升级需求、选择目标版本、明确变更内容;
评估升级风险
1)根据调研结果、需求分析结果、升级方案的框架,进行升级风险分析与评估; 2)针对可能出现的风险项目提前制定应对措施,并将对应的风险项对应措施责任人确认; 2)风险评估需要涉及的技术人员参与讨论,将各个风险的责任人明确到具体的技术人员;
输出升级方案
1)根据调研结果、项目分[……]
「Nexus Repository Manager」
用于搭建私有仓库。
它可以是MAVEN仓库,可以是PYPI仓库,可以是DOCKER镜像仓库,可以是很多类型的仓库。且也可以同时支持这些格式。官方文档中列出了所有支持的格式「Formats」。[……]
「Nexus」- 部署 3.33.0 版本,Docker Compose
问题描述
该笔记将记录:通过 Docker Compose 部署 Nexus 3.33.0 版本的方法,以及相关问题的解决办法。
解决方案
第一步、编写 Docker Compose 文件
version: “3”
services:
package-repository:
image: sonatype/nexus3:3.33.0
container_name: package-repository
restart: always
volumes:
– “/srv/hdd/package-repository/nexus-data:/nexus-data”
ports:
– “50362:8081”
第二步、启动服务并测试
# 根据文档,nexus-data,会被 UID=200 的进程 Nexus 写入数据,所以:
mkdir -pv /srv/hdd/package-repository/nexus-data
chown 200 /srv/hdd/package-repository/nexus-data
# 启动服务
docker-compose up -d
# 查看运行日志:
docker-compose logs -f
第三步、配置 Nginx 代理
server
{
listen *:443;
server_name repo.example.com;
# allow large uploads of files
client_max_body_size 1G;
# optimize downloading files larger than 1G
#proxy_max_temp_file_size 2G;
ssl on;
ssl_certificate example.pem;
ssl_certificate_key example.key;
location /
{
# Use IPv4 upstream address instead of DNS name to avoid attempts by nginx to use IPv6 DNS lookup
proxy_pass http://127.0.0.1:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
pro[……]
「DevOps」- 自动化测试
概念术语
Performance Testing(性能测试)
Load Testing(压力测试)
Stress Testing(负载测试)
Locust – A modern load testing framework https://locust.io
Jmeter (Apache)
Homepage: http://jmeter.apache.org/ Source Repositories: http://jmeter.apache.org/svnindex.html[……]
「Project Management」- 项目管理软件
问题描述
通过项目管理工具,我们可以追踪当前问题、了解工作进度、查看当前进展,可以更好的控制工作。
该部分笔记将记录:与项目管理有关的工具,比如 Kanboard、Redmine 等等。
解决方案
Redmine Unfuddle STACK – Software Project Management Online | GIT and SVN Hosting
团队看板
Kanboard Wekan – Open-Source kanban
个人看板
Kanban for VSCode
mkloubert/vscode-kanban
focalboard
mattermost/focalboard
适合我们工作场景的看板工具
针对我们的工作场景,我们对看板工具有以下要求: 1)基本的看板功能 2)针对团队,每个团队都有自己的看板页面 3)能够定时任务提醒;
目前(06/24/2021),能够满足我们需求的只有 Wekan 看板工具。但是,它还不支持定时任务提醒。
参考文献
kanban-board · GitHub Topics · GitHub[……]
「Kanboard」- 个人看板工具
问题描述
参考 Project Management Software 问题。
目前,我们使用 Kanboard 进行问题记录与追踪(实际是个人看板,我们用它记录生活的各种事情、待办事项等等)。
该笔记将记录:Kanboard 的安装过程、使用方法、常见问题处理。
解决方案
官方主页:Kanban Project Management Software – Kanboard 项目地址:kanboard/kanboard: Kanban project management software
安装步骤
该笔记只包含简述,详细参考 Installation Instructions 手册。
1)准备 PHP 环境,无需安装 MySQL 数据库(默认使用 sqlite 数据库); 2)下载源码,或者克隆源码(我们直接使用 master 分支); 3)保证 data 目录可写,用于保存:sqlite,log,uploaded files,image thumbnails 4)浏览器访问,默认密码为 admin/admin,注意修改默认密码;
升级步骤
详细步骤,参考 Upgrading to a New Version — Kanboard documentation 页面。
1)数据备份:rsync -avz “</path/to/kanboard>” “</path/to/kanboard.backup>”; 2)拉取最新代码(我们直接使用 master 分支):git pull origin master 3)访问页面,浏览器访问新页面,按照按照提示操作即可。
安装插件
第一步、启用配置文件
Configuration File
cp config.default.php config.php
第二步、修改配置文件
Plugin Directory Configuration
The plugin directory must be writeable by the web server user -> /path/to/kanboard/plugins/
The Zip extension must be available on your server -> php zip extension
The config parameter PLUGIN_INSTALLER must be set to true -> vim config.php
补充说明
如果插件版本较旧,可以直接从 GitHub 将插件检出新版本插件到 plugins 目录。
常用插件记[……]
「Redmine」- 灵活的项目管理应用
Requirements
# Operating system: 任何安装Ruby环境的机器皆可。
!!我们使用CentOS 7.4服务器。
# Ruby interpreter: 安装Ruby环境。依照文档「Ruby interpreter」要求安装。
!!我们采用RVM安装Ruby 2.6环境。
# Supported database back-ends: 选用MySQL数据库。
!!直接从Yum源中安装MySQL 5.6版本。
# Optional components 可选组件需要安装一些额外的包。比如,SCM,ImageMagick等等。
Redmine Version
!!安装Ruby 2.6环境就是为了选用Redmine 4.0.4版本。
下载:wget https://www.redmine.org/releases/redmine-4.0.4.tar.gz
Installation procedure
#0 注意事项
(1)在Linux中的ACL、SELINUX在导致在安装过程中出现一些问题。
(2)如果不想手动安装,则可以考虑使用第三方的包:「Third-party Redmine bundles」
#1 下载并解压(跳过)
将Redmine解压到/usr/local/redmine/中。
#2 创建数据库用户
CREATE DATABASE redmine CHARACTER SET utf8mb4;
CREATE USER ‘redmine’@’localhost’ IDENTIFIED BY ‘my_password’;
GRANT ALL PRIVILEGES ON redmine.* TO ‘redmine’@’localhost’;
#3 修改数据库配置
复制配置文件:cp config/database.yml.example config/database.yml
修改配置文件:vim config/database.yml
#4 依赖安装
# Redmine使用bundler管理依赖
gem install bundler
# 安装相关依赖(但是你需要先修改一下源)
bundle config mirror.https://rubygems.org https://gems.ruby-china.com
bundle install –without “development” “test” # 如果不修改源,则会卡住不动
# 在执行「bundle install –without “development” “test”」时遇到了一些错误。[……]
「Wekan」- 看板工具(kanban)
问题描述
该笔记将记录:在 Linux 中,如何安装 Wekan 看板工具,简单的使用方法,以及常见问题处理。
解决方案
部署方式的选择
参考 Platforms · wekan/wekan Wiki 文档,以了解官方支持所有部署方式。
我们尝试通过 UCS 安装:UCS 算是个 Linux 发行版,但是与其他发行版的意图不同。它集成各种基础服务(DNS, DHCP, …),我们能够通过 Web 界面直接安装应用,包括这里的 Wekan 应用。优点在于(1)简化部署、自动升级、易于维护,而缺点是(1)鉴于国内的网络环境,会出现各种失败。经过一番折腾,最终我们放弃这种方法。
我们最后通过 Docker Compose 安装(对于我们来说,这优于其他方法)。该方法的缺点是(1)需要自行维护,升级,部署;(2)数据保存在 Docker Volume 中,需要谨慎操作数据。
第一步、服务部署
git clone https://github.com/wekan/wekan.git
cd wekan
# 1)修改服务的端口映射,默认为 80:8080 与本地冲突;
# 2)修改数据存储,将其挂载到本地目录,而非 dockre volume 存储;
# 3)镜像不要使用 latest 标签,因为该 TAG 处于开发状态,未经测试;
vim docker-compose.yaml
# 启动服务
docker-compose up -d
第二步、登录注册
当前版本:quay.io/wekan/wekan:v5.17
根据官方文档(Adding users · wekan/wekan Wiki),没有默认帐号密码,首个注册的用户将成为管理员。
数据备份与数据恢复
参考 Docker · wekan/wekan Wiki · GitHub 文档
数据备份:
# 停止应用
docker stop wekan-app # 防止数据写入
# 导出数据
docker exec -it wekan-db bash
cd /data
rm -rf dump
mongodump
exit
# 复制数据到本地
docker cp wekan-db:/data/dump .
数据恢复:
# 停止应用
docker stop wekan-app # 防止数据写入
# 复制数据到容器
docker exec -it wekan-db bash
cd /data
rm -rf dump
exit
docker cp dump wekan-db:/data/
# 导入数据
docker exec -it wekan-db bash
cd /da[……]
「SonarQube」- Code Quality and Security
[……]
「SonarQube」- 安装、升级
注意事项
生产环境、内嵌数据库
Migrate H2 database for SonarQube version upgrade – SonarQube
我们的 SonarQube 7.9 版本,需要升级到 SonarQube 8.0 版本,但是升级失败。 原因是当初部署的时候使用内嵌数据库,并一直沿用至今,而内嵌数据库是无法迁移的。 官方文档对于内嵌数据库的问题已经再三强调,我们也只能重新部署新的版本。
服务部署
WIP
反向代理
参考 Securing the Server Behind a Proxy 文档,以获取对 Nginx 反向代理的官方配置。
# the server directive is nginx’s virtual host directive
server {
# port to listen on. Can also be set to an IP:PORT
listen 80;
# sets the domain[s] that this vhost server requests for
server_name www.somecompany.com;
location / {
proxy_pass http://sonarhost:sonarport;
}
}[……]
「SonarQube」- 备份与恢复
问题描述
我们使用 Docker 运行 SonarQube 服务。现在我们需要对 SonarQube 服务进行备份。
该笔记将记录: SonarQube 服务的数据备份与恢复方法。
解决方案
官方文档对备份恢复的描述倒是简单,如下(Backup and Restore | SonarQube Docs):
Backing Up Data
Most databases come with backup tools. We recommend using these tools to back up your data.
Restoring Data
To restore data from backup, follow these steps:
Stop the server.
Restore the backup.
Drop the Elasticsearch indexes by deleting the contents of $SQ_HOME/data/es6 directory.
Restart the server.
简单的数据备份
因为不到 4G 数据量,我们也就简单做: 1)停止 SonarQube 服务:docker-compose down 2)执行数据全量备份:rsync –delete -a /path/to/sonarqube /path/to/sonarqube.backup.$(date “+%Y%m%d”) 3)重新启动 SonarQube 服务:docker-compose up
参考文献
Backup and Restore | SonarQube Docs[……]
「SonarQube」- 代码质量检查
配置 SonarQube 检测代码
https://www.sonarqube.org/roadmap
重置密码
How to recover admin password for SONAR Reinstating Admin Access
默认的 用户名/密码 是 admin/admin 。如果忘记密码可以进行重置:
— SonarQube 7.7
update users set crypted_password = ‘$2a$12$uCkkXmhW5ThVK8mpBvnXOOJRLd64LJeHTeCkSuB3lfaR2N0AYBaSi’,
salt=null, hash_method=’BCRYPT’ where login = ‘admin’
参考文献
SonarQube: Continuous Inspection Wikipedia/SonarQube GitHub/SonarSource/sonarqube[……]
「OBSERVABILITY」- 学习指南
研究对象
观测系统
研究结果
1)理论:掌握与观测相关的概念及术语,相关的技术解决方案; 2)实践:部署观测系统,实现对现网环境及系统运行的观测;
研究工具
WIP[……]