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


Stackdriver-agent with openSUSE Leap 15.2 in GCP 安裝小記

Stackdriver-agent with openSUSE Leap 15.2 in GCP 安裝小記


OS: openSUSE Leap 15.2 in GCP


今天要來嘗試在 openSUSE Leap 15.2 in GCP 安裝 stackdriver 的 agent


首先先來談談爲何要在 GCP 的 OS 內安裝 stackdriver-agent


預設在 GCP 內使用 OS, GCP 是會提供相關監控的數值



  • 例如 CPU 用量 / 網路狀況 / 磁碟 IOPS


但是 如果是要監控 Memory Utilization / Disk Space Utilization 就是要安裝 Stackdriver-agent

安裝 agent 的官方頁面如下


但是目前 stackdriver-agent 只有針對已經支援的 OS 來進行安裝 script, 可惜的是 openSUSE Leap 沒有列在裡面, 所以我就嘗試用 SLES 的方式來修改, 讓 openSUSE Leap 15.2 in GCP 也可以看到相關資訊


所以以下為個人實驗, 不負責相關影響 


在 GCP 建立 openSUSE Leap 15.2 GCE




SSH 連入該台 GCE 進行安裝

切換為 root 身份進行處理 (個人習慣)


> sudo  su  -


下載 GCP add agent script 到目前目錄

# curl  -sSO  https://dl.google.com/cloudagents/add-monitoring-agent-repo.sh


觀察相關資訊

# ls

.bash_history  .gnupg  .ssh  add-monitoring-agent-repo.sh  bin


觀察 script 內容


# egrep  -v  '^#|^$'  add-monitoring-agent-repo.sh 


REPO_HOST='packages.cloud.google.com'

MONITORING_AGENT_DOCS_URL="https://cloud.google.com/monitoring/agent"

MONITORING_AGENT_SUPPORTED_URL="${MONITORING_AGENT_DOCS_URL}/#supported_operating_systems"

[[ -z "${REPO_SUFFIX-}" ]] && REPO_SUFFIX='all'

if [[ -f /etc/os-release ]]; then

  . /etc/os-release

fi

handle_debian() {

  lsb_release -v >/dev/null 2>&1 || { \

    apt-get update; apt-get -y install lsb-release; \

  }

  apt-get update; apt-get -y install apt-transport-https ca-certificates

  local CODENAME="$(lsb_release -sc)"

  local REPO_NAME="google-cloud-monitoring-${CODENAME}${REPO_SUFFIX+-${REPO_SUFFIX}}"

  cat > /etc/apt/sources.list.d/google-cloud-monitoring.list <<EOM

deb https://${REPO_HOST}/apt ${REPO_NAME} main

EOM

  curl --connect-timeout 5 -s -f "https://${REPO_HOST}/apt/doc/apt-key.gpg" | apt-key add -

}

handle_rpm() {

  lsb_release -v >/dev/null 2>&1 || yum -y install redhat-lsb-core

  local REPO_NAME="google-cloud-monitoring-${1}-\$basearch${REPO_SUFFIX+-${REPO_SUFFIX}}"

  cat > /etc/yum.repos.d/google-cloud-monitoring.repo <<EOM

[google-cloud-monitoring]

name=Google Cloud Monitoring Agent Repository

baseurl=https://${REPO_HOST}/yum/repos/${REPO_NAME}

enabled=1

gpgcheck=1

repo_gpgcheck=1

gpgkey=https://${REPO_HOST}/yum/doc/yum-key.gpg

       https://${REPO_HOST}/yum/doc/rpm-package-key.gpg

EOM

}

handle_redhat() {

  local VERSION_PRINTER='import platform; print(platform.dist()[1].split(".")[0])'

  local MAJOR_VERSION="$(python2 -c "${VERSION_PRINTER}")"

  handle_rpm "el${MAJOR_VERSION}"

}

handle_amazon_linux() {

  handle_rpm "amzn"

}

handle_suse() {

  SUSE_VERSION=${VERSION%%-*}

  local REPO_NAME="google-cloud-monitoring-sles${SUSE_VERSION}-\$basearch${REPO_SUFFIX+-${REPO_SUFFIX}}"

  zypper --non-interactive refresh || { \

    echo "Could not refresh zypper repositories."; \

    echo "This is not necessarily a fatal error; proceeding..."; \

  }

  cat > /etc/zypp/repos.d/google-cloud-monitoring.repo <<EOM

[google-cloud-monitoring]

name=Google Cloud Monitoring Agent Repository

baseurl=https://${REPO_HOST}/yum/repos/${REPO_NAME}

enabled=1

gpgcheck=1

repo_gpgcheck=1

gpgkey=https://${REPO_HOST}/yum/doc/yum-key.gpg

       https://${REPO_HOST}/yum/doc/rpm-package-key.gpg

EOM

  zypper --non-interactive --gpg-auto-import-keys refresh google-cloud-monitoring || \

    exit $?

}

case "${ID:-}" in

  amzn)

    echo 'Adding agent repository for Amazon Linux.'

    handle_amazon_linux

    ;;

  debian|ubuntu)

    echo 'Adding agent repository for Debian or Ubuntu.'

    handle_debian

    ;;

  rhel|centos)

    echo 'Adding agent repository for RHEL or CentOS.'

    handle_redhat

    ;;

  sles)

    echo 'Adding agent repository for SLES.'

    handle_suse

    ;;

  *)

    # Fallback for systems lacking /etc/os-release.

    if [[ -f /etc/debian_version ]]; then

      echo 'Adding agent repository for Debian.'

      handle_debian

    elif [[ -f /etc/redhat-release ]]; then

      echo 'Adding agent repository for Red Hat.'

      handle_redhat

    elif [[ -f /etc/SuSE-release ]]; then

      echo 'Adding agent repository for SLES.'

      handle_suse

    else

      echo >&2 'Unidentifiable or unsupported platform.'

      echo >&2 "See ${MONITORING_AGENT_SUPPORTED_URL} for a list of supported platforms."

      exit 1

    fi

esac


  • 這邊我只看 suse 的相關處理, 大概就是建立 /etc/zypp/repos.d/google-cloud-monitoring.repo 以及進行 gpg key import 與 refresh


仿造上面的做法來建立 /etc/zypp/repos.d/google-cloud-monitoring.repo


還沒做之前觀察 gpg key 資訊

# rpm  -qa  gpg-pubkey*


gpg-pubkey-307e3d54-5aaa90a5

gpg-pubkey-3dbdc284-53674dd4

gpg-pubkey-39db7c82-5847eb1f


建立 google-cloud-monitoring.repo 相關資訊

#vi  /etc/zypp/repos.d/google-cloud-monitoring.repo


內容如下

[google-cloud-monitoring-sles15-x86_64-all]

name=google-cloud-monitoring

enabled=1

autorefresh=1

baseurl=https://packages.cloud.google.com/yum/repos/google-cloud-monitoring-sles15-x86_64-all

type=rpm-md

keeppackages=0

gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg

       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg


匯入 上面的 gpgkey

# rpm  --import  https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

# rpm  --import  https://packages.cloud.google.com/yum/doc/yum-key.gpg


  • 這樣可以避免 Signature verification failed for file 'repomd.xml' 問題


進行 gpgkey 比對

# rpm  -qa  gpg-pubkey*


gpg-pubkey-3e1ba8d5-558ab6a8

gpg-pubkey-307e3d54-5aaa90a5

gpg-pubkey-3dbdc284-53674dd4

gpg-pubkey-a7317b0f-551deab2

gpg-pubkey-836f4beb-5fc97e5e

gpg-pubkey-39db7c82-5847eb1f

gpg-pubkey-ba07f4fb-5ac168db


  • 藍色部分爲新增進來的 Key



將 zypper refresh 以及加入 gpg key


# zypper --gpg-auto-import-keys  refresh



Retrieving repository 'google-cloud-monitoring' metadata ..............................[done]

Building repository 'google-cloud-monitoring' cache ...................................[done]

Retrieving repository 'Debug Repository' metadata .....................................[done]

Building repository 'Debug Repository' cache ..........................................[done]

