Ansible Sharing

 

 

 

1.Ansible introduction

 

請參考 https://github.com/ansible/ansible 

 

 

2.Ansible Install

  • Control Machine Requirements
    • Python 2.6 or 2.7 

 

  • Managed Node Requirements
    • Python 2.4 or later
    • python-simplejson(Technically, you can use Ansible to install python-simplejson using the raw module )
  • Install Steps
    • use yum to install — sudo yum install ansible
  • env setup
    • $ echo "127.0.0.1" > ~/ansible_hosts(預設管理伺服器列表在家目錄下的ansible_hosts 中加入本機,可以在每一次的使用另外指定)
    • $ export ANSIBLE_INVENTORY=~/ansible_hosts (預設使用伺服器列表的環境變數為 ANSIBLE_INVENTORY,可以在每一次的使用另外指定)

 

3.實作

以下為我實作的步驟

 

步驟1,先在AWS開起三台雲端機器 

步驟2,在家目錄下開啟一個ansible_test資料夾(mkdir -p ~/ansible)

步驟3,到ansible_test下新增一個伺服器管理列表(cd ~/ansible && vim ~/ansible/inventory.host)

將AWS的三台雲端機器的IP寫入至inventory.host 並將其section 命名為 [AWS] 如下圖

 步驟4,本機理論上要可以存取git上面的私有專案,才可以進行部署,使用ForwardAgent來進行一次性Private Key 使用增加安全性,設定方式為新增一個ansible.cfg 在未來playbook.yml同目錄下的位置並新增內容 

步驟5,本機的ssh key 需要進行加入至暫存key 中,指令為 ssh-add

步驟6,由於AWS的雲端登入是利用憑證,因此需要設定private_key_file,在剛剛的.cfg 再加入 

完整的ansible.cfg檔案如下

 

至目前為止,目錄下應該有以下檔案

ansible.cfg,inventory.host

 

接著開始撰寫playbook.yml

該次練習我設想的情境為,git clone athena 專案下來 並到指定的目錄下

以該情境,第一應該是確認git 是否有安裝

ansible 的https://galaxy.ansible.com/ 是一個讓大家上傳roles (類似寫好的腳本),查了Google 在安裝git 可以直接使用別人寫好的腳本,腳本名稱為 geerlingguy.git,當你引用這個腳本,就會自動安裝git,但是roles 必須先下載好,因此要新增一個專門用來下載roles的檔案

 

步驟7,新增requirements.yml 並加入以下內容 

 

path是會將role存在該.yml 目錄下的位置,src是role的名稱此外我們還會用到known_hosts的處理,由於ansible無法進行對話終端機(輸入yes or no )因此必須將github.com 加入至known_hosts的列表,將該roles也加入該檔案中,完整檔案如下

 

步驟8,安裝roles

$ ansible-galaxy install -f  -r requirements.yml

 

執行完成後你的目錄下應該要有以下檔案

ansible.cfg,inventory.host,requirements.yml,roles,其中roles中應該會有bfmartin.ssh_known_hosts,以及geerlingguy.git

 

步驟9,編輯playbook.yml

編輯內容為以下

 

- hosts: AWS 「伺服器管理列表檔案中section 的名字,若用All 則是全部」

  user: ec2-user「遠端登入伺服器的使用者名稱」

  sudo: True

  roles:

    - geerlingguy.git「引用Role,必須存在該playbook目錄下的roles資料夾中的role」

    - { role: bfmartin.ssh_known_hosts, host: github.com }「引用Role,該role會將host 加入至遠端機器的known_hosts列表中」

 

  tasks:

    - name: clone athena project from git repo

      sudo: False

      git: repo={{ project_git_repo }} dest={{ project_source_path }}

 

  vars:

    - project_git_repo: git@github.com:migocorp/athena.git

    - project_source_path: /tmp/deploy

 

編輯完成,可以來執行看看了

 

若先前環境變數那些都設定過,執行語法最簡單的為以下

ansible-playbook playbook.yml

 

若先前環境變數沒設定過,則用以下「用i來指定伺服器列表檔案」

ansible-playbook -i inventory.host playbook.yml

 

若ansible.cfg裡面沒指定過private-key或是要置換則用以下

ansible-playbook --private-key /Users/wuenhouse/Downloads/wuenhouse.pem -i inventory.host playbook.yml

 

若要進行debug 則在結尾加上

ansible-playbook --private-key /Users/wuenhouse/Downloads/wuenhouse.pem -i inventory.host playbook.yml -vvvv

 

最後可以檢查一下,你的雲端機器是否已經成功存在檔案了,看到的成功訊息為

4.曾經遇到的問題

 中間遇到過的問題是ssh-add 的效用已經過期,需要重新加入才可以遠端

使用者名稱的置換寫在hosts 中 ansible_user=xxx無效,要寫在playbook中

 

只要git clone 下來之後,我們剩的部署可以用ansible 中的copy modules 來進行

http://docs.ansible.com/ansible/copy_module.html 

 

其他需要的python module 安裝都可以透過 raw modules 來安裝

http://docs.ansible.com/ansible/raw_module.html 

 

  • raw: yum -y install python-simplejson

 

5.待釐清問題

 

以 agent forwarding 模式登入 server 之後,如果以 sudo 模式執行任何命令,某些環境變數會被吃掉,與 agent forwarding 息息相關的 SSH_AUTH_SOCK 環境變數也包括在內。解決之道呢?綜合 Stack Overflow 及 GitHub Help 各家說法,影響層面最小的,就是在 git 指令前面強制設定 sudo: False:

, , ,
創作者介紹

wuen

wuen 發表在 痞客邦 PIXNET 留言(0) 人氣()