昨天我們安裝了Ansible,今天起,我們就一起利用Ansible嘗試連接到新建的VM中,並進行Docker安裝和部署我們的Hello World專案吧!
Ansible以Playbook去儲存部署的內容,而每一個Playbook以YAML的格式編輯。而一個Playbook會由一個或多個不同的plays
組成。而每一個play
中會有不同的task
去代表這個play
中需要執行的不同步驟。
因此事不宜遲,我們先來編寫我們第一個Playbook吧!
第一步,我們要先讓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配對成功。
在專案中,新增一個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_user
及ansible_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的安裝及部署。
還剩下五天!