Retrieving repository 'Update Repository (Debug)' metadata ............................[done]

Building repository 'Update Repository (Debug)' cache .................................[done]

Retrieving repository 'Non-OSS Repository' metadata ...................................[done]

Building repository 'Non-OSS Repository' cache ........................................[done]

Retrieving repository 'Main Repository' metadata ......................................[done]

Building repository 'Main Repository' cache ...........................................[done]

Retrieving repository 'Source Repository' metadata ....................................[done]

Building repository 'Source Repository' cache .........................................[done]

Retrieving repository 'Main Update Repository' metadata ...............................[done]

Building repository 'Main Update Repository' cache ....................................[done]

Retrieving repository 'Update Repository (Non-Oss)' metadata ..........................[done]

Building repository 'Update Repository (Non-Oss)' cache ...............................[done]

All repositories have been refreshed.




安裝 agent

# zypper  install  stackdriver-agent


Loading repository data...

Reading installed packages...

Resolving package dependencies...


The following 2 NEW packages are going to be installed:

  insserv-compat stackdriver-agent


2 new packages to install.

Overall download size: 1.2 MiB. Already cached: 0 B. After the operation, additional 5.2 MiB

will be used.

Continue? [y/n/v/...? shows all options] (y): y

Retrieving package insserv-compat-0.1-lp152.5.1.noarch  (1/2),  14.9 KiB (  8.5 KiB unpacked)

Retrieving: insserv-compat-0.1-lp152.5.1.noarch.rpm .....................[done (259.7 KiB/s)]

Retrieving package stackdriver-agent-6.1.0-1.sles15.x86_64

                                                        (2/2),   1.2 MiB (  5.2 MiB unpacked)

Retrieving: cde909b8d24e2beabdbd489e42e5bd65c64c14e09b710c56852736aecd3bf3a7-stackdrive[done]


Checking for file conflicts: ..........................................................[done]

(1/2) Installing: insserv-compat-0.1-lp152.5.1.noarch .................................[done]

(2/2) Installing: stackdriver-agent-6.1.0-1.sles15.x86_64 .............................[done]

Additional rpm output:


Note: This output shows SysV services only and does not include native

systemd services. SysV configuration data might be overridden by native

systemd configuration.


If you want to list systemd services use 'systemctl list-unit-files'.

To see services enabled on particular target use

'systemctl list-dependencies [target]'.


stackdriver-agent         0:off  1:off  2:on   3:on   4:on   5:on   6:off



觀察服務狀態

# systemctl status stackdriver-agent


● stackdriver-agent.service - LSB: start and stop Stackdriver Agent

   Loaded: loaded (/etc/init.d/stackdriver-agent; generated; vendor preset: disabled)

   Active: inactive (dead)



重新啟動服務

# systemctl  restart  stackdriver-agent


觀察服務狀態

# systemctl  status  stackdriver-agent


● stackdriver-agent.service - LSB: start and stop Stackdriver Agent

   Loaded: loaded (/etc/init.d/stackdriver-agent; generated; vendor preset: disabled)

   Active: active (running) since Sun 2020-12-27 13:59:30 UTC; 32s ago


觀察如果重開機是否會啟動服務


# systemctl  is-enabled stackdriver-agent


stackdriver-agent.service is not a native service, redirecting to systemd-sysv-install.

Executing: /usr/lib/systemd/systemd-sysv-install is-enabled stackdriver-agent

enabled


回 GCP 觀察相關資訊



  • 這個時候就發現 Memory Utilization / Disk Space Utilization 有相關資訊了


大功告成

~ enjoy it


Reference


Dec 5th, 2020

使用 certbot 取得 Let’s Encrypt 憑證 with openSUSE in Azure 小記2

使用 certbot 取得 Let’s Encrypt 憑證 with openSUSE in Azure 小記2


上次寫使用 certbot 建立 Let’s Encrypt 憑證是 2020/9/15

一般來說是簽發 90 天, 所以最近就有收到 Let's Encrypt certificate expiration notice for domain 通知信件.


今天就是來寫如何手動取得憑證的小記


OS: openSUSE Leap 15.2 in Azure

DNS provider: gandi.net


首先會看到 Let’s Encrypt 官方網頁對套件做法已經改變, 他把他包進 snap 裡面


==== 原有 certbot 方式驗證是否仍可取得憑證 ====


在使用 snap 方式之前, 先來驗證如果是舊有的 certbot 指令是否可以取得 Let’s Encrypt 憑證


可以參考之前的文章



使用 zypper 指令安裝

# zypper  install  python3-certbot


# certbot  certonly  --manual  --preferred-challenges=dns  -d   ines.tw



驗證還是可以取得相關憑證的




==== 使用 snap 方式安裝並驗證可否取得憑證 ====


暫時小結論: 使用 snapd 目前會有 apparmor 問題, 所以暫時我還是使用 python3-certbot 來處理


使用 zypper 指令 新增 repo

# zypper  addrepo  --refresh https://download.opensuse.org/repositories/system:/snappy/openSUSE_Leap_15.2  snappy


Adding repository 'snappy' .............................................................................................[done]

Repository 'snappy' successfully added


URI         : https://download.opensuse.org/repositories/system:/snappy/openSUSE_Leap_15.2

Enabled     : Yes

GPG Check   : Yes

Autorefresh : Yes

Priority    : 99 (default priority)


Repository priorities are without effect. All enabled repositories share the same priority.



匯入  GPG Key

# zypper  --gpg-auto-import-keys  refresh


Retrieving repository 'Debug Repository' metadata ......................................................................[done]

Building repository 'Debug Repository' cache ...........................................................................[done]

Retrieving repository 'Update Repository (Debug)' metadata .............................................................[done]

Building repository 'Update Repository (Debug)' cache ..................................................................[done]

Retrieving repository 'Non-OSS Repository' metadata ....................................................................[done]

Building repository 'Non-OSS Repository' cache .........................................................................[done]

Retrieving repository 'Main Repository' metadata .......................................................................[done]

Building repository 'Main Repository' cache ............................................................................[done]

Retrieving repository 'Source Repository' metadata .....................................................................[done]

Building repository 'Source Repository' cache ..........................................................................[done]

Retrieving repository 'Main Update Repository' metadata ................................................................[done]

Building repository 'Main Update Repository' cache .....................................................................[done]

Retrieving repository 'Update Repository (Non-Oss)' metadata ...........................................................[done]

Building repository 'Update Repository (Non-Oss)' cache ................................................................[done]

Retrieving repository 'snappy' metadata -----------------------------------------------------------------------------------[-]


Automatically importing the following key:


  Repository:       snappy

  Key Name:         system:snappy OBS Project <system:snappy@build.opensuse.org>

  Key Fingerprint:  4F2FA05B 2C6589C3 FD12055E F7C6E425 ED340235

  Key Created:      Sat Oct 31 16:59:39 2020

  Key Expires:      Mon Jan  9 16:59:39 2023

  Rpm Name:         gpg-pubkey-ed340235-5f9d97fb



Retrieving repository 'snappy' metadata ................................................................................[done]

Building repository 'snappy' cache .....................................................................................[done]

All repositories have been refreshed.


Upgrade package cache

# zypper  dup  --from  snappy


Loading repository data...

Reading installed packages...

Computing distribution upgrade...


Nothing to do.


安裝 snapd


# zypper  install  snapd


Loading repository data...

Reading installed packages...

Resolving package dependencies...


The following 3 NEW packages are going to be installed:

  snapd squashfs system-user-daemon


3 new packages to install.

Overall download size: 15.0 MiB. Already cached: 0 B. After the operation, additional 68.0 MiB will be used.

Continue? [y/n/v/...? shows all options] (y):  Y


安裝完之後, 雖然官方文件說 You then need to either reboot, logout/login or source /etc/profile to have /snap/bin added to PATH.


但是我試過, #source  /etc/profile  不一定會把 /snap/bin 加入 $PATH, 還是登出登入比較保險


# systemctl  enable --now  snapd


  • 這一招還不錯, 起動 snapd 的同時, 設定開機啟動, 以往我都是分開兩個指令執行



# snap  install  core


error: cannot perform the following tasks:

