iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
0
DevOps

Cloud Native 開發維運一條龍系列 第 7

Day 7. 容器化的 Database 部署與管理 - 以 PostgreSQL 為例

  • 分享至 

  • xImage
  •  

上一篇我們部署了 Nginx ,這些部署的順序是有關係的,昨天先部署 Nginx ,是因為我們可以先確定 host docker 的 VM 是否可用,還有理論上其他微服務都還沒起來,Nginx 的 reverse proxy 會遇到 time out,藉此也可以先 verify 我們 50X(500, 502, 501, 503, 504...etc)的預設頁面是否可用。

而今天要來部署 db 。正統的 db 部署最少也要考慮高可用性(HA, High Availablility),但在開發與原型製作(Prototyping)階段,往往我們需要的是一個可用的 db 就好,然後就能盡快開工,以下示範用 ansible 迅速起一個 PG 10 的 db。

$ cat roles/tasks/run_postgresql.yaml 
- name: Docker | Start postgresql.mytodos
  docker_container:
    name: postgresql.mytodos
    state: started
    domainname: postgresql.mytodos
    image: postgres:10-alpine
    networks:
      - name: mynet
        aliases: postgresql.mytodos
        ipv4_address: 172.20.0.3
    ports:
      - '5432:5432'
    env:
      POSTGRES_DB: "{{ pg_db }}"
      POSTGRES_USER: "{{ pg_user }}"
      POSTGRES_PASSWORD: "{{ pg_pass }}"
    volumes:
      - /usr/share/zoneinfo/UTC:/etc/localtime:ro
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
      - "{{ prd_dir }}/postgresql/data/mnt:/var/lib/postgresql/data"
      - "{{ prd_dir }}/postgresql/log:{{ prd_dir }}/postgresql/log"
    restart: true
    recreate: true
- name: File | Remove Directories
  file:
    path: /tmp/pg_sql
    state: absent
    owner: centos
    group: centos
- name: File | Create Directories
  file:
    path: /tmp/pg_sql
    state: directory
    owner: centos
    group: centos
- name: Copy to Remote | Copy PG Schema to remote
  copy:
    owner: centos
    src: "{{ dev_dir }}/files/sql.d/schema/create_todos_schema.sql"
    dest: /tmp/pg_sql/001.sql
- name: Template | Replace Template and Send to Remote
  vars:
    todo_serial: "{{ item.serial }}"
    todo_userid: "{{ item.userid }}"
    todo_title: "{{ item.title }}"
  with_items: "{{ todo_items }}"
  template:
    owner: centos
    src: "{{ dev_dir }}/files/sql.d/data/insert_default_todos.sql.j2"
    dest: "/tmp/pg_sql/002.{{ todo_serial }}.sql"
- name: Shell | Create DB and ignore failure
  shell: 'PGPASSWORD={{ pg_pass }} $(which psql) -U "{{ pg_user }}" -h 172.20.0.3 -d postgres -c "CREATE DATABASE {{ pg_db }};"'
  ignore_errors: yes
- name: Shell | Apply PG schema on remote machine
  shell: 'cd /tmp/pg_sql; find . -type f -name "*.sql" | sort -n | while read f; do PGPASSWORD={{ pg_pass }} $(which psql) -U "{{ pg_user }}" -h 172.20.0.3 "{{ pg_db }}" -f $(basename $f) ; done'

可以看到 db 相關的環境變數,其實是從 host VM 上的環境變數一路傳遞進來,為的是避免顯式地暴露使用者名稱與密碼在版控 a.k.a Git 裡

  • 帳密寫在 host VM 上的 ~/.bash_profile~/.bashrc
  • source ~/.bash_profile
  • ansible 用 lookup 的指令去找環境變數的值
  • 透過 ansible 的 jinja 模版在部署 Yaml 時去代換指定的值

以下的寫法,可以寫在 inventory 裡,作為全域通用的代換

[all:vars]
pg_db=todos
pg_user="{{ lookup('env', 'MY_TODOS_PG_USER') }}"
pg_pass="{{ lookup('env', 'MY_TODOS_PG_PASS') }}"

關於資料庫的設定,還有 init 的 script 、預設塞入的資料、安全性設定…種種非常多的細節,幸運的是,大多數這些需求都可以用 ansible 腳本設定地妥妥當當,但這邊如果全部的細節都開展下去,會把篇幅拉得非常長,我就點到為止,較完整的 script 詳參 Day10 完全體的 repo


上一篇
Day 6. 容器化的 Reverse Proxy 部署與設置 - 以 Nginx 為例
下一篇
Day 8. 容器化的 API Gateway 開發與部署 - 以 Flask 為例
系列文
Cloud Native 開發維運一條龍18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言