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:
留言列表