- Setup snap "core" (10444) security profiles (cannot setup profiles for snap "core": cannot create host snap-confine apparmor configuration: cannot reload snap-confine apparmor profile: cannot load apparmor profiles: exit status 1

apparmor_parser output:

AppArmor parser error for /var/lib/snapd/apparmor/profiles/snap-confine.core.10444 in /var/lib/snapd/apparmor/profiles/snap-confine.core.10444 at line 2: Could not open 'tunables/global'


  • 安裝失敗, apparmor 有問題


官方文件有提到 Tumbleweed 要額外設定 snapd.apparmor


  • 在 openSUSE Leap 15.2 使用該指令會找不到相關服務, snpad 也不是 openSUSE 的主要做法, 暫時先放棄


===================


暫時來說, 目前會先使用 python3-certbot 做法, 除非哪天只能在 snapd 才能取得再考慮 :)


~ enjoy it



Reference




Nov 29th, 2020

三大雲平台工具容器升級小記 - ansible 2.10.3 與 Azure module

三大雲平台工具容器升級小記 - ansible 2.10.3 與 Azure module


OS: container with openSUSE Leap 15.2



上次升級是 2020/11/14 , 這次會來升級的原因是 


然後也同步紀錄一下目前 Azure CloudShell 上面的 Ansible 資訊

  • Ansible: 2.9.11 / python 2.7

  • 但是目前已經出現 Python 2 is no longer support by the Python core team 訊息了



先整理結果


升級前

OS: openSUSE Leap 15.2

awscli:  aws-cli/2.1.1 Python/3.7.3

gcloud: Google Cloud SDK 318.0.0

azure-cli: 2.14.2

ansible: 2.10.3


升級後

OS: openSUSE Leap 15.2

awscli:  aws-cli/2.1.4 Python/3.7.3

gcloud: Google Cloud SDK 319.0.0

azure-cli: 2.15.1 (目前有 bug)

ansible: 2.10.3


AWS CLI v2 安裝文件


GCP Cloud SDK 版本




這次的做法還是會透過 docker build 指令來進行

  • 我有比較過 docker build 以及使用現有的 docker image 修改後再使用 docker commit 建立的 image 大小還是很有差異的


Dockerfile 的部分我是拿之前 openSUSE Leap 15.2 來修改


修改細節

  • Update time

  • 修改 pip3 安裝 ansible

  • 修改 安裝 ansible azure module 方式, 使用 collection 方式安裝

  • Google SDK 版本還有下載的檔案路徑以及檔案名稱



列出 diff 的結果給大家參考



> diff opensuseLeap152_ansible_202001129_Dockerfile  opensuseLeap151_ansible_20201114_Dockerfile 


6c6

< # update: 20201129

---

> # update: 20201114

12c12

< # Install python3-pip, upgrade pip, ansible, boto, boto3

---

> # Install python3-pip, upgrade pip, ansible[azure], boto, boto3

15c15

<   pip3 install ansible && \

---

>   pip3 install ansible[azure] && \

43d42

< # 2020/11/29 Still have az login issue in Github https://github.com/Azure/azure-cli/issues/13209

49,58d47

< # Install Ansible azure module

< # After ansible 2.10, some module move to ansible collect, change install method

< RUN zypper install -y curl && \ 

<   curl -O https://raw.githubusercontent.com/ansible-collections/azure/dev/requirements-azure.txt && \

<   pip3 install -r requirements-azure.txt && \

<   rm -f requirements-azure.txt && \

<   ansible-galaxy collection install azure.azcollection

75c64

< # Install google cloud SDK 319.0.0

---

> # Install google cloud SDK 318.0.0

77,78c66,67

< RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-319.0.0-linux-x86_64.tar.gz && \

<   tar zxvf google-cloud-sdk-319.0.0-linux-x86_64.tar.gz && \

---

> RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-318.0.0-linux-x86_64.tar.gz && \





Dockerfile 內容如下


 


# openSUSE Leap 15.2 with ansible, azure-cli, aws cli, gcloud

FROM opensuse/leap:15.2


# Author

# MAINTAINER 已經棄用, 之後要使用 LABEL 方式

# update: 20201129

LABEL maintainer="sakana@cycu.org.tw"


# Set LANG for UTF-8 - for Chinese

ENV LANG C.UTF-8


# Install python3-pip, upgrade pip, ansible, boto, boto3

RUN zypper install -y python3-pip && \

  pip3 install --upgrade pip && \

  pip3 install ansible && \

  pip3 install boto boto3


# Install openssh, set ls alias

RUN zypper install -y openssh

RUN echo "alias ls='ls --color=tty'" >> /root/.bashrc


# Install wget, download azure_rm.py, set permission

RUN zypper install -y wget


# azure_rm.py no need to download 

# Starting with Ansible 2.8, Ansible provides an Azure dynamic-inventory plug-in

# https://docs.ansible.com/ansible/latest/plugins/inventory/azure_rm.html

# old azure_rm.py URL https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/azure_rm.py


# Create working directory in /root

RUN mkdir /root/.azure && \

  mkdir /root/.aws && \

  mkdir /root/playbook && \

  mkdir -p /root/.config/gcloud && \

  wget https://raw.githubusercontent.com/sakanamax/LearnAnsible/master/template/ansible.cfg && \

  mv /ansible.cfg /root && \

  wget https://raw.githubusercontent.com/sakanamax/LearnAnsible/master/template/hosts && \

  mv /hosts /root


#### Azure #### 

# Install azure-cli

# 2020/11/29 Still have az login issue in Github https://github.com/Azure/azure-cli/issues/13209

RUN zypper install -y curl && \

  rpm --import https://packages.microsoft.com/keys/microsoft.asc && \

  zypper addrepo --name 'Azure CLI' --check https://packages.microsoft.com/yumrepos/azure-cli azure-cli && \

  zypper install --from azure-cli -y azure-cli


# Install Ansible azure module

# After ansible 2.10, some module move to ansible collect, change install method

RUN zypper install -y curl && \ 

  curl -O https://raw.githubusercontent.com/ansible-collections/azure/dev/requirements-azure.txt && \

  pip3 install -r requirements-azure.txt && \

  rm -f requirements-azure.txt && \

  ansible-galaxy collection install azure.azcollection




#install vim tar gzip jq unzip less bind-utils iputils groff

RUN zypper install -y vim tar gzip jq unzip less bind-utils iputils groff

RUN echo "set encoding=utf8" > /root/.vimrc


#### AWS ####

# Install awscli v1

#RUN pip3 install awscli

#RUN echo "source /usr/bin/aws_bash_completer" >> /root/.bashrc


# Install awscli v2

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \

  unzip awscliv2.zip && \

  /aws/install

RUN echo "complete -C '/usr/local/bin/aws_completer' aws" >> /root/.bashrc


#### GCP ####

# Install google cloud SDK 319.0.0

ENV CLOUDSDK_CORE_DISABLE_PROMPTS 1

RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-319.0.0-linux-x86_64.tar.gz && \

  tar zxvf google-cloud-sdk-319.0.0-linux-x86_64.tar.gz && \

  /google-cloud-sdk/install.sh && \

  echo "if [ -f '/google-cloud-sdk/path.bash.inc' ]; then . '/google-cloud-sdk/path.bash.inc'; fi" >> /root/.bashrc && \

  echo "if [ -f '/google-cloud-sdk/completion.bash.inc' ]; then . '/google-cloud-sdk/completion.bash.inc'; fi" >> /root/.bashrc



使用 docker build 指令建立 image


> docker build  -t  sakana/ansible_opensuse152:20201129  -f  ./opensuseLeap152_ansible_20201129_Dockerfile   .


  • 使用 -f 指定 Dockerfile 名稱

  • 最後是 ” . “ 目前的目錄



測試 container image


> docker  run  -v  ~/.aws:/root/.aws  -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -it  sakana/ansible_opensuse152:20201129  /bin/bash


測試結果 OK, 建立  tag


  • 這邊目前因為 openSUSE Leap 15 使用舊的 azure cli 以及相依性, 所以現在 az 指令會有問題, 已經 update issue 以及花了很多時間調整, 目前還是要等 openSUSE and Azure 看是否會有後續更新

  • 但是 ansible with azure 沒有問題, 所以目前 az 指令可能會暫時透過 Azure cloud shell




