星期日, 1月 31, 2021

Ansible Dynamic Inventory For GCP 小記

Ansible Dynamic Inventory For GCP 小記


OS: container with openSUSE Leap 15.2

Ansible: 2.10.3


之前有在 Azure 實驗過 Dynamic Inventory


今天要來實驗 Ansible Dynamic Inventory for GCP.


今天會使用到的 module, gcp_compute


先安裝相依的套件


# pip  install --upgrade  pip


# pip3  install  requests  google-auth



前置作業

  • 建立 GCP  Service Account

    • 建立的方式可以參考之前的文章 http://sakananote2.blogspot.com/2020/07/gcp-cloud-storage.html

    • 新增 Key with JSON, 下載 Key 並重新命名test20210131.json

    • 實驗的關係, 給予相關測試權限

      • 如果只是要獲得相關資訊的話, 要有 compute.instances.list 權限, 如果是要套用比較少的 Role 的話, 可以考慮 Compute OS Login 這個 Role, 因為它只有 9 個 assigned permissions

      • 但是這個 Service account 可能會綜合來進行一些工作的執行, 也可以考慮把日後要的權限加進來, 或是精實一點建立不同的 Service account 然後在 ansible 的 module 設定內分開, 這個部分就看大家了.




參考網路上看到的文章


首先在 ansible.cfg 內加入設定


[defaults]

# 預設的hostfile 檔案名稱

# hostfile 已經棄用 

#hostfile = hosts

#inventory = hosts

inventory = gcp.yaml


# 遠端連線使用者

remote_user = root


# ssh 金鑰, 如果沒有設定就是 ssh 預設

# private_key_file = 


# 不詢問就加入遠端主機 ssh key

host_key_checking = False


# 設定 retry files (*.retry) 存放路徑, 預設放家目錄

# 我自己喜歡指定在目前目錄, 以免作完實驗家目錄一堆 .retry

retry_files_save_path = ./ansible-retry

[inventory]

enable_plugins = gcp_compute


  • inventory 指向設定的 gcp.yaml

  • 多加上 [inventory] 設定



新增 gcp.yaml 

檔案內容如下


---

plugin: gcp_compute

projects:

  - sakanatest

auth_kind: serviceaccount

service_account_file: /root/test20210131.json

keyed_groups:

  - key: labels

    prefix: label

  - key: zone

    prefix: zone

groups:

#  development: "'env' in (labels|list)"

  development: "'env' in labels"

# 用機器名稱來分群組

  staging: "'sakana' in name"



  • 專案請對應到自己的專案 ID

  • service_account_file 部分請對應到 剛剛建立的 JSON Key 路徑


接下來建立 GCE 然後給予 label 

  • env: test

  • os: opensuse


進行相關測試 使用 ansible-inventory 指令


#  ansible-inventory  --list  -i  gcp.yaml


擷取部分輸出


    "all": {

        "children": [

            "development",

            "label_env_test",

            "label_os_opensuse",

            "ungrouped",

            "zone_asia_east1_b"

        ]

    },

    "development": {

        "hosts": [

            "34.80.30.116"

        ]

    },

    "label_env_test": {

        "hosts": [

            "34.80.30.116"

        ]

    },

    "label_os_opensuse": {

        "hosts": [

            "34.80.30.116"

        ]

    },

    "zone_asia_east1_b": {

        "hosts": [

            "34.80.30.116"

        ]

    }


  • 這邊指令後面使用 -i 來指定 inventory file 是 gcp.yaml, 不過其實我們剛剛在 ansible.cfg 有指定, 所以其實不加上 -i gcp.yaml 也是可以


這邊可以注意到扣掉 ungrouped 之外有分出 4 個群組

解釋如下

回頭觀察 gcp.yaml 檔案內的設定


keyed_groups:

  - key: labels

    prefix: label

  - key: zone

    prefix: zone

groups:

#  development: "'env' in (labels|list)"

  development: "'env' in labels"

# 用機器名稱來分群組

  staging: "'sakana' in name"


  • 因為有使用 keyed_groups

    • key: zone

      • 所以個別的 zone 會是一個群組, 例如 asia_east1_b

    • key: labels

      • 所以有 共同 label 的 key 與 value 就會會是一個群組, 例如 env: test

  • 因為有使用groups

    • 設定 只要 有 env 關鍵字在 labels 就要歸類到 development 群組

    • 另外一個應用是使用機器的名稱, 我的條件是 sakana 這個關鍵字在 name 裡面就歸類到 staging 群組, 不過目前沒有符合, 就不會被建立


