IT办公室的故事 2024-03
随着VMware被Broadcom收购,价格上涨;Proxmox的性能又无法完全取代VMware。我们决定把更多的系统移到AWS的云服务中。
原本我们在VMware上面架设了红帽公司的Openshift,用来管理Kubernetes和SDN。为了减少购买软件的价格,我们决定把本地的Openshift转换成AWS上的ROSA(Red Hat Openshift Service on AWS)。
都说在AWS上面全天候运行服务会贵,但是这也比现在的VMware价格便宜。唉!这世道,真的变了……
Openshift管理Container,正好用来管理我们的各种网站;再者,挪到AWS上还有另一个好处,那就是即便学校的网络除了问题,也不用担心这些网站会跟着一块被动性的关闭。
不过我们不可能把数据库留在本地,那样AWS和学校数据中心只见的数据流量就太大了。所以我们需要把数据库挪到AWS的RDS服务上面去。
因此,这段时间我们做IT运营的和软件开发那边密切地互动起来。他们修改自己的CI/CD,而我们则全面配合他们维护Container和数据库。
不过人都是懒得。
手动搬数据库稍微有些浪费时间;更何况他们的开发环境也是在AWS中,我们要随时帮助他们重置数据。于是乎,我们像把工作退还给App组。
下方数据库的权限肯定是不行的。为了省钱,开发环境和正式产品环境在一个RDS组中。谁也不会放心大胆的让他们随便在上面乱搞。
于是乎,我们便把本地管理Linux系统的Ansible搬到了AWS中。
首先是要克隆数据库。不管是重置还是正式移动,我们的数据都是从本地转到RDS上面去的。
要想实现上面的愿望,我们需要做三件事:
第一就是把数据库备份下来。用最基本的mysqldump是最简单的方法。
mysqldump -u $DB_USER -p$DB_PASS $dbname > "$dbname.sql"
第二步是把刚刚备份上传到亚马逊的RDS上面去。由于克隆的数据库可能是最终的正品,也有可能是用来做研发的。所以数据库命名上要做一些区别对待。
if [ "$1" == "prod" ]; then
mysql -h $REMOTE_DB_HOST -u$REMOTE_DB_USER -p$REMOTE_DB_PASS -e "CREATE DATABASE IF NOT EXISTS $dbname"
else
mysql -h $REMOTE_DB_HOST -u$REMOTE_DB_USER -p$REMOTE_DB_PASS -e "CREATE DATABASE IF NOT EXISTS dev_$dbname"
fi
最后步则是拷贝原有管理数据库的用户和密码。数据库中的密码是加密的,不过我们可以把加过密的hash数据提取出来。我们不需要知道密码,直接可以在RDS的新数据库中利用加密的密码建立新用户。
RO_HASHED=$(pt-show-grants --user="$DB_USER" --password="$DB_PASS" --only "$RO_USER")
RO_PASS=$(echo "$RO_HASHED" | grep -Po "IDENTIFIED BY PASSWORD '\K.*(?=')")
mysql -h $REMOTE_DB_HOST -u$REMOTE_DB_USER -p$REMOTE_DB_PASS -e "CREATE USER '$2RO'@'' IDENTIFIED BY '$RO_PASS';"
最后我们在Ansible Tower中给他们做一个简单的界面,让他们自己运行这个Bash脚本就可以了。
- name: RDS Database Clone
hosts: <local_db>
remote_user: awx
vars:
# Assign a default value to the specific extra_var name
method: "{{ method | default('default_value', true) }}"
db: "{{ db | default('default_value', true) }}"
tasks:
- name: Check if method exists
debug:
msg: "method is not defined."
when: method == 'default_value'
- name: Check if db exists
debug:
msg: "db is not defined."
when: db == 'default_value'
- name: Clone local MariaDB Database
shell: "/home/awx/db_clone.sh {{ method }} {{ db }}"
当然,在最后还要让ansible给我们的IT服务管理系统发封邮件,把完成ticket的功劳算在我自己头上。
就这样,为了懒,不想干活,我花了半个小时完成了一个手动十分钟完成的事情。就是想要达到自己坐在电脑前,看软件组自己劳动效果……