iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0
DevOps

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

Day 25: 準備好劇本(Playbook)!來一場Ansible的部署戲碼!

  • 分享至 

  • xImage
  •  

昨天我們安裝了Ansible,今天起,我們就一起利用Ansible嘗試連接到新建的VM中,並進行Docker安裝和部署我們的Hello World專案吧!

我們的第一個Playbook

Ansible以Playbook去儲存部署的內容,而每一個Playbook以YAML的格式編輯。而一個Playbook會由一個或多個不同的plays組成。而每一個play中會有不同的task去代表這個play中需要執行的不同步驟。

因此事不宜遲,我們先來編寫我們第一個Playbook吧!

前置動作,部署SSH Key

第一步,我們要先讓Ansible有登入GCP的VM的能力。要登入GCP的VM,首先要產生一條SSH Key,然後把Public Key放到VM上面做配對。先在Terminal中運行以下指令產生SSH Key。

ssh-keygen -t rsa -f {SSH_KEY_PATH} -C {USERNAME}
  • {SSH_KEY_PATH}: SSH Key生成的路徑
  • {USERNAME}: 你的用戶名稱,登入時要使用此名稱

運行成功後應該會得到兩個檔案,一個是在你輸入的位置的Private Key,另一個則是以.pub命名的Public Key。

然後運行以下指令顯示Public Key的內容。

cat {SSH_KEY_PATH}

應該會得到類似以下的內容。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDUa4DuixR7Cx3WBwhVpxf4B9WKslr8/n1Lf8zIWKuxiz8cyE7zDiNgHfm____________zg4SW794zYCvA2wSpIpNQMpnLeAd9uWZ6g4RwHKk5Y7yQU23Iq2d0GS/T2ytbMdDtlcHX3OUCQCGyAH7YZ+9OWz90mvPkosJ0+hEcsymZWwpXYWZUzQ/YwXCqNKzr6VsHA/m_________XG7IrRNMQJ/qj467AKicSCqVH5thq/XPV1Bp9+nCKkIq9ZZu4SIYzGCTuUEJr3PipCbgVzuYaoV8sWTbCh3jbZg5IOgNW77smQEs1AH___________q++WY+B1h0V93u/JqA1GejBtp6M8NzBzMXvSohLHKRRIAAV4hXxflkdV9fpTGJ5Vy2j2ry/JhLpMyhCuHlSA____________nZv9jnuZkk9cJDY9SfYAUti7BRMh1/CTr3a/RCh5BPR6b6osc9qmGVcht43DWohDnk7QyQ2M1cuCNpm9k= jamkuong

然後回到專案中,我們要把Public Key部署到VM上。回到main.tf的檔案中,找到metadata{…}的部份,修改為以下內容。

  metadata = {
    enable-oslogin = "FALSE"
    ssh-keys = "{USERNAME}:{SSH_PUB_KEY}"
  }
  • {USERNAME}: 你的用戶名稱,登入時要使用此名稱
  • {SSH_PUB_KEY}: 剛剛取得的Public Key內容

另外,由於我們準備部署一個HTTP的服務,所以要順手打開HTTP的端口。找到tags =["ssh"]的部份,改為以下內容。

  tags         = ["ssh", "http-server"]

然後Commit、上傳、在Jenkins Build Now

部署成功後,嘗試運行以下內容連接VM。

ssh -i {SSH_PRIVATE_KEY} {USERNAME}@{VM_EXTERNAL_IP}
  • {SSH_PRIVATE_KEY}: Private Key的檔案位罝
  • {USERNAME}: 用戶名稱
  • {VM_EXTERNAL_IP}: VM的公共IP位址

如果成功連接就代表SSH Key配對成功。

利用Ansible登入VM

在專案中,新增一個main.yml。這個YAML檔案將會用來儲存我們Playbook的內容。

main.yml中加入以下內容。

---
- hosts: all
  become: true
    -
  tasks:
    - name: Test Sever Connection
      ping:

然後,我們嘗試用Ansible去執行此Playbook。在Terminal中運行以下指令。

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位址

這裡我們使用了ansible_ssh_useransible_ssh_private_key_file去傳入我們的登入資訊。如果成功連接,應該會得到類似以下的結果。

PLAY [all] ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]

TASK [Test Sever Connection] **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [{VM_EXTERNAL_IP}]

PLAY RECAP ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
{VM_EXTERNAL_IP}              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

小結

由於是次系列中,Ansible的部署的步驟比較多,因此本章先在此處結束。明天我們就利用Ansible去操作VM進行Docker的安裝及部署。

題外話

還剩下五天!


上一篇
Day 24: 基礎架構即程式碼雙刀流!Ansible!
下一篇
Day 26: Ansible戲碼第二幕!Docker出來了!
系列文
不想吃土嗎?就利用開源軟體打造CICD Pipeline吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言