這樣就算測試成功了

以後就可以使用 Dynamic Inventory 的方式, 透過 Label 或是特定的關鍵字分群組

然後在 Ansible 內對不同的群組進行不同的設定


也是前進了一小步



~ enjoy it




Reference:



星期日, 1月 03, 2021

WordPress with container 練習小記

WordPress with container 練習小記


OS: openSUSE Leap 15.2 in Azure


今天來寫 WordPress 的練習文章

現在 WordPress 的使用率已經越來越高了, 今年的一些讀書計劃的內容內也有 WordPress 的規劃

首先就使用 container 的方式來進行練習.


規劃架構



  • 使用 openSUSE Leap 15.2 VM in Azure 作為 container host

  • 使用 container 方式執行 MySQL 與 WordPress

  • 建立獨立的 container network 給 WordPress 與 MySQL

    • 好處是可以使用名稱的方式連接

  • 建立 container volume web-data

    • 掛載 MySQL 的 /var/lib/mysql 以利後續維護與升級

  • 可以考慮另外建立獨立的 volume 來存放 WordPress 的 Plugin

在 Azure 內建立 openSUSE Leap 15.2 的 VM


SSH 連線虛擬機器, 並使用 > sudo su - 切換為管理者 root


啟動 docker 服務

# systemctl  start  docker


首先觀察主機上的 volume


# docker  volume  ls


DRIVER              VOLUME NAME


建立 volume

# docker  volume  create  web-data


web-data


觀察資訊

# docker  volume  ls


DRIVER              VOLUME NAME

local               web-data



# docker  volume  inspect  web-data


[

    {

        "CreatedAt": "2021-01-03T06:04:30Z",

        "Driver": "local",

        "Labels": {},

        "Mountpoint": "/var/lib/docker/volumes/web-data/_data",

        "Name": "web-data",

        "Options": {},

        "Scope": "local"

    }

]


  • 可以觀察 web-data 在本機上面的 mountpoint




一樣, 建立之前先觀察資訊


# docker  network  ls


NETWORK ID          NAME                DRIVER              SCOPE

0362ba8e433b        bridge              bridge              local

1e4986872739        host                host                local

0ac3b895fef7        none                null                local


建立 network


# docker  network  create  web-network


457bc7fc24f0b26796f32f5f3191853b9363a3a83e07044cf8d4fe5bd8a213fa


再次觀察資訊

# docker  network  ls


NETWORK ID          NAME                DRIVER              SCOPE

0362ba8e433b        bridge              bridge              local

1e4986872739        host                host                local

0ac3b895fef7        none                null                local

457bc7fc24f0        web-network         bridge              local


爲何要建立 network, 因為預設 bridge network 不能用名稱解析, 這樣會連接不到

可以參考官方的說明: Differences between user-defined bridges and the default bridge

  • https://docs.docker.com/network/bridge/

  • User-defined bridges provide automatic DNS resolution between containers

  • Containers on the default bridge network can only access each other by IP addresses, unless you use the --link option, which is considered legacy

另外一篇文章


開始佈署 MySQL


# docker  run  --name  web-mysql --network web-network -e  MYSQL_ROOT_PASSWORD=rootpassword  -e  MYSQL_DATABASE=wp  -e  MYSQL_USER=sakana  -e  MYSQL_PASSWORD=sakanapassword -d  mysql:5.7



開始佈署 WordPress

# docker  run  --name  web-wordpress  --network  web-network  -e  WORDPRESS_DB_HOST=web-mysql:3306 -e WORDPRESS_DB_NAME=wp  -e  WORDPRESS_DB_USER=sakana  -e  WORDPRESS_DB_PASSWORD=sakanapassword  -p  80:80  -d  wordpress


  • 因為只是實驗, 所以上面的相關密碼就用簡單的方式


如果要更安全的方式可以考慮使用 docker secret



進行測試

首先在 Azure 上的網路安全性群組, 先開放 port 80 可以存取



接下來連線 VM 的對外 IP

就會進入 WordPress 的安裝畫面

語系選繁體中文 -- > 繼續




輸入相關資訊

點選 安裝WordPress




大功告成

點選 登入



使用剛剛建立的帳號密碼

就可以進行登入



接下來就可以進入後台轉寫文章, 進行設定



或是觀察自己的第一個 WordPress 了




另外也有看到 docker-compose 安裝方式, 先放在下面, 以後再說

docker-compose 安裝


在 minikube 上架設 Stateless Wordpress




又離 WordPress 進了一步

~ enjoy it



Reference