觀察資訊

> docker  images


REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE

sakana/ansible_opensuse152   20201129            c69c2e1c6e9e        13 minutes ago      2.09GB

opensuse/leap                15.2                573008f769b5        20 hours ago        106MB

sakana/ansible_opensuse152   latest              9f8d6b777cc9        2 weeks ago         1.82GB





建立 tag 

> docker  tag  c69c2e1c6e9e  sakana/ansible_opensuse152:latest


登入 docker

> docker  login


上傳 image

> docker  push  sakana/ansible_opensuse152:20201129


> docker  push  sakana/ansible_opensuse152:latest


完工, 以後使用就用


> docker  run  -v  ~/.aws:/root/.aws  -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -it  sakana/ansible_opensuse152  /bin/bash



~ enjoy it


Reference:

Nov 14th, 2020

三大雲平台工具容器升級小記 - 使用 openSUSE Leap 15.2 Container

三大雲平台工具容器升級小記 - 使用 openSUSE Leap 15.2 Container


OS: container with openSUSE Leap 15.2



上次升級是 2020/8/2 , 這次會來升級的原因是 

  • 升級 gcloud 版本

  • 升級 azure-cli 版本

  • 升級 aws cli 版本


先整理結果


升級前

OS: openSUSE Leap 15.2

awscli:  aws-cli/2.0.36 Python/3.7.3

gcloud: Google Cloud SDK 303.0.0

azure-cli: 2.9.14.

ansible: 2.9.11


升級後

OS: openSUSE Leap 15.2

awscli:  aws-cli/2.1.1 Python/3.7.3

gcloud: Google Cloud SDK 318.0.0

azure-cli: 2.14.2

ansible: 2.10.3


AWS CLI v2 安裝文件


GCP Cloud SDK 版本




這次的做法還是會透過 docker build 指令來進行

  • 我有比較過 docker build 以及使用現有的 docker image 修改後再使用 docker commit 建立的 image 大小還是很有差異的


Dockerfile 的部分我是拿之前 openSUSE Leap 15.2 來修改


修改細節

  • Update time

  • 修改 pip3 安裝 boto 與 boto3

  • Google SDK 版本還有下載的檔案路徑以及檔案名稱



列出 diff 的結果給大家參考



> diff opensuseLeap152_ansible_20200802_Dockerfile  opensuseLeap151_ansible_20200531_Dockerfile 


6c6

< # update: 20200802

---

> # update: 20201114

12c12

< # Install python3-pip, upgrade pip, ansible[azure], boto

---

> # Install python3-pip, upgrade pip, ansible[azure], boto, boto3

16c16

<   pip3 install boto

---

>   pip3 install boto boto3

64c64

< # Install google cloud SDK 303.0.0

---

> # Install google cloud SDK 318.0.0

66,67c66,67

< RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-303.0.0-linux-x86_64.tar.gz && \

<   tar zxvf google-cloud-sdk-303.0.0-linux-x86_64.tar.gz && \

---

> RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-318.0.0-linux-x86_64.tar.gz && \

>   tar zxvf google-cloud-sdk-318.0.0-linux-x86_64.tar.gz && \










Dockerfile 內容如下

 


# openSUSE Leap 15.2 with ansible, azure-cli, aws cli, gcloud

FROM opensuse/leap:15.2


# Author

# MAINTAINER 已經棄用, 之後要使用 LABEL 方式

# update: 20201114

LABEL maintainer="sakana@cycu.org.tw"


# Set LANG for UTF-8 - for Chinese

ENV LANG C.UTF-8


# Install python3-pip, upgrade pip, ansible[azure], boto, boto3

RUN zypper install -y python3-pip && \

  pip3 install --upgrade pip && \

  pip3 install ansible[azure] && \

  pip3 install boto boto3


# Install openssh, set ls alias

RUN zypper install -y openssh

RUN echo "alias ls='ls --color=tty'" >> /root/.bashrc


# Install wget, download azure_rm.py, set permission

RUN zypper install -y wget


# azure_rm.py no need to download 

# Starting with Ansible 2.8, Ansible provides an Azure dynamic-inventory plug-in

# https://docs.ansible.com/ansible/latest/plugins/inventory/azure_rm.html

# old azure_rm.py URL https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/azure_rm.py


# Create working directory in /root

RUN mkdir /root/.azure && \

  mkdir /root/.aws && \

  mkdir /root/playbook && \

  mkdir -p /root/.config/gcloud && \

  wget https://raw.githubusercontent.com/sakanamax/LearnAnsible/master/template/ansible.cfg && \

  mv /ansible.cfg /root && \

  wget https://raw.githubusercontent.com/sakanamax/LearnAnsible/master/template/hosts && \

  mv /hosts /root


#### Azure #### 

# Install azure-cli

RUN zypper install -y curl && \

  rpm --import https://packages.microsoft.com/keys/microsoft.asc && \

  zypper addrepo --name 'Azure CLI' --check https://packages.microsoft.com/yumrepos/azure-cli azure-cli && \

  zypper install --from azure-cli -y azure-cli


#install vim tar gzip jq unzip less bind-utils iputils groff

RUN zypper install -y vim tar gzip jq unzip less bind-utils iputils groff

RUN echo "set encoding=utf8" > /root/.vimrc


#### AWS ####

# Install awscli v1

#RUN pip3 install awscli

#RUN echo "source /usr/bin/aws_bash_completer" >> /root/.bashrc


# Install awscli v2

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \

  unzip awscliv2.zip && \

  /aws/install

RUN echo "complete -C '/usr/local/bin/aws_completer' aws" >> /root/.bashrc


#### GCP ####

# Install google cloud SDK 318.0.0

ENV CLOUDSDK_CORE_DISABLE_PROMPTS 1

RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-318.0.0-linux-x86_64.tar.gz && \

  tar zxvf google-cloud-sdk-318.0.0-linux-x86_64.tar.gz && \

  /google-cloud-sdk/install.sh && \

  echo "if [ -f '/google-cloud-sdk/path.bash.inc' ]; then . '/google-cloud-sdk/path.bash.inc'; fi" >> /root/.bashrc && \

  echo "if [ -f '/google-cloud-sdk/completion.bash.inc' ]; then . '/google-cloud-sdk/completion.bash.inc'; fi" >> /root/.bashrc



 

使用 docker build 指令建立 image


> docker build  -t  sakana/ansible_opensuse152:20201114  -f  ./opensuseLeap152_ansible_20201114_Dockerfile   .


  • 使用 -f 指定 Dockerfile 名稱

  • 最後是 ” . “ 目前的目錄



測試 container image


> docker  run  -v  ~/.aws:/root/.aws  -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -it  sakana/ansible_opensuse152:20201114  /bin/bash


測試結果 OK, 建立  tag


觀察資訊

> docker  images


REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE

sakana/ansible_opensuse152   20201114            9f8d6b777cc9        10 minutes ago      1.82GB

opensuse/leap                15.2                da63484e1af5        4 days ago          106MB

sakana/ansible_opensuse152   latest              d1bb9da2d2e1        3 months ago        1.66GB



建立 tag 

> docker  tag  9f8d6b777cc  sakana/ansible_opensuse152:latest


登入 docker

> docker  login


上傳 image

> docker  push  sakana/ansible_opensuse152:20201114


> docker  push  sakana/ansible_opensuse152:latest


完工, 以後使用就用


> docker  run  -v  ~/.aws:/root/.aws  -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -it  sakana/ansible_opensuse152  /bin/bash



~ enjoy it


Reference:

Oct 24th, 2020

AWS 流程日誌發佈至CloudWatch with AWS CLI 小記

 AWS 流程日誌發佈至CloudWatch with AWS CLI 小記


OS: container with openSUSE Leap 15.2



上次流程日誌啟用是使用 Console 的方式



今天要來寫 透過 AWS CLI 啟用流程日誌

  • 建立方式使用 AWS CLI 方式

  • 發佈至 CloudWatch




