我知道不少用戶常用 pastebin 這樣的服務,以及不少公司基於顯而易見的理由配置了他們內部使用的相似東西。最近,我遇到了一個叫作 showterm 的程序,巧合之下我被一個客戶要求配置它用於內部使用。這裏我不打算贅述這個應用程序的細節,不過若是你感興趣的話,你可使用 Google 搜索 showterm。做爲一個合理的現實中的例子,我將會試圖配置一個 showterm 服務器,而且配置使用它所須要的客戶端應用程序。在這個過程當中咱們還須要一個數據庫服務器。如今咱們從配置客戶端開始:php
--- - hosts: showtermClients remote_user: root tasks: - yum: name=rubygems state=latest - yum: name=ruby-devel state=latest - yum: name=gcc state=latest - gem: name=showterm state=latest user_install=no
這部分很簡單。下面是主服務器:html
--- - hosts: showtermServers remote_user: root tasks: - name: ensure packages are installed yum: name={{item}} state=latest with_items: - postgresql - postgresql-server - postgresql-devel - python-psycopg2 - git - ruby21 - ruby21-passenger - name: showterm server from github git: repo=https://github.com/ConradIrwin/showterm.io dest=/root/showterm - name: Initdb command: service postgresql initdb creates=/var/lib/pgsql/data/postgresql.conf - name: Start PostgreSQL and enable at boot service: name=postgresql enabled=yes state=started - gem: name=pg state=latest user_install=no handlers: - name: restart postgresql service: name=postgresql state=restarted - hosts: showtermServers remote_user: root sudo: yes sudo_user: postgres vars: dbname: showterm dbuser: showterm dbpassword: showtermpassword tasks: - name: create db postgresql_db: name={{dbname}} - name: create user with ALL priv postgresql_user: db={{dbname}} name={{dbuser}} password={{dbpassword}} priv=ALL - hosts: showtermServers remote_user: root tasks: - name: database.yml template: src=database.yml dest=/root/showterm/config/database.yml - hosts: showtermServers remote_user: root tasks: - name: run bundle install shell: bundle install args: chdir: /root/showterm - hosts: showtermServers remote_user: root tasks: - name: run rake db tasks shell: 'bundle exec rake db:create db:migrate db:seed' args: chdir: /root/showterm - hosts: showtermServers remote_user: root tasks: - name: apache config template: src=showterm.conf dest=/etc/httpd/conf.d/showterm.conf
還湊合。請注意,從某種意義上來講這是一個任意選擇的程序,然而咱們如今已經能夠持續地在任意數量的機器上部署它了,這即是配置管理的好處。此外,在大多數狀況下這裏的定義語法幾乎是不言而喻的,wiki 頁面也就不須要加入太多細節了。固然在個人觀點裏,一個有太多細節的 wiki 頁面毫不會是一件壞事。前端
咱們並無涉及到這裏全部的細節。Ansible 有許多選項能夠用來配置你的系統。你能夠在你的 hosts 文件中內嵌變量,而 ansible 將會把它們應用到遠程節點。如:python
[RHELBased] 10.50.1.33 http_port=443 10.50.1.47 http_port=80 ansible_ssh_user=mdonlon [SUSEBased] 127.0.0.1 http_port=443
儘管這對於快速配置來講已經很是方便,你還能夠將變量分紅存放在 yaml 格式的多個文件中。在你的 hosts 文件路徑裏,你能夠建立兩個子目錄 groupvars 和 hostvars。在這些路徑裏放置的任何文件,只要能對得上一個主機分組的名字,或者你的 hosts 文件中的一個主機名,它們都會在運行時被插入進來。因此前面的一個例子將會變成這樣:mysql
ultrabook:/etc/ansible # pwd /etc/ansible ultrabook:/etc/ansible # tree . ├── group_vars │ ├── RHELBased │ └── SUSEBased ├── hosts └── host_vars ├── 10.50.1.33 └── 10.50.1.47
以及:linux
2 directories, 5 files ultrabook:/etc/ansible # cat hosts [RHELBased] 10.50.1.33 10.50.1.47
其它:git
[SUSEBased] 127.0.0.1 ultrabook:/etc/ansible # cat group_vars/RHELBased ultrabook:/etc/ansible # cat group_vars/SUSEBased --- http_port: 443 ultrabook:/etc/ansible # cat host_vars/10.50.1.33 --- http_port: 443 ultrabook:/etc/ansible # cat host_vars/10.50.1.47 --- http_port:80 ansible_ssh_user: mdonlon
組織 playbooks 也已經有不少種現成的方式。在前面的例子中咱們用了一個單獨的文件,所以這方面被大幅地簡化了。組織這些文件的一個經常使用方式是建立角色。簡單來講,你將一個主文件加載爲你的 playbook,而它將會從其它文件中導入全部的數據,這些其餘的文件即是角色。舉例來講,若是你有了一個 wordpress 網站,你須要一個 web 前端,和一個數據庫。web 前端將包括一個 web 服務器,應用程序代碼,以及任何須要的模塊。數據庫有時候運行在同一臺主機上,有時候運行在遠程的主機上,這時候角色就能夠派上用場了。你建立一個目錄,並對每一個角色建立對應的小 playbook。在這個例子中咱們須要一個 apache 角色,mysql 角色,wordpress 角色,mod_php,以及 php 角色。最大的好處是,並非每一個角色都必須被應用到同一臺機器上。在這個例子中,mysql 能夠被應用到一臺單獨的機器。這一樣爲代碼重用提供了可能,好比你的 apache 角色還能夠被用在 python 和其餘類似的 php 應用程序中。展現這些已經有些超出了本文的範疇,並且作一件事老是有不少不一樣的方式,我建議搜索一些 ansible 的 playbook 例子。有不少人在 github 上貢獻代碼,固然還有其餘一些網站。github
在 ansible 中,對於全部完成的工做,幕後的工做都是由模塊主導的。Ansible 有一個很是豐富的內置模塊倉庫,其中包括軟件包安裝,文件傳輸,以及咱們在本文中作的全部事情。可是對一部分人來講,這些並不能知足他們的配置需求,ansible 也提供了方法讓你添加本身的模塊。Ansible 的 API 有一個很是棒的事情是,它並無限制模塊也必須用編寫它的語言 Python 來編寫,也就是說,你能夠用任何語言來編寫模塊。Ansible 模塊經過傳遞 JSON 數據來工做,所以你只須要用想用的語言生成一段 JSON 數據。我很肯定任何腳本語言均可以作到這一點,所以你如今就能夠開始寫點什麼了。在 Ansible 的網站上有不少的文檔,包括模塊的接口是如何工做的,以及 Github 上也有不少模塊的例子。注意一些小衆的語言可能沒有很好的支持,不過那隻多是由於沒有多少人在用這種語言貢獻代碼。試着寫點什麼,而後把你的結果發佈出來吧!web
總的來講,雖然在配置管理方面已經有不少解決方案,我但願本文能顯示出 ansible 簡單的設置過程,在我看來這是它最重要的一個要點。請注意,由於我試圖展現作一件事的不一樣方式,因此並非前文中全部的例子都是適用於你的個別環境或者對於廣泛狀況的最佳實踐。這裏有一些連接能讓你對 ansible 的瞭解進入下一個層次:sql
下一步:
更多參考: