Ansible是新出現的運維工具是基於Python研發的糅合了衆多老牌運維工具的優勢實現了批量操做系統配置、批量程序的部署、批量運行命令等功能。html
ansible是基於模塊工做的ansible自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊ansible只是提供一種框架。python
其實ansible的安裝的方式有不少中,以下:linux
從源碼運行git
經過Yum安裝最新發布版本web
經過Apt (Ubuntu)安裝最新發布版本shell
經過 Portage (Gentoo)安裝最新發布版本apache
經過 pkg (FreeBSD)安裝最新發布版本編程
經過 Homebrew (Mac OSX)安裝最新發布版本windows
經過 Pip 安裝最新發布版本centos
發行版的Tarball。
我這兒就只介紹在centos系統上經過yum來安裝ansible
# service iptables stop
能夠看到防火牆已經關閉了
#setenforce 0
能夠看到selinux已經關閉了
# rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# yum install ansible –y
衆所周知任何軟件的使用須要先配置成本身的配置,ansible也不例外,Ansible 可同時操做屬於一個組的多臺主機,組和主機之間的關係經過 inventory 文件配置. 默認的文件路徑爲 /etc/ansible/hosts 。
除默認文件外,你還能夠同時使用多個 inventory 文件(後面會講到),也能夠從動態源,或雲上拉取 inventory 配置信息。
/etc/ansible/hosts 文件的格式與windows的ini配置文件相似:
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
個人例子
方括號[]中是組名,用於對系統進行分類,便於對不一樣系統進行分類的管理,。主機能夠是ip地址也能夠是域名。
一個系統能夠屬於不一樣的組,好比一臺服務器能夠同時屬於 webserver組 和 dbserver組.這時屬於兩個組的變量均可覺得這臺主機所用,至於變量的優先級關係將於之後的章節中討論.
若是有主機的SSH端口不是標準的22端口,可在主機名以後加上端口號,用冒號分隔.SSH 配置文件中列出的端口號不會在 paramiko 鏈接中使用,會在 openssh 鏈接中使用.
端口號不是默認設置時,可明確的表示爲:
badwolf.example.com:5309
假設你有一些靜態IP地址,但願設置一些別名,但不是在系統的 host 文件中設置,又或者你是經過隧道在鏈接,那麼能夠設置以下:
jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50
在這個例子中,經過 「jumper」 別名,會鏈接 192.168.1.50:5555.記住,這是經過 inventory 文件的特性功能設置的變量. 通常而言,這不是設置變量(描述你的系統策略的變量)的最好方式.後面會說到這個問題.
一組類似的 hostname , 可簡寫以下:
[webservers]
www[01:50].example.com
數字的簡寫模式中,01:50 也可寫爲 1:50,意義相同.你還能夠定義字母範圍的簡寫模式:
[databases]
db-[a:f].example.com
對於每個 host,你還能夠選擇鏈接類型和鏈接用戶名:
[targets]
localhost ansible_connection=local
other1.example.com ansible_connection=ssh ansible_ssh_user=mpdehaan
other2.example.com ansible_connection=ssh ansible_ssh_user=mdehaan
全部以上討論的對於 inventory 文件的設置是一種速記法,後面咱們會討論如何將這些設置保存爲 ‘host_vars’ 目錄中的獨立的文件.
前面已經提到過,分配變量給主機很容易作到,這些變量定義後可在 playbooks 中使用:
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
也能夠定義屬於整個組的變量:
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
能夠把一個組做爲另外一個組的子成員,以及分配變量給整個組使用. 這些變量能夠給 /usr/bin/ansible-playbook 使用,但不能給 /usr/bin/ansible 使用:
[atlanta]
host1
host2
[raleigh]
host2
host3
[southeast:children]
atlanta
raleigh
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2
[usa:children]
southeast
northeast
southwest
northwest
若是你須要存儲一個列表或hash值,或者更喜歡把 host 和 group 的變量分開配置,請看下一節的說明.
在 inventory 主文件中保存全部的變量並非最佳的方式.還能夠保存在獨立的文件中,這些獨立文件與 inventory 文件保持關聯. 不一樣於 inventory 文件(INI 格式),這些獨立文件的格式爲 YAML.詳見YAML 語法 .
假設 inventory 文件的路徑爲:
/etc/ansible/hosts
假設有一個主機名爲 ‘foosball’, 主機同時屬於兩個組,一個是 ‘raleigh’, 另外一個是 ‘webservers’. 那麼如下配置文件(YAML 格式)中的變量能夠爲 ‘foosball’ 主機所用.依次爲 ‘raleigh’ 的組變量,’webservers’ 的組變量,’foosball’ 的主機變量:
/etc/ansible/group_vars/raleigh
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
舉例來講,假設你有一些主機,屬於不一樣的數據中心,並依次進行劃分.每個數據中心使用一些不一樣的服務器.好比 ntp 服務器, database 服務器等等. 那麼 ‘raleigh’ 這個組的組變量定義在文件 ‘/etc/ansible/group_vars/raleigh’ 之中,可能相似這樣:
---
ntp_server: acme.example.org
database_server: storage.example.org
這些定義變量的文件不是必定要存在,由於這是可選的特性.
還有更進一步的運用,你能夠爲一個主機,或一個組,建立一個目錄,目錄名就是主機名或組名.目錄中的能夠建立多個文件, 文件中的變量都會被讀取爲主機或組的變量.以下 ‘raleigh’ 組對應於 /etc/ansible/group_vars/raleigh/ 目錄,其下有兩個文件 db_settings 和 cluster_settings, 其中分別設置不一樣的變量:
/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings
‘raleigh’ 組下的全部主機,均可以使用 ‘raleigh’ 組的變量.當變量變得太多時,分文件定義變量更方便咱們進行管理和組織. 還有一個方式也可參考,詳見 Ansible Vault 關於組變量的部分. 注意,分文件定義變量的方式只適用於 Ansible 1.4 及以上版本。
Tip: Ansible 1.2 及以上的版本中,group_vars/ 和 host_vars/ 目錄可放在 inventory 目錄下,或是 playbook 目錄下. 若是兩個目錄下都存在,那麼 playbook 目錄下的配置會覆蓋 inventory 目錄的配置。
Tip: 把你的 inventory 文件 和 變量 放入 git repo 中,以便跟蹤他們的更新,這是一種很是推薦的方式。
如同前面提到的,經過設置下面的參數,能夠控制 ansible 與遠程主機的交互方式,其中一些咱們已經講到過:
ansible_ssh_host
將要鏈接的遠程主機名.與你想要設定的主機的別名不一樣的話,可經過此變量設置.
ansible_ssh_port
ssh端口號.若是不是默認的端口號,經過此變量設置.
ansible_ssh_user
默認的 ssh 用戶名
ansible_ssh_pass
ssh 密碼(這種方式並不安全,咱們強烈建議使用 --ask-pass 或 SSH 密鑰)
ansible_sudo_pass
sudo 密碼(這種方式並不安全,咱們強烈建議使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
sudo 命令路徑(適用於1.8及以上版本)
ansible_connection
與主機的鏈接類型.好比:local, ssh 或者 paramiko. Ansible 1.2 之前默認使用 paramiko.1.2 之後默認使用 'smart','smart' 方式會根據是否支持 ControlPersist, 來判斷'ssh' 方式是否可行.
ansible_ssh_private_key_file
ssh 使用的私鑰文件.適用於有多個密鑰,而你不想使用 SSH 代理的狀況.
ansible_shell_type
目標系統的shell類型.默認狀況下,命令的執行使用 'sh' 語法,可設置爲 'csh' 或 'fish'.
ansible_python_interpreter
目標主機的 python 路徑.適用於的狀況: 系統中有多個 Python, 或者命令路徑不是"/usr/bin/python",好比 \*BSD, 或者 /usr/bin/python
不是 2.X 版本的 Python.咱們不使用 "/usr/bin/env" 機制,由於這要求遠程用戶的路徑設置正確,且要求 "python" 可執行程序名不可爲 python之外的名字(實際有可能名爲python26).
與 ansible_python_interpreter 的工做方式相同,可設定如 ruby 或 perl 的路徑....
一個主機文件的例子:
some_host ansible_ssh_port=2222 ansible_ssh_user=manager
aws_host ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host ansible_python_interpreter=/usr/local/bin/python
ruby_module_host ansible_ruby_interpreter=/usr/bin/ruby.1.9.3
若是咱們敲入一些命令去比較快的完成一些事情,而不須要將這些執行的命令特別保存下來, 這樣的命令就叫作 ad-hoc 命令。
Ansible提供兩種方式去完成任務,一是 ad-hoc 命令,一是寫 Ansible playbook, 前者能夠解決一些簡單的任務, 後者解決較複雜的任務。
通常而言,在學習了 playbooks 以後,你才能體會到 Ansible 真正的強大之處在哪裏
那咱們會在什麼情境下去使用ad-hoc 命令呢?
好比說由於聖誕節要來了,想要把全部實驗室的電源(系統)關閉,咱們只須要執行一行命令 就能夠達成這個任務,而不須要寫 playbook 來作這個任務。
至於說作配置管理或部署這種事,仍是要藉助 playbook 來完成,即便用 ‘/usr/bin/ansible-playbook’ 這個命令.
(關於 playbook 的使用,請參考 Playbooks )
若是你尚未閱讀 Inventory文件 ,最好先看一看,而後咱們繼續往下.
咱們先來看一條很基本的命令
若是沒有免密碼登陸的話,可使用以下命令:
在ansible中還有一個Module(模塊)的概念,這個模塊能夠理解爲一個庫,全部的ac-hoc命令都須要經過模塊來執行,好比上面的那個命令: ansible test-servers -m ping,實際上是調用了ping模塊,-m後面表示用什麼模塊, 除了ping模塊還有其餘不少模塊,下面介紹一下比較經常使用的模塊 。
執行ansible-doc –l命令列出全部已安裝的模塊文檔:
ansible的command模塊是默認的模塊,若是你不寫模塊名,就是調用這個模塊。使用command命令能夠在遠程節點上執行bash上面的命令。
實例1關機
ansible test-servers -m command -a "init 0" -u root
實例二:查看系統linux內核
ansible test-servers -m command -a "uname -r" -u root
實例三:查看系統的運行了多長時間
ansible test-servers -m command -a "uptime" -u root
基本上大部分命令均可以執行,可是command 模塊不支持 shell 變量,也不支持管道等 shell 相關的東西.若是你想使用 shell相關的這些東西, 請使用’shell’ 模塊。
ansible test-servers -m command -a "ls |grep log" -u root
實例一:管道命令使用
ansible test-servers -m s -a "ls ~|grep log"
實例二:查看該組主機的變量TERM
ansible test-servers -m shell -a 'echo $TERM'
使用 Ansible ad hoc 命令行接口時(與使用 Playbooks 的狀況相反),尤爲注意 shell 引號的規則. 好比在上面的例子中,若是使用雙引號」echo $TERM」,會求出TERM變量在當前系統的值,而咱們實際但願的是把這個命令傳遞 到其它機器執行。
實例三:執行遠程主機上面的shell腳本
71和72上面的/ h腳本內容以下:
在本機上面沒有這個腳本
ansible test-servers -m shell -a "/root/a.sh"
實例四:將管理主機(本機)上的腳本到遠程主機上面執行(scp+shell)
腳本在主控端,有一個/root/b.sh
遠程主機71和72上面都沒有
用shell模塊執行會失敗
ansible test-servers -m shell -a "/root/b.sh"
應該使用script模塊來執行
ansible test-servers -m script -a "/root/b.sh"
優勢:
1比起來其餘自動化集羣管理和運維工具 Puppet、Chef、Ansible 顯得很簡單而且輕量級, 可是 Ansible 又不像 Fab 那樣功能單一隻能作批量命令,也能夠和puppet同樣進行模塊擴展。
2輕量級的好處是學習門檻低、問題少、安裝快、執行快。操做徹底依賴 SSH 而不須要安裝 agent 。這樣的好處是再也不須要維護 agent 的狀態,不用擔憂 Agent 掛掉。而 SSH 是每臺服務器必備的服務。它很是適合安全補丁更新的場景。好比,100 臺服務器打 bash vulnerability 安全補丁只須要 10 分鐘。
3.Ansible 結合 Docker、Mesos、Puppet、Vagrant、Git 等系統能夠構建出很是好的自動化運維平臺。Ansible 比起其餘自動化運維工具更適合對 Docker 實例進行維護和管理。若是你的機器實例數量超過 1000,也能夠選擇Ansible 的 Web 控制工具 Ansible Tower 。
缺點:
1.一樣這樣的簡單設計的劣勢是沒有依賴管理功能(感受不適合咱們公司,或者和別的一塊兒用)。可是 Ansible 對於通常的使用場景已經足夠了。
複製文件到遠程主機,這是 /usr/bin/ansible 的另外一種用法.Ansible 可以以並行的方式同時 SCP 大量的文件到多臺機器。這個的適用場景於文件發佈,這種需求不少,好比平常的配置文件更新,程序版本發佈等,基本都會用到。
輸入的命令以下:
ansible test-servers -m copy -a "src=/opt/file dest=/opt/file"
注意:目標主機上面的目錄層級結構以下:
命令參數以下:
backup:在覆蓋以前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no
content:用於替代「src」,能夠直接設定指定文件的值
dest:必選項。要將源文件複製到的遠程主機的絕對路徑,若是源文件是一個目錄,那麼該路徑也必須是個目錄,若是該目錄不存在則會自動建立。且
directory_mode:遞歸設定目錄的權限,默認爲系統默認權限
force:若是目標主機包含該文件,但內容不一樣,若是設置爲yes,則強制覆蓋,若是爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes
others:全部的file模塊裏的選項均可以在這裏使用
src:被複制到遠程主機的本地文件,能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑使用「/」來結尾,則只複製目錄裏的內容,若是沒有使用「/」來結尾,則包含目錄在內的整個內容所有複製,相似於rsync。
實例一:使用 file 模塊能夠作到修改文件的屬主和權限:
ansible test-servers -m file -a "dest=/opt/file/file/3.c mode=600"
實例二:使用 file 模塊也能夠建立目錄,與執行 mkdir -p 效果相似:
ansible test-servers -m file -a "dest=/opt/file/file/ccc mode=755 owner=root group=root state=directory"
遠程目標機器上面的目錄結構以下:
實例三:刪除目錄(遞歸的刪除)和刪除文件:
ansible test-servers -m file -a "dest=/opt/file/file/ccc mode=755 owner=root group=root state=absent"
再查看目標主機上面,能夠看獲得,ccc目錄已經被刪除了。
相關參數選項以下:
force:須要在兩種狀況下強制建立軟連接,一種是源文件不存在,但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no
group:定義文件/目錄的屬組
mode:定義文件/目錄的權限
owner:定義文件/目錄的屬主
path:必選項,定義文件/目錄的路徑
recurse:遞歸設置文件的屬性,只對目錄有效
src:被連接的源文件路徑,只應用於state=link的狀況
dest:被連接到的路徑,只應用於state=link的狀況
state:
directory:若是目錄不存在,就建立目錄
file:即便文件不存在,也不會被建立
link:建立軟連接
hard:建立硬連接
touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間
absent:刪除目錄、文件或者取消連接文件
其餘經常使用模塊,好比:service、cron、yum、synchronize就不一一例舉,能夠結合自身的系統環境進行測試。
service:系統服務管理
cron:計劃任務管理
yum:yum軟件包安裝管理
synchronize:使用rsync同步文件
user:系統用戶管理
group:系統用戶組管理
更多模塊能夠參考:
#ansible-doc –l
像不少其它配置文件管理方法同樣,Ansible使用一種比較直白的方法來描述本身的任務配置文件。
Ansible 的任務配置文件被稱之爲「playbook」,咱們能夠稱之爲「劇本」。每一齣劇本(playbook)中都包含一系列的任務,這每一個任務在ansible中又被稱爲一出「戲劇」(play)。一個劇本(playbook)中包含多出戲劇(play),這很容易理解。
Playbooks 與 adhoc 相比,是一種徹底不一樣的運用 ansible 的方式,是很是之強大的。
簡單來講,playbooks 是一種簡單的配置管理系統與多機器部署系統的基礎.與現有的其餘系統有不一樣之處, 且很是適合於複雜應用的部署。
Playbooks 可用於聲明配置,更強大的地方在於,在 playbooks 中能夠編排有序的執行過程,甚至於作到在多組機器間,來回有序的執行特別指定的步驟,而且能夠同步或異步的發起任務。
咱們使用 adhoc 時,主要是使用 /usr/bin/ansible 程序執行任務.而使用 playbooks 時,更可能是將之放入源碼控制之中,用之推送你的配置或是用於確認你的遠程系統的配置是否符合配置規範。
Playbook主要由如下四部分組成:
Target section:定義將要執行playbook的遠程主機組
Variable section:定義playbook運行時須要使用的變量
Task section:定義將要在遠程主機上執行的任務列表
Handler section:定義task執行完成之後須要調用的任務
1. vars 定義格式 變量名:變量值
2. vars_files 指定變量文件
3. vars_prompt 用戶交互模式自定義變量
4. setup 模塊去遠程主機的值
1. name:輸出到屏幕的信息
2. action:定義執行的動做調用ansible的模塊例如:yum name=http state=installed就是安裝apache服務
3. copy:複製本地文件到遠程主機
4. template:複製本地文件到遠程主機可是他能夠在本地文件中調用變量
5. service :定義服務的狀態
Playbooks 的格式是YAML(詳見:YAML 語法),語法作到最小化,意在避免 playbooks 成爲一種編程語言或是腳本,但它也並非一個配置模型或過程的模型。
playbook 由一個或多個 ‘plays’ 組成.它的內容是一個以 ‘plays’ 爲元素的列表。
在 play 之中,一組機器被映射爲定義好的角色.在 ansible 中,play 的內容,被稱爲 tasks,即任務.在基本層次的應用中,一個任務是一個對 ansible 模塊的調用,這在前面章節學習過。
首先一個簡單的playbook的實例
實例一:,把當前用戶名輸出到whoami.rst文件中:
# playbook.yml
---
- hosts: test-serviers # hosts中指定
remote_user: root # 若是和當前用戶同樣,則無需指定
tasks:
- name: whoami
shell: 'whoami > whoami.rst'
執行這個playbook:
ansible-playbook playbook.yml
在遠程目標主機上,已經生成這個文件,且裏面有內容:
實例二:將shell腳本轉換爲playbook
下面有一個安裝apache的shell腳本,你們來感覺一下:
#!/bin/bash
# 安裝Apache
yum install --quiet -y httpd httpd-devel
# 複製配置文件
cp /path/to/config/httpd.conf /etc/httpd/conf/httpd.conf
cp /path/to/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
# 啓動Apache,並設置開機啓動
service httpd start
chkconfig httpd on
將其轉換爲一個完整的playbook後:
---
- hosts: all
tasks:
- name: "安裝Apache"
command: yum install --quiet -y httpd httpd-devel
- name: "複製配置文件"
command: cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
command: cp /tmp/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
- name: "啓動Apache,並設置開機啓動"
command: service httpd start
command: chkconfig httpd on
也就是說,只要你有編寫shell腳本的基本能力,你就能夠快速的學會利用playbook來發揮Ansible的強大威力。
在上述playbook中,咱們使用了「command」模塊來運行了標準的shell命令。咱們還給了每一出play一個「name」,所以當咱們運行playbook時,每個play都會有很是易讀的的信息輸出:
上面的playbook已經能夠很好的運行shell腳本了,可是Ansible還有不少其餘內置模塊,能夠大幅提高處理複雜配置的能力。
---
- hosts: all
sudo: yes
tasks:
- name: 安裝Apache
yum: name={{ item }} state=present
with_items:
- httpd
- httpd-devel
- name: 複製配置文件
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: root
group: root
mode: 0644
with_items:
- {
src: "/tmp/httpd.conf",
dest: "/etc/httpd/conf/httpd.conf" }
- {
src: "/tmp/httpd-vhosts.conf",
dest: "/etc/httpd/conf/httpd-vhosts.conf"
}
- name: 檢查Apache運行狀態,並設置開機啓動
service: name=httpd state=started enabled=yes
運行結果以下:
Ansible講解比較好的網站以下,寫的很是到位:
http://www.jianshu.com/p/41c4ed3ce779
http://doc.178linux.com/docs/playbooks_intro.html#playbook
咱們能夠對ansible進行擴展,ansible提供了Ansible API用Ansible的Python API來管理節點,能夠經過擴展Ansible來響應大量的Python事件,你能夠寫各類的插件,而且,你能夠經過插件來調取外部數據源。
Ansible感受仍是不是挺適合咱們的業務,主要是因爲過於簡單,且語言也不合適(python)還不如如今本身開發一個比較靠譜。