==== 建立IAM Role ====


參考官方文件

  • https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html 


建立檔案  Trust-Policy-VPC-flow-logs.json

內容如下


{

  "Version": "2012-10-17",

  "Statement": [

    {

      "Sid": "",

      "Effect": "Allow",

      "Principal": {

        "Service": "vpc-flow-logs.amazonaws.com"

      },

      "Action": "sts:AssumeRole"

    }

  ]

}


使用 AWS CLI 建立  IAM Role


# aws  iam  create-role  --role-name  VPC-Flow-Log  --assume-role-policy-document  file://Trust-Policy-VPC-flow-logs.json


  • file:// 後面要注意是否有對應到 Trust-Policy-VPC-flow-logs.json 所在路徑



==== 建立IAM Policy ===== 


參考官方文件

  • https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html



建立檔案 VPC-Flow-Log-Policy.json

內容如下


{

  "Version": "2012-10-17",

  "Statement": [

    {

      "Action": [

        "logs:CreateLogGroup",

        "logs:CreateLogStream",

        "logs:PutLogEvents",

        "logs:DescribeLogGroups",

        "logs:DescribeLogStreams"

      ],

      "Effect": "Allow",

      "Resource": "*"

    }

  ]

}   


使用 AWS CLI 建立  IAM Policy


# aws  iam  create-policy  --policy-name  VPC-Flow-Log-Policy  --policy-document  file://VPC-Flow-Log-Policy.json




==== 關聯 Policy 到 Role上 ====

  • 參考官方文件 https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html


# aws  iam  attach-role-policy  --policy-arn  arn:aws:iam::111111111111:policy/VPC-Flow-Log-Policy  --role-name   VPC-Flow-Log


  • policy arn 部分請換成自己的 ID

  • Role-name 對應剛剛建立的 Role




==== 切換到VPC所在的region ====


參考官方文件


可以用指令先觀察目前所設定的 Region


# aws  configure  list

或是

# aws  configure  get  region


設定 Region

# aws  configure  set  region  us-east-2


  • 也可以去觀察 ~/.aws/config



==== 建立 Log Group ====


建立 Log Group


# aws  logs  create-log-group  --log-group-name  flow-log-groups



==== 建立 VPC Flow log ====


建立VPC Flow log



# aws  ec2  create-flow-logs  --resource-type  VPC  --resource-ids  vpc-c11111ac  --traffic-type  ALL  --log-destination-type  cloud-watch-logs   --log-group-name  flow-log-groups  --deliver-logs-permission-arn  arn:aws:iam::111111111111:role/VPC-Flow-Log



  • resource-ids 請換成自己的ID

  • deliver-logs-permission-arn 請換成自己的 ARN


這樣就建立完成


驗證的方式可以參考上一篇的 blog




這樣算是又向 AWS 前進一步


~ enjoy it





Reference:



使用 certbot 申請 SSL 憑證 with openSUSE in Azure 小記

使用 certbot 申請 SSL 憑證 with openSUSE in Azure 小記


OS: openSUSE Leap 15.2 in Azure

Nginx: 1.16.1

DNS provider: gandi.net


今天來測試使用 certbot 這個 ACME 客戶端來進行 Let’s Encrypt 憑證的申請.


Let’s Encrypt  官網入門網頁


參考 Certbot 網頁上, openSUSE leap 15 與 nginx 的文件




先來安裝 certbot 套件


使用 zypper 指令安裝

# zypper  install  python3-certbot


  • 這邊我是指定 python3-certbot, 因為如果是裝 certbot 會裝到 python2 的版本, 希望 certbot 用 python3 就要進行指定


因爲今天是要透過 certbot 來申請 SSL 憑證, 所以會執行 certonly 方式來執行



# certbot  certonly  --manual  --preferred-challenges=dns  -d   ines.tw


Saving debug log to /var/log/letsencrypt/letsencrypt.log

Plugins selected: Authenticator manual, Installer None

Enter email address (used for urgent renewal and security notices)

 (Enter 'c' to cancel):  sakana@study-area.org ( 聯絡信件 )


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Please read the Terms of Service at

https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must

agree in order to register with the ACME server at

https://acme-v02.api.letsencrypt.org/directory

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(A)gree/(C)ancel: A (同意協議)


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Would you be willing to share your email address with the Electronic Frontier

Foundation, a founding partner of the Let's Encrypt project and the non-profit

organization that develops Certbot? We'd like to send you email about our work

encrypting the web, EFF news, campaigns, and ways to support digital freedom.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: Y (同意分享 email, 這個看個人)

Obtaining a new certificate

Performing the following challenges:

dns-01 challenge for ines.tw


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

NOTE: The IP of this machine will be publicly logged as having requested this

certificate. If you're running certbot in manual mode on a machine that is not

your server, please ensure you're okay with that.


Are you OK with your IP being logged?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: Y (同意 IP 被記錄, 一樣看個人)


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Please deploy a DNS TXT record under the name

_acme-challenge.ines.tw with the following value:


gVIVkBS2LLHzu1HSqOTUwE3LOddA3jhtAgPkDL1wosw


Before continuing, verify the record is deployed 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Press Enter to Continue (按下 Enter 之前, 要確認 DNS 供應商那邊已經設定 TXT 紀錄, value 是上面紫色的內容)

Waiting for verification...

Cleaning up challenges


IMPORTANT NOTES:

 - Congratulations! Your certificate and chain have been saved at:

   /etc/letsencrypt/live/ines.tw/fullchain.pem

   Your key file has been saved at:

   /etc/letsencrypt/live/ines.tw/privkey.pem

   Your cert will expire on 2020-12-06. To obtain a new or tweaked

   version of this certificate in the future, simply run certbot

   again. To non-interactively renew *all* of your certificates, run

   "certbot renew"

 - Your account credentials have been saved in your Certbot

   configuration directory at /etc/letsencrypt. You should make a

   secure backup of this folder now. This configuration directory will

   also contain certificates and private keys obtained by Certbot so

   making regular backups of this folder is ideal.

 - If you like Certbot, please consider supporting our work by:


   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                    https://eff.org/donate-le


  • certonly 只申請憑證

  • --manual  手動方式

  • --preferred-challenges=dns 

    • 使用 DNS 進行驗證 

  • -d   ines.tw

    • 要申請的網域名稱

  • 相關憑證會存放在 /etc/letsencrypt/live/你的網域下

  • 一次簽發 90 天


觀察相關資訊


# ls  -lh  /etc/letsencrypt/live/ines.tw/


total 4.0K


-rw-r--r-- 1 root root 692 Sep  7 15:01 README

lrwxrwxrwx 1 root root  31 Sep  7 15:01 cert.pem -> ../../archive/ines.tw/cert1.pem

lrwxrwxrwx 1 root root  32 Sep  7 15:01 chain.pem -> ../../archive/ines.tw/chain1.pem

lrwxrwxrwx 1 root root  36 Sep  7 15:01 fullchain.pem -> ../../archive/ines.tw/fullchain1.pem

lrwxrwxrwx 1 root root  34 Sep  7 15:01 privkey.pem -> ../../archive/ines.tw/privkey1.pem


主要有 4 個檔案


cert.pem: 申請的網域的SSL憑證 (Your domain's certificate)

  • 可以對應到之前sslforfree的 certificate.crt - 公鑰


chain.pem: Let's Encrypt 的 鏈證書 (The Let's Encrypt chain certificate)

  • 可以對應到之前sslforfree的ca_bundle.crt - 中繼憑證

 

fullchain.pem: 公鑰與中繼憑證合併 (cert.pem and chain.pem combined)

  • Nginx 如果要設定 ssl, 就會使用這個檔案 


