iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
DevOps

不想吃土嗎?就利用開源軟體打造CICD Pipeline吧!系列 第 26

Day 26: Ansible戲碼第二幕!Docker出來了!

  • 分享至 

  • xImage
  •  

昨天我們成功連接到新建的VM,那麽今天,我們就嘗試在VM上面進行Docker的安裝及部署吧!

安裝Docker

當我們安裝Docker的時候,可以參考Docker的官方文檔,去進行安裝。而我們要做的,就是利用Ansible去把文檔中的步驟轉化為Ansible的操作指令。

依照官方的文檔,我們進行安裝的的第一步,要先運行以下指令安裝相關的套件。

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

整理一下,這一步我們需要安裝4個不同的套件(分別為ca-certificatescurlgnupglsb-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

嘗試用瀏覽器登陸網址,如果成功就可以看見以下畫面。
https://ithelp.ithome.com.tw/upload/images/20221007/20152012bsIqWHfdSm.png

小結

終於成功把網站用Ansible部署到雲端平台了!那麽明天,理所當然的就是把這一切都自動化了!

題外話

只剩下四天的內容了,有點感觸。


上一篇
Day 25: 準備好劇本(Playbook)!來一場Ansible的部署戲碼!
下一篇
Day 27: Ansible最終回!與Jenkins共舞!
系列文
不想吃土嗎?就利用開源軟體打造CICD Pipeline吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言