昨天我們成功連接到新建的VM,那麽今天,我們就嘗試在VM上面進行Docker的安裝及部署吧!
當我們安裝Docker的時候,可以參考Docker的官方文檔,去進行安裝。而我們要做的,就是利用Ansible去把文檔中的步驟轉化為Ansible的操作指令。
依照官方的文檔,我們進行安裝的的第一步,要先運行以下指令安裝相關的套件。
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
整理一下,這一步我們需要安裝4個不同的套件(分別為ca-certificates
、curl
、gnupg
及lsb-release
,而每個套件都是使用apt-get install
進行安裝。
因此,我們可以在Ansible中寫入一個安裝的步驟,然後把需要的套件放到一個陣列中,再以迴圈的方式進行每一個套件的安裝。
先建立一個vars.yml
去儲存我們想進行安裝的內容,然後再其中加入以下內容。
docker_dependencies:
- ca-certificates
- curl
- gnupg
- lsb-release
- python
- python3-docker
由於Ansible在VM上需要使用python3-docker
,所以這一步亦加上了相關的套件
然後,再到main.yml
中,在tasks:
上一行,加入以下內容去引用vars.yml
檔案。
vars_files:
- vars.yml
然後再加入一個新的Task。
- name: Install dependencies
apt:
name: "{{ item }}"
state: latest
update_cache: true
loop: "{{ docker_dependencies }}"
注意縮排要對齊上一個Test Server Connection
的Task。
然後運行昨天的ansible-playbook
指令。
ansible-playbook -i "{VM_EXTERNAL_IP}", main.yml -u {USERNAME} --private-key {SSH_PRIVATE_KEY}
{SSH_PRIVATE_KEY}
: Private Key的檔案位罝{USERNAME}
: 用戶名稱{VM_EXTERNAL_IP}
: VM的公共IP位址如果成功運行,應該可以看到如以下的畫面。
PLAY [all] ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]
TASK [Test Sever Connection] **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]
TASK [Install dependencies] ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}] => (item=ca-certificates)
ok: [{VM_EXTERNAL_IP}] => (item=curl)
ok: [{VM_EXTERNAL_IP}] => (item=gnupg)
ok: [{VM_EXTERNAL_IP}] => (item=lsb-release)
ok: [{VM_EXTERNAL_IP}] => (item=python)
ok: [{VM_EXTERNAL_IP}] => (item=python3-docker)
PLAY RECAP ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
{VM_EXTERNAL_IP} : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
這樣我們就成功安裝了所需要的套件。
下一步,我們需要加入Docker的官方GPG Key。在main.yml
中加入以下內容。
- name: Add docker's official GPG key
apt_key:
url: https://download.docker.com/linux/debian/gpg
state: present
然後,再加入以下內容去設定Repository。
- name: Add docker repository
apt_repository:
repo: deb [signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bullseye stable
state: present
最後,在官方文檔中安裝了四個Docker的工具。
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
如同安裝套件的步驟,把要安裝的內容轉為一個陣列,再加入到var.yml
中。
docker_engines:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-compose-plugin
然後在main.yml
中加入以下內容。
- name: Install docker engine
apt:
name: "{{ item }}"
state: latest
update_cache: true
loop: "{{ docker_engines }}"
最後,為了確認Docker安裝成功,嘗試運行官方的hello-world
專案。
- name: Verify docker installation
become: true
command: docker run --rm hello-world
然後再次運行ansible-playbook
指令。
ansible-playbook -i "{VM_EXTERNAL_IP}", main.yml -u {USERNAME} --private-key {SSH_PRIVATE_KEY}
成功運行後應該可以得到以下結果。
PLAY [all] ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]
TASK [Test Sever Connection] **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]
TASK [Install dependencies] ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}] => (item=ca-certificates)
ok: [{VM_EXTERNAL_IP}] => (item=curl)
ok: [{VM_EXTERNAL_IP}] => (item=gnupg)
ok: [{VM_EXTERNAL_IP}] => (item=lsb-release)
ok: [{VM_EXTERNAL_IP}] => (item=python)
ok: [{VM_EXTERNAL_IP}] => (item=python3-docker)
TASK [Add docker's official GPG key] ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]
TASK [Add docker repository] **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
changed: [{VM_EXTERNAL_IP}]
TASK [Install docker engine] **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}] => (item=docker-ce)
ok: [{VM_EXTERNAL_IP}] => (item=docker-ce-cli)
ok: [{VM_EXTERNAL_IP}] => (item=containerd.io)
ok: [{VM_EXTERNAL_IP}] => (item=docker-compose-plugin)
TASK [Verify docker installation] *********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
changed: [{VM_EXTERNAL_IP}]
PLAY RECAP ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
{VM_EXTERNAL_IP} : ok=7 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
最後,在main.yml
中加入以下內容,去登入Harbor並取部署我們的ironman-2022/ironman-helloworld
。
- name: Log into harbor registry
docker_login:
registry_url: {HARBOR_REGISTRY}
username: {HARBOR_USERNAME}
password: {HARBOR_PASSWORD}
reauthorize: yes
- name: Deploy docker
docker_container:
name: "ironman-helloworld"
image: {HARBOR_REGISTRY}/{IMAGE}
state: started
restart: yes
pull: yes
ports:
- "80:3000"
{HARBOR_REGISTRY}
: 我們的Harbor Registry URL{HARBOR_USERNAME}
: Harbor的登入名稱{HARBOR_PASSWORD}
: Harbor的登入密碼{IMAGE}
: 我們的Hello World專案映像檔然後再次運行ansible-playbook
指令。
成功的話可以看到以下結果。
PLAY [all] ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]
TASK [Test Sever Connection] **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]
TASK [Install dependencies] ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}] => (item=ca-certificates)
ok: [{VM_EXTERNAL_IP}] => (item=curl)
ok: [{VM_EXTERNAL_IP}] => (item=gnupg)
ok: [{VM_EXTERNAL_IP}] => (item=lsb-release)
ok: [{VM_EXTERNAL_IP}] => (item=python)
ok: [{VM_EXTERNAL_IP}] => (item=python3-docker)
TASK [Add docker's official GPG key] ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]
TASK [Add docker repository] **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]
TASK [Install docker engine] **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}] => (item=docker-ce)
ok: [{VM_EXTERNAL_IP}] => (item=docker-ce-cli)
ok: [{VM_EXTERNAL_IP}] => (item=containerd.io)
ok: [{VM_EXTERNAL_IP}] => (item=docker-compose-plugin)
TASK [Verify docker installation] *********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
changed: [{VM_EXTERNAL_IP}]
TASK [Log into harbor registry] ***********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
changed: [{VM_EXTERNAL_IP}]
TASK [Deploy docker] **********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
changed: [{VM_EXTERNAL_IP}]
PLAY RECAP ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
{VM_EXTERNAL_IP} : ok=9 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
嘗試用瀏覽器登陸網址,如果成功就可以看見以下畫面。
終於成功把網站用Ansible部署到雲端平台了!那麽明天,理所當然的就是把這一切都自動化了!
只剩下四天的內容了,有點感觸。