使用 Ansible 管理 CoreOS
來自: http://python.jobbole.com/84255/
這篇文章是關于使用 Ansible 管理 CoreOS 的基礎技術。如果你熟悉 Ansible 和一些基本的 CoreOS知識有助于更好的理解下文 。
什么是Ansible?
Ansible 是一個IT自動化工具。它可以配置系統,布署程序和管理很多高級IT任務,像持續集成和零當機更新。
Ansible 是一個底層工具,可以(通常通過 SSH)遠程(Inventory)運行一組命令,這些命令可以是一行簡單的 shell 語句,也可以使用 Ansible 內置模塊執行一些常用任務,如文件復制,包管理,系統信息等等。Ansible 已經包含了很多有用的模板,你也可以很容易地創建你自己的模塊。
為什么使用 Ansible for CoreOS?
Ansible 不需要在在目標機器上安裝遠程代理,只需通過基本的 SSH 連接就可以運行全部功能。
對運行容器來說 CoreOS 是一個 Linux 極小發行版。它沒有象桌面發行版那樣附帶包管理器和一些通用的系統功能。
因為 Ansible 不需要一個遠程代理,并且 CoreOS 的設計目標就是通過系統軟件直接運行在容器中,兩者相互支撐。
起步
繼續之前,請確認你已經在你本地安裝了 Ansible 。如果你已經正確安裝,你可以在 shell 里運行下面這條命令:
$ ansible --version ansible 1.8
$ ansible --version ansible 1.8
為了在本地 CoreOS 上演示 Ansible 我們使用 Vagrant 文件準備了一個簡單的倉庫。這也是一個好的方式,用來檢查你的 playbooks (Ansible commands 命令集)是否像你期望的那樣運行。你需要安裝 vagrant 才能使用這些示例.
如果你已經在運行 Ansible,并且熟悉在云平臺上啟動 CoreOS,你可以無視這些步驟,直接跳到下一節。
在你本地機器運行下面命令:
$ git clone https://github.com/defunctzombie/coreos-ansible-example.git $ cd coreos-ansible-example $ vagrant up -- wait for vagrant to finish booting the machine(s) -- $ ./bin/generate_ssh_config
$ git clone https://github.com/defunctzombie/coreos-ansible-example.git $ cd coreos-ansible-example $ vagrant up -- wait for vagrant to finish booting the machine(s) -- $ ./bin/generate_ssh_config
這會啟動一個 CoreOS 服務器并且配置一些基本網絡連接,服務器啟動后,我們運行一個本地腳本 generate_ssh_config 創建一個 Ansible 配置文件,這樣就知道怎樣通過 SSH 連接我們的服務器。
Inventory 設置
Inventory文件是用來定義主機和群組。在我們的 vagrant 示例中有一個 inventory 文件:ininventory/vagrantwhich,在使用 ansible 配置我們的 CoreOS 示例時我們會用到它。
## inventory file for vagrant machines core-01 ansible_ssh_host=172.12.8.101 [web] core-01
## inventory file for vagrant machines core-01 ansible_ssh_host=172.12.8.101 [web] core-01
我們只有一個命名為 core-01 的主機,我們已經創建了一個命名為 web 的群,并且列出該群下的所有主機。你可以擁有任意數量的主機和群。Ansible 甚至支持動態 Inventory 文件,適合應用在大型生產環境
通過我們的 vagrant inventory 運行一下 ping 測試,通過 shell(在項目文件夾下)執行下面的命令:
$ ansible -i inventory/vagrant all -m setup
$ ansible -i inventory/vagrant all -m setup
如果一切正常,你將看到下面的輸出:
core-01 | FAILED >> { "failed": true, "msg": "/bin/sh: /usr/bin/python: No such file or directory\r\n", "parsed": false }
core-01 | FAILED >> { "failed": true, "msg": "/bin/sh: /usr/bin/python: No such file or directory\r\n", "parsed": false }
這個命令失敗了。為了弄清楚失敗原因和解決辦法,讓我們近距離觀察一下Ansible是如何在遠程機器上運行的。
運行 Ansible
當你運行 Ansible 命令或者 playbook 時,Ansible 會通過 SSH 訪問遠程機器,復制模塊代碼(使用 Python 編寫)并且使用 playbook 中指定的參數運行模塊代碼。
目標機器必須安裝一個 Python 編譯器,Ansible 才能執行這些模塊代碼進而配置你的機器。
CoreOS 是設計運行在容器里,并沒有內置 Python 編譯器,也不能通過包管理器安裝 Python。這就是產生了一個雞和蛋的問題。
幸運的是 Ansible 有一個原生可執行模塊,可以執行 python 模塊直接在遠程系統運行 shell 命令。我們通過這個功能在我們的 CoreOS 主機上啟動一個輕量級的 Python 解釋器。一旦主機可以通過 Python 引導,playbooks 可以使用 myriad 提供 Ansible 模塊來執行系統任務,如啟動服務,安裝 python 庫,管理 Docker 容器。
編輯inventory/vagrant文件在最后一行添加如下內容:
[coreos] core-01 [coreos:vars] ansible_ssh_user=core ansible_python_interpreter="PATH=/home/core/bin:$PATH python"
[coreos] core-01 [coreos:vars] ansible_ssh_user=core ansible_python_interpreter="PATH=/home/core/bin:$PATH python"
在所有croeos群會配置Ansible在/home/core/bin下查找python和pip,否則Ansible會嘗試查找/usr/bin/python,這個路徑在我們的CoreOS主機是不存在的。
我們使用 coreos-bootstrap 規則啟動我們的CoreOS主機。
使用下面的命令安裝規則:
$ ansible-galaxy install defunctzombie.coreos-bootstrap -p ./roles
$ ansible-galaxy install defunctzombie.coreos-bootstrap -p ./roles
現在我們可以使用ansible運行提供的bootstrap.yml文件。
$ ansible-playbook -i inventory/vagrant bootstrap.yml
$ ansible-playbook -i inventory/vagrant bootstrap.yml
命令運行完成后,我們可以運行我們最初的ansible設置命令,并且會看到facts列表。
$ ansible -i inventory/vagrant all -m setup core-01 | success >> { "ansible_facts": { "ansible_all_ipv4_addresses": [ "172.17.42.1", "10.0.2.15", "172.12.8.101" ], ...
$ ansible -i inventory/vagrant all -m setup core-01 | success >> { "ansible_facts": { "ansible_all_ipv4_addresses": [ "172.17.42.1", "10.0.2.15", "172.12.8.101" ], ...
花點時間看一下atbootstrap.yml和site.ml文件,bootstrap.yml是第一個包含的。你自己的Ansible腳本同樣需要bootstrap.ml,否則在運行其他playbooks之前配置CoreOS主機。
Playbook 例子
一旦 Ansible 在你的 CoreOS 主機上可以成功運行,我們就可以做一些事情象啟動系統服務,啟動Docker容器等。
website.yml 文件顯示了一個例子。它啟動 etcd 服務,接著使用 pip 安裝 docker-py,最后在 web 主機群上使用 Ansible docker 模塊啟動一個容器。
- name: example nginx website hosts: web sudo: true tasks: - name: Start etcd service: name=etcd.service state=started - name: Install docker-py pip: name=docker-py - name: pull container raw: docker pull nginx:1.7.1 - name: launch nginx container docker: image="nginx:1.7.1" name="example-nginx" ports="8080:80" state=running
- name: example nginx website hosts: web sudo: true tasks: - name: Start etcd service: name=etcd.service state=started - name: Install docker-py pip: name=docker-py - name: pull container raw: docker pull nginx:1.7.1 - name: launch nginx container docker: image="nginx:1.7.1" name="example-nginx" ports="8080:80" state=running
使用下面命令運行這個playbook。
$ ansible-playbook -i inventory/vagrant website.yml
$ ansible-playbook -i inventory/vagrant website.yml
現在你打開 http://172.12.8.101:8080 ,可以看到nginx的默認首頁 。
你現在已經可以創建更多的plays,用來配置你的CoreOS主機,Plays可以用來運行很多任務,像app自動布署,集群管理,等等。
小提示
本地 Docker 注冊
從遠程注冊機下載鏡像需要消耗時間和帶寬。要管理一個集群時,運行一個本地注冊機,其他機器從注冊機拉取可以加速開發效率。使用 roles 和 playbooks 可以輕松自動搞定。
在通用 playbook 安裝 pip 模塊
如果你要安裝 docker 模塊,可以考慮在設置好 bootstrap.yml 之后,在 playbook 上通過 pip module 為所有主機安裝 docker-py。
使用容器而不是本地二進制
避免使用大量的本地已安裝的優化工具過度配置 CoreOS 主機。在很多種情況下,容器化服務可以很好的運行,且不需要更多的底層主機訪問權限。
你甚至可以通過掛載的方式綁定另外一個容器的相關路徑而映射主機的進程。
</div>