IT办公室的故事 2024-03

阿酷
·
·
IPFS
图像源自:https://www.pexels.com/

随着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的功劳算在我自己头上。

就这样,为了懒,不想干活,我花了半个小时完成了一个手动十分钟完成的事情。就是想要达到自己坐在电脑前,看软件组自己劳动效果……

CC BY-NC-ND 4.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!