privkey.pem: SSL憑證的私鑰 (Your certificate's private key)

  • 可以對應到之前sslforfree的private.key - 私鑰


這樣就算申請完畢, 但是要如何知道目前申請了那些憑證呢?

可以使用下列指令列出相關資訊


# certbot  certificates


Saving debug log to /var/log/letsencrypt/letsencrypt.log


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Found the following certs:

  Certificate Name: ines.tw

    Serial Number: 4c5679bc25190a70e2e9072885094771114

    Domains: ines.tw

    Expiry Date: 2020-12-06 14:01:32+00:00 (VALID: 89 days)

    Certificate Path: /etc/letsencrypt/live/ines.tw/fullchain.pem

    Private Key Path: /etc/letsencrypt/live/ines.tw/privkey.pem

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


接下來思考, 如果要加入其他的 FQDN或是想要加入 *.ines.tw 呢?


加入 *.ines.tw


# certbot  certonly  --manual  --preferred-challenges=dns --cert-name  ines.tw  -d ines.tw,*.ines.tw


Saving debug log to /var/log/letsencrypt/letsencrypt.log

Plugins selected: Authenticator manual, Installer None


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

You are updating certificate ines.tw to include new domain(s):

+ *.ines.tw


You are also removing previously included domain(s):

(None)


Did you intend to make this change?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(U)pdate cert/(C)ancel: U

Renewing an existing certificate

Performing the following challenges:

dns-01 challenge for ines.tw


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

NOTE: The IP of this machine will be publicly logged as having requested this

certificate. If you're running certbot in manual mode on a machine that is not

your server, please ensure you're okay with that.


Are you OK with your IP being logged?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: Y


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Please deploy a DNS TXT record under the name

_acme-challenge.ines.tw with the following value:


AFatx1Qx8ylhYIPmnSFIAFktRQ00GI7SbzUtHqTADJc


Before continuing, verify the record is deployed.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Press Enter to Continue  (按下 Enter 之前, 要確認 DNS 供應商那邊已經設定 TXT 紀錄, value 是上面紫色的內容)

Waiting for verification...

Cleaning up challenges


IMPORTANT NOTES:

 - Congratulations! Your certificate and chain have been saved at:

   /etc/letsencrypt/live/ines.tw/fullchain.pem

   Your key file has been saved at:

   /etc/letsencrypt/live/ines.tw/privkey.pem

   Your cert will expire on 2020-12-06. To obtain a new or tweaked

   version of this certificate in the future, simply run certbot

   again. To non-interactively renew *all* of your certificates, run

   "certbot renew"

 - If you like Certbot, please consider supporting our work by:


   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                    https://eff.org/donate-le


觀察憑證資訊


# certbot  certificates


Saving debug log to /var/log/letsencrypt/letsencrypt.log


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Found the following certs:

  Certificate Name: ines.tw

    Serial Number: 4d2c4a18b7d8f375fca8d127cefc677e152

    Domains: ines.tw *.ines.tw

    Expiry Date: 2020-12-06 14:21:22+00:00 (VALID: 89 days)

    Certificate Path: /etc/letsencrypt/live/ines.tw/fullchain.pem

    Private Key Path: /etc/letsencrypt/live/ines.tw/privkey.pem

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



Lab2 : 驗證 SSL 憑證


那如果驗證真的有效呢?

我使用 nginx 來驗證, 先設定好預設網頁

可以參考 http://sakananote2.blogspot.com/2020/02/nginx-with-opensuse-leap-151-in-azure.html 


為了管理方便我在 /etc/nginx 目錄下建立一個 ssl  目錄

# mkdir  /etc/nginx/ssl


將之前產出的憑證複製到資料夾


# cp  /etc/letsencrypt/live/ines.tw/fullchain.pem  /etc/nginx/ssl/

# cp  /etc/letsencrypt/live/ines.tw/privkey.pem  /etc/nginx/ssl/


修改 nginx 設定檔

# vim  /etc/nginx/nginx.conf


worker_processes  1;

events {

    worker_connections  1024;

    use epoll;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    include conf.d/*.conf;

    server {

        listen       80;

        listen       443 ssl;

        server_name  ines.tw;

ssl_certificate /etc/nginx/ssl/fullchain.pem;

ssl_certificate_key /etc/nginx/ssl/privkey.pem;

        location / {

            root   /srv/www/htdocs/;

            index  index.html index.htm;

        }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   /srv/www/htdocs/;

        }

    }

    

    include vhosts.d/*.conf;

}



  • 加入上面紅色部分


將 nginx 服務 reload


# systemctl   reload   nginx


因為是走 HTTPS, 所以記得要開 port 443 


在 Azure 該 VM 的網路設定內, 點選 新增輸入連接埠規則,設定 port 443 可以連線


開啟瀏覽器, 輸入 https://YOUR_DOMAIN

就可以看到可愛的鎖頭符號了



又前進一步了 :)



Reference:





Aug 16th, 2020

GCP 平臺建立 Managed instance groups 與 Load balancing 小記

GCP 平臺建立 Managed instance groups 與 Load balancing 小記


今天來整理 GCP 上面使用 Managed instance group 與 Load balancing 的一些操作與想法


情境如下



使用者透過 Load balancer IP 來進行存取, 後端連接 Managed instance group 來提供服務


==== 準備服務主機 ====


先使用 gcloud 指令建立 openSUSE Leap GCE

使用 Portal 上面的 SSH 登入主機

  • 使用 zypper 指令安裝 apache2, 啟用並設定開機啟動 

    • # zypper  install apache2

    • # systemctl start  apache2

    • # systemctl enable apache2


參考網路上網頁顯示主機名稱或是 URL 的方式


將相關網頁存成 /srv/www/htdocs/index.html

網頁呈現如下



  • 這個方法目前沒有很好, 因為在後續 LB 測試的時候只會顯示 LB 的 IP, 後面再找其他的方式來顯示後端主機的 hostname or IP


將主機關機, 等等建立為映像檔


==== 建立主機映像檔 ====


點選 Compute Engine -- > Images -- > CREATE IMAGE



輸入名稱 / 選取 Source disk / 選取 Location ( 我這邊選 Taiwan )

點選 Create 建立



觀察資訊



==== 建立 Instance templates  ====


點選 Compute Engine -- > 點選 Instance templates

點選 Create Instance template



輸入 名稱 / 選取機器的規格



點選 Boot disk 的 change



點選 Custom images

點選 剛剛建立的 image

點選 Select



可以觀察到剛剛的 image 已經被選取

是專案狀況看看要不要調整 networking 或是 security

點選 Create



  • 這邊要注意, 如果 firewall 是採取 tag 的方式, 記得按照需求加上 network tag

  • 也要注意 VPC 的選定是否正確


觀察資訊



==== 建立 Health check  ====


點選 Compute Engine -- > 點選 Health checks

點選 CREATE A HEALTH CHECK



輸入 名稱 -- > 選取 Scope / Protocol 與 port

輸入 檢查區間

點選 CREATE



  • Check Interval 按照實際需求來調整, 但是最好是超過 10 秒以上, 不然後面建立 Instance group 也會被警告

  • Unhealthy threshod 最好也是超過 3 次, 不然也會被警告


觀察相關資訊



==== 建立 Managed instance Group 與設定 Auto scaling  ====


點選 Compute Engine -- > 點選 Instance groups

點選 Create instance group



點選 New managed instance group

輸入 名稱 -- > 選取 Location

選取 剛剛建立的 Instance template


這邊按照需求選取 Auto scaling 的條件, 預設是 CPU 使用率超過 60%

設定 最少最大的 instance 數量

選取 Health check 方式 (使用剛剛建立的 Health check )

點選 Create


觀察相關資訊

Instance groups:


VM instances:



如果有遇到 Health check 沒過的問題


  • 官方文件有提到要針對 130.211.0.0/22 與 35.191.0.0/16 要設定防火牆規則允許通過

    • https://cloud.google.com/load-balancing/docs/https/ext-http-lb-simple

    • 我是設定 Target 針對所有 instance, 然後 130.211.0.0/22 與 35.191.0.0/16 的 TCP port 80 allow, 比較嚴謹的方式當然也可以下 tag 來處理, 但是還要個別打上 tag, 然後 130.211.0.0/22 與 35.191.0.0/16 又是 google 宣告的網段, 所以就先這樣處理


Firewall 的規劃可能考量

  • 參考 https://cloud.google.com/load-balancing/docs/https

  • Load Balancer + Instance Group內的GCE 都允許 port 80 存取

    • 設定 130.211.0.0/22 與 35.191.0.0/16 可以存取 tcp port 80

    • 使用 tag 方式, 設定 0.0.0.0/0 可以存取 tcp port 80, 在 instance group template 內加入該 tag

    • 效果

      • 存取 LB IP -- > Pass

      • 存取 後端 Instance Group 產生的 GCE IP -- > Pass

  • 只允許 Load Balancer 轉發 port 80 到 Instance Group 內的 GCE 

    • 設定 130.211.0.0/22 與 35.191.0.0/16 可以存取 tcp port 80

    • 效果: 不希望使用者直接打後端的 node, 避免程式寫死存取某一個 node IP, 只允許存取 Load Balancer 的 IP

      • 存取 LB IP -- > Pass

      • 存取 後端 Instance Group 產生的 GCE IP -- > ERR_CONNECTION_TIMED_OUT


對於 Source IP 說明的截圖 


==== 建立 Load balancing ====


點選 Network services 點選 Load balancing

點選 Create load balancer



點選 HTTP(S) Load Balancing 的 Start configuration

  • 這邊就以實際的狀況來選取



選取外部還是內部的 Load Balancer

點選 Continue


輸入名稱

點選 Backend configuration

下拉選單, 點選 Backend services -- > 點選 Create a backend service



輸入 名稱

New Backend:

選取 剛剛建立 Instance Group

輸入要連接的 port

設定 Balancing mode

點選 Done


  • Backend service 有個 Named port 就是從外部接入的 port 是那一個, 然後 instance group 可以設定 Named port 連接進來後, 要到 instance group 內的機器的對應 port


會觀察到剛剛建立的 Backend 顯示到資訊內

選取 剛剛建立的 Health Check

點選 Create 




點選 Fronted configuration

輸入名稱 / Protocol / Port

點選 Done



觀察資訊

確認 Frontend 已經被建立

點選 Create



觀察資訊



點選剛剛建立的 Load balancer

觀察 LB 的 IP



觀察是否可以存取



最後來聊聊 Load balancing 的組成

這個也是剛接觸最讓我迷惑的部分 :p


Load balancing 組成分為 4 個部分

  • Forwarding rule

    • 如果是透過 portal 設定, 是在 Frontend configuration 被設定, 但是沒有在界面提到這個關鍵字

  • Target HTTP proxy

    • 如果是透過 portal 設定, 是在 Frontend configuration 被設定, 但是沒有在界面提到這個關鍵字

  • URL map

    • 如果是透過 portal 設定, 大部分在建立 Backend Service 的時候就被設定預設,但是沒有在界面提到這個關鍵字

  • Backend Service

    • 非常清楚


如果不是使用 gcloud 指令建立 Load balancer 而是使用 portal 建立的話

會看到 Load balancing 介面預設顯示爲

  • Load balancers

    • 這邊想法上會認為是主體, 這個部分不會有問題

  • Backends

    • 這邊是後端服務, 這個部分不會有問題

  • Frontends

    • 這邊比較會產生困惑, 因為可以看到上面顯示的是 Forwarding rule name



點選 Load balancing 的 advanced menu, 觀察界面

  • Forwarding rules

  • Target proxies

  • Backend services

  • Backend buckets

  • Certificates

  • Target pools



  • Advanced menu 可以觀察 Forwarding rules 與 Target proxies ( Frontend ), Backend 被拆分成 Backend services 與 Backend buckets

  • 可以從剛剛建立的 test20200815-front 觀察

    • Forwarding rule: test20200815-front 有 IP address, 然後指向 test20200815-lb-target-proxy

    • Target Proxy 會對應到 URL map ( 某一個 LB 主體內的 Host and Path )

    • URL map ( LB 主體內的 Host and Path ) 會指定 Backend

    • 指定的 Backend 會對應到後端的服務


如果是透過 gcloud 指令建立, 就比較清楚, 分別爲

  • # gcloud compute health-check create

  • # gcloud compute backend-services create

  • # gcloud compute backend-service add-backend

  • # gcloud compute url-maps create

  • # gcloud compute target-proxies create

  • # gcloud compute forwarding-rule create


今天也算是好好整理之前想整理的部分了


~ enjoy it



Reference:


openSUSE Leap 15.2 安裝小記

openSUSE Leap 15.2 安裝小記


openSUSE Leap 15.1 Lifetime 到 2020/11 


三個月前才認命的動手安裝 openSUSE Leap 15.2


安裝前處理

  • 使用 imagewriter 建立 openSUSE 安裝USB

  • 整理 /home/sakana 目錄

    • 使用 du -h --max-depth=1 /home/sakana 檢查

    • 清掉不要的檔案, 特別是 ~/.cache , ~/.config 內兩大瀏覽器內有站很大空間的 cache

    • 因為有很多相關的 config 在個人家目錄內, 所以先把舊的 openSUSE Leap 15.1 的 /home 目錄, 使用# tar    cvf   home.tar  /home 進行打包到隨身碟 ( 不要使用 .gz 方式, 會比較快速 )

    • 新機器再使用 tar 指令還原回來


這次也是使用 USB 來進行安裝,  


== 安裝過程小記==


這次建立的時候我還是選擇 GNOME 桌面


磁碟區分割的部分, 使用引導的方式安裝, 因為一直出線開機分割區的警告, 所以我就用引導式

  • 刪除所有分割區

  • 建立獨立分割區 XFS

  • 根目錄取消 Btrfs 快照


===============


Network Manager:


openSUSE Leap 15.2 預設為 Network Manager



Google Chrome:84.0

https://www.google.com/intl/zh-TW/chrome/browser/ 


還是會有驗證性問題, 但是功能沒有差異

為了進行google 登入,先使用 Google 驗證App,  後面來處理yubikey


home 資料回覆:


因為有很多相關的 config 在個人家目錄內, 所以先把舊的 openSUSE Leap 15.0 的 /home 目錄, 使用# tar    cvf   home.tar  /home 進行打包到隨身碟 ( 不要使用 .gz 方式, 會比較快速 )

新機器再使用 tar 指令還原回來


Notes

  • Ifconfig 預設沒有安裝, 要使用 ip  address show


關閉GNOME裡面的搜尋功能預設關閉 (點選右上角的設定按鈕), 因為我覺得用不到



中文輸入法問題:


在系統內新增中文輸入法, 目前使用 ibus

  • system_key( windows ) + 空白鍵 切換輸入法



取消 USB 為安裝來源

# yast2  repositories 



Freemind:

使用one click install 安裝 http://software.opensuse.org/package/freemind 

我是使用 editors 那個來源的 ymp 檔案安裝


.mm 的檔案指定用 freemind  開啟



新增 Packman 套件庫:


使用 #yast2  repositories 加入社群版本的Packman 


#yast2  repositories


Firefox Sync:

登入 Firefox Sync, 會處理之前有下載的 Plugin

例如 https://addons.mozilla.org/zh-TW/firefox/addon/video-downloadhelper/ 



flash-player:

# zypper   install   flash-player


Telegram desktop:



播放器:


# zypper  install   vlc vlc-codecs


  • Mp4 codec 應該是要安裝 vlc-codecs,  需要 Packman  套件庫

  • 過程會安裝 ffmpeg-3


並將 .rmvb 以及 .mp4 預設播放器設定為  VLC


安裝  ffmpeg ( 會把提供者從 openSUSE 換成 Packman )

# zypper  install   ffmpeg-3


這樣的好處是使用 youtube-dl  可以轉換  mp3 格式


參考之前的文章 http://sakananote2.blogspot.tw/2014/06/opensuse-131.html 


透過 youtube-dl  -F 來觀察可以下載的格式


# zypper  install youtube-dl


> youtube-dl  -F  http://www.youtube.com/watch?v=13eLHrDcb1k

[youtube] Setting language

[youtube] 13eLHrDcb1k: Downloading video webpage

[youtube] 13eLHrDcb1k: Downloading video info webpage

[youtube] 13eLHrDcb1k: Extracting video information

Available formats:

22 : mp4 [720x1280]

18 : mp4 [360x640]

43 : webm [360x640]

5 : flv [240x400]

17 : mp4 [144x176]


指定要下載的格式進行下載 (請注意 -f 是小寫)


> youtube-dl  -f  22  http://www.youtube.com/watch?v=13eLHrDcb1k


下載為 mp3

首先要安裝 ffmpeg 套件


>youtube-dl    http://www.youtube.com/watch?v=13eLHrDcb1k --extract-audio --audio-format mp3



Skype:

目前的版本是 8.51.0.72 的版本


https://www.skype.com/zh-Hant/download-skype/skype-for-linux/downloading/?type=weblinux-rpm


下載 RPM 版本用軟體安裝就裝好了 :)


使用 #yast2 sound 調整音效



GNOME Extension:


參考調校小記


主要是裝 chrome 內的 GNOME Shell integration


然後到 https://extensions.gnome.org/

選想裝的 Extension, 調爲 on 就好

裝了

  • TopIcons Plus 

  • NetSpeed


可以用下列指令觀察

> gnome-tweak-tool


不過我覺得從  https://extensions.gnome.org/ 最快


.7z 支援:

# zypper  install  p7zip


imagewriter:

# zypper  install  imagewriter

用來製作開機 USB


rdesktop 安裝與測試:

#zypper  install  freerdp


執行方式

#xfreerdp  -g  1280x1024  -u administrator  HOST_IP


修改 LS_OPTIONS 變數

# vi   /etc/profile.d/ls.bash

把 root 的 LS_OPTIONS 的 -A 移除


修改 HISTSIZE 變數

# vi   /etc/profile

修改 HISTSIZE 的筆數



Yubico Key:

如果 linux 沒有抓到 Yubico 的 U2F Key可以使用以下步驟

讓 linux 支援 Yubico , 我是參考 https://www.yubico.com/faq/enable-u2f-linux/  

作法

https://raw.githubusercontent.com/Yubico/libu2f-host/master/70-u2f.rules  另存新檔

存到 /etc/udev/rules.d/70-u2f.rules

將 linux 重開機, 接下來就可以使用了 :-)


ansible 安裝:


目前版本 2.9.6

#zypper  install  ansible


Docker 安裝:


目前版本 19.03.11

#zypper  install  docker


將使用者 sakana  加入 docker  群組 

# usermod -a -G docker sakana

#systemctl  start  docker

#systemctl  enable   docker


Dropbox 103.4.383版 :


openSUSE Leap 15.2 預設不支援 dropbox

參考官方網站上面斷頭的安裝方式來安裝


> cd  ~  && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -


接下來,請從新建立的 .dropbox-dist 資料夾執行 Dropbox 精靈。


> ~/.dropbox-dist/dropboxd


順便安裝 Nautilus 相關套件

# zypper  install  nautilus-extension-dropbox



變更主機名稱:


#yast2 lan



Filezilla 安裝:


#zypper  install  filezilla



smartgit 安裝:

參考 http://sakananote2.blogspot.tw/2016/01/opensuse-leap421-smartgit.html


下載 smartgit-linux-20_1_4.tar.gz

http://www.syntevo.com/smartgit/download 


解壓縮到 /opt

# tar  zxvf   smartgit-linux-*.tar.gz  -C   /opt/


建立 link 讓一般使用者也能使用

# ln  -s   /opt/smartgit/bin/smartgit.sh   /usr/local/bin/smartgit


安裝 git

# zypper  install  git


建立 個人的 ssh key ( 這次沒有作, 因為將舊的 /home 還原回來 )

> ssh-keygen  -t  dsa


將 ssh 的公鑰 id_dsa.pub 新增到 Github 的 Settings -- >  SSH and GPG Keys  ( 這次沒有作, 因為將舊的 /home 還原回來 )


接下來就是以一般使用者的身份執行 smartgit 指令

> smartgit


這次沒有發生 一般使用者發生找不到 jre 路徑


解法, 目前是在 ~/.smartgit/smartgit.vmoptions 檔案內

將 jre 指向 /opt/smartgit/jre


> cat   ~/.smartgit/smartgit.vmoptions 

jre=/opt/smartgit/jre


按照上面的參考設定


# zypper  install  alacarte

設定 smart git icon 使用 alacarte


> alacarte

在設定好之後如果發現無法直接開啟資料夾 ( 資料夾上面按右鍵 -- > Open )

Edit -- > Preferences --> 點選  Tools -- > 點選 Re-Add Defaults 得到解決

2016-11-24 15-48-28 的螢幕擷圖.png




Azure-cli 安裝:


版本: 2.10.1

參考 http://sakananote2.blogspot.com/2018/07/kubernetes-in-azure-with-opensuse-leap.html


匯入 rpm key

# rpm --import   https://packages.microsoft.com/keys/microsoft.asc


新增 Azure CLI 的 repo

# zypper  addrepo --name 'Azure CLI' --check https://packages.microsoft.com/yumrepos/azure-cli azure-cli


安裝 azure-cli 套件

# zypper  install --from azure-cli  -y  azure-cli


使用互動的方式登入 azure ( 現在已經不需要輸入機器碼, 直接驗證帳號就可以  )

> az  login


AWS Cli 安裝:


版本: 2.0.39



# curl  "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"  -o  "awscliv2.zip"


# unzip  awscliv2.zip


# ./aws/install


# aws --version


aws-cli/2.0.39 Python/3.7.3 Linux/5.3.18-lp152.19-default exe/x86_64.opensuse-leap.15


將補齊的指令 寫到或是修改到個人家目錄的 .bashrc 內

  • echo "complete -C '/usr/local/bin/aws_completer' aws" >> /root/.bashrc



Google Cloud SDK ( gcloud )安裝:


參考 http://sakananote2.blogspot.com/2019/04/gsutil-google-cloud-storage-in-opensuse.html

安裝 gcloud

  • 但是目前實務上是使用容器的方式來執行


使用一般使用者安裝

> wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-305.0.0-linux-x86_64.tar.gz 


> tar  zxvf  google-cloud-sdk-305.0.0-linux-x86_64.tar.gz


> ./google-cloud-sdk/install.sh



Visual Studio Core 相關 :


參考 http://sakananote2.blogspot.com/2019/01/visual-studio-code-with-opensuse-leap-15.html


安裝 vscode


# rpm  --import   https://packages.microsoft.com/keys/microsoft.asc


# sh  -c  ' echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ntype=rpm-md\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc"  >  /etc/zypp/repos.d/vscode.repo '


# zypper  refresh


# zypper  install  code


安裝 vscode extension ( 這次沒有作, 因為將舊的 /home 還原回來 )

  • AWS Toolkit for Visual Studio Code

  • Bracket Pair Colorizer

  • Code Time

  • Git Graph

  • GitHub Pull Requests

  • GitLens

  • Kubernetes

  • Python

  • REST Client

  • GitHub Pull Requests and Issues



PPSSPP 安裝:


#zypper  install ppsspp




這個版本沒有安裝的, 以後要安裝就看之前的筆記



這樣又可以再戰一年 :p


~ enjoy it


參考


 




使用 tcpdump 確認 custom header 小記

使用 tcpdump 確認 custom header 小記



工作上面, 因為業務需求, 可能會在 CDN 設定上加入自訂的 header

但是要如何證明這個 custom header 真的有生效呢?


可能的做法

  • Origin Server 將 header 記錄到 log 內

  • 在後端的 Origin Server 使用 tcpdump 觀察封包


本次的做法就是在 Origin Server 上面使用 tcpdump 方式觀察

參考網路上的做法


# tcpdump -n -v dst host 192.168.1.64 and tcp dst port 80 and 'tcp[tcpflags] & (tcp-push) !=0'


  • -n 不使用名稱解析, 用 IP 表示

  • -v 顯示詳細訊息, 也有看到其他人用 -vvvs 1600 來顯示更多的訊息

  • dst host 目的主機 192.168.1.64, 這個部分請換成 Origin Server 的 IP, 或是調整為自己的條件

  • tcp dst port 80 針對目的 port 80

  • 'tcp[tcpflags] & (tcp-push) !=0'

    • 針對符合 TCP Flag 為 push, 前後要加上單引號


這樣就可以觀察 CDN 設定的 custom header 有沒有生效


~ enjoy it



Reference