轉載請注明出處http://www.cnblogs.com/chenxianpao/p/7360349.html
一、 介紹
1. 簡介
ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
(1)、連接插件connection plugins:負責和被監控端實現通信;
(2)、host inventory:指定操作的主機,是一個配置文件里面定義監控的主機;
(3)、各種模塊核心模塊、command模塊、自定義模塊;
(4)、借助於插件完成記錄日志郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。
github地址:
https://github.com/ansible/ansible/
官網地址:
https://docs.ansible.com
在線playbook分享平台:
https://galaxy.ansible.com
2. 特性
(1)、no agents:不需要在被管控主機上安裝任何客戶端;
(2)、no server:無服務器端,使用時直接運行命令即可;
(3)、modules in any languages:基於模塊工作,可使用任意語言開發模塊;
(4)、yaml,not code:使用yaml語言定制劇本playbook;
(5)、ssh by default:基於SSH工作;
(6)、strong multi-tier solution:可實現多級指揮。
3. 優點
(1)、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
(2)、批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行;
(3)、使用python編寫,維護更簡單,ruby語法過於復雜;
(4)、支持sudo。
4. 基本架構(懶人,圖源於網絡,謝作圖之人)

· 核心引擎:即ansible
· 核心模塊(core modules):這些都是ansible自帶的模塊,ansible模塊資源分發到遠程節點使其執行特定任務或匹配一個特定的狀態。
· 自定義模塊(custom modules):如果核心模塊不足以完成某種功能,可以添加自定義模塊。
· 插件(plugins):完成模塊功能的補充,借助於插件完成記錄日志、郵件等功能
· 劇本(playbook):定義ansible任務的配置文件,可以將多個任務定義在一個劇本中,由ansible自動執行,劇本執行支持多個任務,可以由控制主機運行多個任務,同時對多台遠程主機進行管理。
· playbook是ansible的配置、部署和編排語言,可以描述一個你想要的遠程系統執行策略,或一組步驟的一般過程。如果ansible模塊作為你的工作室工具,playbook就是設計方案。在基本層面上,劇本可以用於管理配置和部署遠程機器。在更高級的應用中,可以序列多層應用及滾動更新,並可以把動作委托給其他主機,與監控服務器和負載平衡器交互。
· 連接插件(connection plugins):ansible基於連接插件連接到各個主機上,負責和被管理節點實現通信。雖然ansible是使用ssh連接到各被管理節點,但它還支持其他的連接方法,所以需要有連接插件。
· 主機清單(host inventory):定義ansible管理的主機策略,默認是在ansible的hosts配置文件中定義被管節點,同時也支持自定義動態主機清單和指定配置文件路徑。
ansible采用paramiko協議庫(Fabric也使用這個),通過ssh或者ZeroMQ等連接主機。ansible在控制主機主機將ansible模塊通過ssh協議(或者Kerberos、LDAP)推送到被管節點執行,執行完之后自動刪除。控制主機與被管理節點之間支持local、SSH、ZeroMQ三種連接方式,默認使用基於SSH的連接。在規模較大的情況下使用ZeroMQ連接方式會明顯改善執行速度。
5. 任務執行模式(懶人,圖源於網絡,謝作圖之人)
ansible系統由控制主機對被管節點的操作方式可分為兩類,即ad-hoc和playbook。
ad-hoc模式使用單個模塊,支持批量執行單條命令。
playbook模式是ansible的主要管理方式,通過多個task集合完成一類功能,可以簡單的理解為通過組合多條ad-hoc操作的配置文件。

6. ansible與其他配置管理軟件的對比
技術特性比較:
項目 | Puppet | Saltstack | Ansible |
開發語言 | Ruby | Python | Python |
是否有客戶端 | 是 | 是 | 否 |
是否支持二次開發 | 不支持 | 支持 | 支持 |
服務器與遠程機器是否相互驗證 | 是 | 是 | 是 |
服務器與遠程機器通信是否加密 | 是,標准SSL協議 | 是,使用AES加密 | 是,使用OpenSSH |
是否提供WEB UI | 提供 | 提供 | 提供,但是商業版本 |
配置文件格式 | Ruby語法 | YAML | YAML |
命令行執行 | 不支持,但可以通過配置模塊實現 | 支持 | 支持 |
二、ansible組件介紹
1. ansible inventory
在大規模的配置管理工作中我們需要管理不同業務的機器,這些機器的信息都存放在ansible的inventory組件里。在我們工作中配置部署針對的主機必須先存放在inventory里,這樣才能使用ansible對它進行操作。默認ansible的inventory是一個靜態的ini文件/etc/ansible/hosts。亦可通過ANSIBLE_HOSTS環境變量指定或者命令運行時用-i參數臨時設置。
參考示例:
定義主機和主機組
1、100.0.0.1 ansible_ssh_pass='123456'
2、100.0.0.2 ansible_ssh_pass='123456'
3、[docker]
4、100.0.0.1[1:3]
5、[docker:vars]
6、ansible_ssh_pass='123456'
7、[ansible:children]
8、docker
第一、二行定義一個主機,指定ssh登錄密碼
第三行定義了一個叫docker的組
第四行定義了docker組下面四個主機從100.0.0.11-100.0.0.13
第五、六行定義了docker組的ssh登錄密碼
第七、八行定義了ansible組,ansible組包含docker組
2.inventory內置參數
參考 | 解釋 | 例子 |
ansible_ssh_host | 將要連接的遠程主機名.與你想要設定的主機的別名不同的話,可通過此變量設置. | ansible_ssh_host=192.169.1.123 |
ansible_ssh_port | ssh端口號.如果不是默認的端口號,通過此變量設置. | ansible_ssh_port=5000 |
ansible_ssh_user | 默認的 ssh 用戶名 | ansible_ssh_user=cxpadmin |
ansible_ssh_pass | ssh 密碼(這種方式並不安全,我們強烈建議使用 --ask-pass 或 SSH 密鑰) | ansible_ssh_pass=’123456’ |
ansible_sudo_pass | sudo 密碼(這種方式並不安全,我們強烈建議使用 --ask-sudo-pass) | ansible_sudo_pass=’123456’ |
ansible_sudo_exe | sudo 命令路徑(適用於1.8及以上版本) | ansible_sudo_exe=/usr/bin/sudo |
ansible_connection | 與主機的連接類型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默認使用 paramiko.1.2 以后默認使用 'smart','smart' 方式會根據是否支持 ControlPersist, 來判斷'ssh' 方式是否可行. | ansible_connection=local |
ansible_ssh_private_key_file | ssh 使用的私鑰文件.適用於有多個密鑰,而你不想使用 SSH 代理的情況. | ansible_ssh_private_key_file=/root/key |
ansible_shell_type | 目標系統的shell類型.默認情況下,命令的執行使用 'sh' 語法,可設置為 'csh' 或 'fish'. | ansible_shell_type=zsh |
ansible_python_interpreter | 目標主機的 python 路徑.適用於的情況: 系統中有多個 Python, 或者命令路徑不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python.我們不使用 "/usr/bin/env" 機制,因為這要求遠程用戶的路徑設置正確,且要求 "python" 可執行程序名不可為 python以外的名字(實際有可能名為python26). |
ansible_python_interpreter=/usr/bin/python2.6 |
ansible_*_interpreter | 定義其他語言解釋器 | ansible_*_interpreter=/usr/bin/ruby |
ansible_sudo | 定義sudo用戶 | ansible_sudo=cxpadmin |
注:從ansible2.0開始, ansible_ssh_user, ansible_ssh_host, ansible_ssh_port已經改變為ansible_user, ansible_host, ansible_port。具體參考官網
http://docs.ansible.com/ansible/latest/intro_inventory.html
3. ansible ad-hoc命令
我們經常會通過命令行的形式使用ansible模塊,ansible自帶很多模塊,可以直接使用這些模塊。目前ansible已經自帶了200+個模塊,我們可以使用ansible-doc -l顯示所有自帶模塊,還可以使用ansible-doc 模塊名,查看模塊的介紹以及案例。需要注意的是,如果使用ad-hoc命令,ansible的一些插件功能就無法使用,比如loop facts功能等。
命令用法:ansible <host-pattern> [options]
常用模塊介紹
① ping模塊
ping模塊的作用與其名相同,即判斷遠程主機的網絡是否暢通
示例:ansible cluster_hosts -m ping
② copy模塊
copy模塊在ansible里的角色就是把ansible執行機器上的文件拷貝到遠程節點上。與fetch模塊相反的操作。
常用模塊參數
參數名 | 是否必須 | 默認值 | 選項 | 說明 |
src | no | 用於定位ansible執行的機器上的文件,需要絕對路徑。如果拷貝的是文件夾,那么文件夾會整體拷貝,如果結尾是”/”,那么只有文件夾內的東西被考過去。一切的感覺很像rsync | ||
content | no | 用來替代src,用於將指定文件的內容,拷貝到遠程文件內 | ||
dest | yes | 用於定位遠程節點上的文件,需要絕對路徑。如果src指向的是文件夾,這個參數也必須是指向文件夾 | ||
backup | no | no | yes/no | 備份遠程節點上的原始文件,在拷貝之前。如果發生什么意外,原始文件還能使用。 |
directory_mode | no | 這個參數只能用於拷貝文件夾時候,這個設定后,文件夾內新建的文件會被拷貝。而老舊的不會被拷貝 | ||
follow | no | no | yes/no | 當拷貝的文件夾內有link存在的時候,那么拷貝過去的也會有link |
force | no | yes | yes/no | 默認為yes,會覆蓋遠程的內容不一樣的文件(可能文件名一樣)。如果是no,就不會拷貝文件,如果遠程有這個文件 |
group | no | 設定一個群組擁有拷貝到遠程節點的文件權限 | ||
mode | no | 等同於chmod,參數可以為“u+rwx or u=rw,g=r,o=r” | ||
owner | no | 設定一個用戶擁有拷貝到遠程節點的文件權限 |
示例:將文件copy到測試主機
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
[root@node1 ansible]# ansible testservers -m copy -a 'src=/root/install.log dest=/tmp/install.log owner=testuser group=testgroup' 192.168.100.131 | success >> { "changed": true, "checksum": "7b3626c84bb02d12472c03d2ece878fdc4756c94", "dest": "/tmp/install.log", "gid": 1100, "group": "testgroup", "md5sum": "c7d8a01a077940859e773b7770d2e07e", "mode": "0644", "owner": "testuser", "size": 9458, "src": "/root/.ansible/tmp/ansible-tmp-1456387213.94-229503410500766/source", "state": "file", "uid": 1000 } 192.168.100.132 | success >> { "changed": true, "checksum": "7b3626c84bb02d12472c03d2ece878fdc4756c94", "dest": "/tmp/install.log", "gid": 1100, "group": "testgroup", "md5sum": "c7d8a01a077940859e773b7770d2e07e", "mode": "0644", "owner": "testuser", "size": 9458, "src": "/root/.ansible/tmp/ansible-tmp-1456387213.94-186055595812050/source", "state": "file", "uid": 1000 } |
示例:copy 前先備份
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
[root@node1 ansible]# echo "test " >> /root/install.log [root@node1 ansible]# ansible testservers -m copy -a 'src=/root/install.log dest=/tmp/install.log owner=testuser group=testgroup backup=yes' 192.168.100.132 | success >> { "backup_file": "/tmp/install.log.2016-02-25@16:01:26~", "changed": true, "checksum": "b5da7af32ad02eb98f77395b28f281a965b4c1f5", "dest": "/tmp/install.log", "gid": 1100, "group": "testgroup", "md5sum": "d39956add30a18019cb5ad2381a0cd43", "mode": "0644", "owner": "testuser", "size": 9464, "src": "/root/.ansible/tmp/ansible-tmp-1456387285.87-128685659798967/source", "state": "file", "uid": 1000 } 192.168.100.131 | success >> { "backup_file": "/tmp/install.log.2016-02-25@16:01:26~", "changed": true, "checksum": "b5da7af32ad02eb98f77395b28f281a965b4c1f5", "dest": "/tmp/install.log", "gid": 1100, "group": "testgroup", "md5sum": "d39956add30a18019cb5ad2381a0cd43", "mode": "0644", "owner": "testuser", "size": 9464, "src": "/root/.ansible/tmp/ansible-tmp-1456387285.86-134452201968647/source", "state": "file", "uid": 1000 } [root@node1 ansible]# ansible testservers -m raw -a 'ls -lrth /tmp/install*' 192.168.100.131 | success | rc=0 >> -rw-r--r-- 1 root root 9.3K 2 25 16:00 /tmp/install.log.2016-02-25@16:01:26~ -rw-r--r-- 1 testuser testgroup 9.3K 2 25 16:01 /tmp/install.log 192.168.100.132 | success | rc=0 >> -rw-r--r-- 1 root root 9.3K 2 25 16:00 /tmp/install.log.2016-02-25@16:01:26~ -rw-r--r-- 1 testuser testgroup 9.3K 2 25 16:01 /tmp/install.log |
示例:將目錄copy過去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
[root@node1 ansible]# tree testdir testdir ├── a │ ├── e │ │ └── ansible.cfg │ ├── f │ └── g ├── b │ ├── e │ ├── f │ └── g └── c ├── ansible.cfg ├── e ├── f └── g [root@node1 ansible]# ansible testservers -m copy -a 'src=/etc/ansible/testdir dest=/tmp/ owner=testuser group=testgroup backup=yes' 192.168.100.131 | success >> { "changed": true, "dest": "/tmp/", "src": "/etc/ansible/testdir" } 192.168.100.132 | success >> { "changed": true, "dest": "/tmp/", "src": "/etc/ansible/testdir" } [root@node1 ansible]# ansible testservers -m command -a 'tree /tmp/testdir' 192.168.100.131 | success | rc=0 >> /tmp/testdir |-- a | `-- e | `-- ansible.cfg |-- b | `-- e | `-- hosts `-- c `-- ansible.cfg 5 directories, 3 files 192.168.100.132 | success | rc=0 >> /tmp/testdir |-- a | `-- e | `-- ansible.cfg |-- b | `-- e | `-- hosts `-- c `-- ansible.cfg 5 directories, 3 files |
注意:發現有文件的目錄copy成功,空的目錄沒有copy過去
常用參數返回值
參數名 | 參數說明 | 返回值 | 返回值類型 | 樣例 |
src | 位於ansible執行機上的位置 | changed | string | /home/httpd/.ansible/tmp/ansible-tmp-1423796390.97-147729857856000/source |
backup_file | 將原文件備份 | changed and if backup=yes | string | /path/to/file.txt.2015-02-12@22:09~ |
uid | 在執行后,擁有者的ID | success | int | 100 |
dest | 遠程節點的目標目錄或文件 | success | string | /path/to/file.txt |
checksum | 拷貝文件后的checksum值 | success | string | 6e642bb8dd5c2e027bf21dd923337cbb4214f827 |
md5sum | 拷貝文件后的md5 checksum值 | when supported | string | 2a5aeecc61dc98c4d780b14b330e3282 |
state | 執行后的狀態 | success | string | file |
gid | 執行后擁有文件夾、文件的群組ID | success | int | 100 |
mode | 執行后文件的權限 | success | string | 0644 |
owner | 執行后文件所有者的名字 | success | string | httpd |
group | 執行后文件所有群組的名字 | success | string | httpd |
size | 執行后文件大小 | success | int | 1220 |
③ shell模塊
它負責在被ansible控制的節點(服務器)執行命令行。shell 模塊是通過/bin/sh進行執行,所以shell 模塊可以執行任何命令,就像在本機執行一樣。
常用參數
參數 | 是否必須 | 默認值 | 選項 | 說明 |
chdir | no | 跟command一樣的,運行shell之前cd到某個目錄 | ||
creates | no | 跟command一樣的,如果某個文件存在則不運行shell | ||
removes | no | 跟command一樣的,如果某個文件不存在則不運行shell |
示例1:
讓所有節點運行somescript.sh並把log輸出到somelog.txt。
$ ansible -i hosts all -m shell -a "sh somescript.sh >> somelog.txt"
示例2:
先進入somedir/ ,再在somedir/目錄下讓所有節點運行somescript.sh並把log輸出到somelog.txt。
$ ansible -i hosts all -m shell -a "somescript.sh >> somelog.txt" chdir=somedir/
示例3:
先cd到某個需要編譯的目錄,執行condifgure然后,編譯,然后安裝。
$ ansible -i hosts all -m shell -a "./configure && make && make insatll" chdir=/xxx/yyy/
④ command模塊
command 模塊用於運行系統命令。不支持管道符和變量等("<", ">", "|", and "&"等),如果要使用這些,那么可以使用shell模塊。在使用ansible中的時候,默認的模塊是-m command,從而模塊的參數不需要填寫,直接使用即可。
常用參數
參數 | 是否必須 | 默認值 | 選項 | 說明 |
chdir | no | 運行command命令前先cd到這個目錄 | ||
creates | no | 如果這個參數對應的文件存在,就不運行command | ||
executable | no | 將shell切換為command執行,這里的所有命令需要使用絕對路徑 | ||
removes | no | 如果這個參數對應的文件不存在,就不運行command |
示例1:
#ansible 命令調用command: ansible -i hosts all -m command -a "/sbin/shutdown -t now"
ansible命令行調用-m command模塊 -a表示使用參數 “”內的為執行的command命令,該命令為關機。
那么對應的節點(192.168.10.12,127.152.112.13)都會執行關機。
示例2:
# Run the command if the specified file does not exist. ansible -i hosts all -m command -a "/usr/bin/make_database.sh arg1 arg2 creates=/path/to/database"
利用creates參數,判斷/path/to/database這個文件是否存在,存在就跳過command命令,不存在就執行command命令。
⑤ raw模塊
raw模塊的功能與shell和command類似。但raw模塊運行時不需要在遠程主機上配置python環境。
示例:
在10.1.1.113節點上運行hostname命令
ansible 10.1.1.113 -m raw-a 'hostname|tee'
⑥ fetch模塊
文件拉取模塊主要是將遠程主機中的文件拷貝到本機中,和copy模塊的作用剛剛相反,並且在保存的時候使用hostname來進行保存,當文件不存在的時候,會出現錯誤,除非設置了選項fail_on_missing為yes
常用參數
參數 | 必填 | 默認值 | 選項 | 說明 |
Dest | Yes | 用來存放文件的目錄,例如存放目錄為backup,源文件名稱為/etc/profile在主機pythonserver中,那么保存為/backup/pythonserver/etc/profile | ||
Fail_on_missing | No | No | Yes/no | 當源文件不存在的時候,標識為失敗 |
Flat | No | 允許覆蓋默認行為從hostname/path到/file的,如果dest以/結尾,它將使用源文件的基礎名稱 | ||
Src | Yes | 在遠程拉取的文件,並且必須是一個file,不能是目錄 | ||
Validate_checksum | No | Yes | Yes/no | 當文件fetch之后進行md5檢查 |
示例1:
fetch一個文件保存,src表示為遠程主機上需要傳送的文件路徑,dest表示為本機上的路徑,在傳送過來的文件,是按照IP地址進行分類,然后路徑是源文件的路徑。在拉取文件的時候,必須拉取的是文件,不能拉取文件夾。
[root@ansibleserver ~]# ansible pythonserver -m fetch -a "src=/root/123 dest=/root"
SSH password:
192.168.1.60 | success >> {
"changed": true,
"dest": "/root/192.168.1.60/root/123",
"md5sum": "31be5a34915d52fe0a433d9278e99cac",
"remote_md5sum": "31be5a34915d52fe0a433d9278e99cac"
}
示例2:
指定路徑目錄進行保存。在使用參數為flat的時候,如果dest的后綴名為/,那么就會保存在目錄中,然后直接保存為文件名;當dest后綴不為/的時候,那么就會直接保存為kel的文件。主要是在於dest是否已/結尾,從而來區分這是個目錄還是路徑。
[root@ansibleserver ~]# ansible pythonserver -m fetch -a "src=/root/Ssh.py dest=/root/kel/ flat=yes"
SSH password:
192.168.1.60 | success >> {
"changed": true,
"dest": "/root/kel/Ssh.py",
"md5sum": "63f8a200d1d52d41f6258b41d7f8432c",
"remote_md5sum": "63f8a200d1d52d41f6258b41d7f8432c"
}
⑦ file模塊
主要用來設置文件、鏈接、目錄的屬性,或者移除文件、鏈接、目錄,很多其他的模塊也會包含這種作用,例如copy,assemble和template。
常用參數
參數 | 必填 | 默認 | 選項 | 說明 |
Follow | No | No | Yes/no | 這個標識說明這是系統鏈接文件,如果存在,應該遵循 |
Force | No | No | Yes/no | 強制創建鏈接在兩種情況下:源文件不存在(過會會存在);目標存在但是是文件(創建鏈接文件替代) |
Group | No | 文件所屬用戶組 | ||
Mode | No | 文件所屬權限 | ||
Owner | No | 文件所屬用戶 | ||
Path | Yes | 要控制文件的路徑 | ||
Recurse | No | No | Yes/no | 當文件為目錄時,是否進行遞歸設置權限 |
Src | No | 文件鏈接路徑,只有狀態為link的時候,才會設置,可以是絕對相對不存在的路徑 | ||
State | No | File | File/link Directory Hard/touch Absent |
如果是目錄不存在,那么會創建目錄;如果是文件不存在,那么不會創建文件;如果是link,那么軟鏈接會被創建或者修改;如果是absent,那么目錄下的所有文件都會被刪除,如果是touch,會創建不存在的目錄和文件 |
示例1:
設置文件屬性。文件路徑為path,表示文件路徑,設定所屬用戶和所屬用戶組,權限為0644。文件路徑為path,使用文件夾進行遞歸修改權限,使用的參數為recurse表示為遞歸。
[root@ansibleserver ~]# ansible pythonserver -m file -a "path=/root/123 owner=kel group=kel mode=0644"
SSH password:
192.168.1.60 | success >> {
"changed": true,
"gid": 500,
"group": "kel",
"mode": "0644",
"owner": "kel",
"path": "/root/123",
"size": 294,
"state": "file",
"uid": 500
}
[root@ansibleserver ~]# ansible pythonserver -m file -a "path=/tmp/kel/ owner=kel group=kel mode=0644 recurse=yes"
SSH password:
192.168.1.60 | success >> {
"changed": true,
"gid": 500,
"group": "kel",
"mode": "0644",
"owner": "kel",
"path": "/tmp/kel/",
"size": 4096,
"state": "directory",
"uid": 500
}
示例2:
創建目錄。創建目錄,使用的參數主要是state為directory。
[root@ansibleserver ~]# ansible pythonserver -m file -a "path=/tmp/kel state=directory mode=0755"
SSH password:
192.168.1.60 | success >> {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/kel",
"size": 4096,
"state": "directory",
"uid": 0
}
示例3:
修改權限。直接使用mode來進行修改權限。
[root@ansibleserver ~]# ansible pythonserver -m file -a "path=/tmp/kel mode=0444"
SSH password:
192.168.1.60 | success >> {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0444",
"owner": "root",
"path": "/tmp/kel",
"size": 4096,
"state": "directory",
"uid": 0
}
示例4:
創建軟連接。 src表示已經存在的文件,dest表示創建的軟連接的文件名,最后的state狀態為link。
root@ansibleserver tmp]# ansible pythonserver -m file -a "src=/tmp/1 dest=/tmp/2 owner=kel state=link"
SSH password:
192.168.1.60 | success >> {
"changed": true,
"dest": "/tmp/2",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "kel",
"size": 6,
"src": "/tmp/1",
"state": "link",
"uid": 500
}
⑧ yum模塊
Yum(全稱為 Yellow dog Updater, Modified)是一個在Fedora和RedHat以及CentOS中的Shell前端軟件包管理器。即安裝包管理模塊。
常用參數
參數名 | 是否必須 | 默認值 | 選項值 | 參數說明 |
conf_file | no | 設定遠程yum執行時所依賴的yum配置文件 | ||
disable_gpg_check | no | No | Yes/No | 在安裝包前檢查包,只會影響state參數為present或者latest的時候 |
list | No | 只能由ansible調用,不支持playbook,這個干啥的大家都懂 | ||
name | Yes | 你需要安裝的包的名字,也能如此使用name=python=2.7安裝python2.7 | ||
state | no | present | present/latest/absent | 用於描述安裝包最終狀態,present/latest用於安裝包,absent用於remove安裝包 |
update_cache | no | no | yes/no | 用於安裝包前執行更新list,只會影響state參數為present/latest的時候 |
示例1:
安裝httpd包
ansible host31 -m yum -a “name=httpd”
host31 | SUCCESS => {
“changed”: true,
“msg”: “”,
“rc”: 0,
“results”: [ xxxxx ]
示例2:
刪除httpd包
ansible host31 -m yum -a "name=httpd state=absent" host31 | SUCCESS => { "changed": true, "msg": "", "rc": 0, "results": [ xxxx ]
⑨ service模塊
service模塊其實就是linux下的service命令。用於service服務管理。
常用參數
參數名 | 是否必須 | 默認值 | 選項 | 說明 |
enabled | no | yes/no | 啟動os后啟動對應service的選項。使用service模塊的時候,enabled和state至少要有一個被定義 | |
name | yes | 需要進行操作的service名字 | ||
state | no | stared/stoped/restarted/reloaded | service最終操作后的狀態。 |
示例1:
啟動服務。
ansible host31 -m service -a "name=httpd state=started" host31 | SUCCESS => { "changed": true, "name": "httpd", "state": "started" }
示例2:
停止服務。
ansible host31 -m service -a "name=httpd state=stopped" host31 | SUCCESS => { "changed": true, "name": "httpd", "state": "stopped" }
示例3:
設置服務開機自啟動。
[root@host31 ~]# ansible host31 -m service -a "name=httpd enabled=yes state=restarted" host31 | SUCCESS => { "changed": true, "enabled": true, "name": "httpd", "state": "started" }
⑩ cron模塊
cron模塊用於管理計划任務。
參數名 | 是否必須 | 默認值 | 選項 | 說明 |
backup | 對遠程主機上的原任務計划內容修改之前做備份 | |||
cron_file | 如果指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶的任務計划 | |||
day | 日(1-31,*,*/2,……) | |||
hour | 小時(0-23,*,*/2,……) | |||
minute | 分鍾(0-59,*,*/2,……) | |||
month | 月(1-12,*,*/2,……) | |||
weekday | 周(0-7,*,……) | |||
job | 要執行的任務,依賴於state=present | |||
name | 該任務的描述 | |||
special_time | 指定什么時候執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly | |||
state | 確認該任務計划是創建還是刪除 | |||
user | 以哪個用戶的身份執行 |
示例:
ansible test -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
ansible test -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root
ansible test -m cron -a 'backup="True" name="test" minute="0" hour="5,2" job="ls -alh > /dev/null"'
ansilbe test -m cron -a 'cron_file=ansible_yum-autoupdate state=absent'
①① user模塊
user模塊是請求的是useradd, userdel, usermod三個指令。
常用參數
參數名 | 是否必須 | 默認值 | 選項 | 說明 |
home | 指定用戶的家目錄,需要與createhome配合使 | |||
groups | 指定用戶的屬組 | |||
uid | 指定用的uid | |||
password | 指定用戶的密碼 | |||
name | 指定用戶名 | |||
createhome | 是否創建家目錄 yes|no | |||
system | 是否為系統用戶 | |||
remove | 當state=absent時,remove=yes則表示連同家目錄一起刪除,等價於userdel -r | |||
state | 是創建還是刪除 | |||
shell | 指定用戶的shell環境 |
指定password參數時,不能使用明文密碼,因為后面這一串密碼會被直接傳送到被管理主機的/etc/shadow文件中,所以需要先將密碼字符串進行加密處理。然后將得到的字符串放到password中即可。不同的發行版默認使用的加密方式可能會有區別,具體可以查看/etc/login.defs文件確認,centos 6.5版本使用的是SHA512加密算法。
示例1:
目的:在指定節點上創建一個用戶名為nolinux,組為nolinux的用戶
命令:ansible 10.1.1.113 -m user -a 'name=nolinux groups=nolinux state=present'
執行命令:

示例2:
刪除用戶
命令:ansible 10.1.1.113 -m user -a 'name=nolinux groups=nolinux state=absent remove=yes'


①②group模塊
goup模塊請求的是groupadd, groupdel, groupmod 三個指令。參數參考ansible-hoc group
示例:
目的:在所有節點上創建一個組名為nolinux,gid為2014的組
命令:ansible all -m group -a 'gid=2014 name=nolinux'


①③script模塊
script模塊將控制節點的腳本執行在被控節點上。
示例:
[root@host31 ~]# ansible host32 -m script -a /tmp/hello.sh host32 | SUCCESS => { "changed": true, "rc": 0, "stderr": "", "stdout": "this is test from host32\r\n", "stdout_lines": [ "this is test from host32" ->執行結果 ] }
①④get_url模塊
該模塊主要用於從http、ftp、https服務器上下載文件(類似於wget)
常用參數
參數名 | 是否必須 | 默認值 | 選項 | 說明 |
sha256sum | 下載完成后進行sha256 check; | |||
timeout | 下載超時時間,默認10s | |||
url | 下載的URL | |||
url_password、url_username | 主要用於需要用戶名密碼進行驗證的情況 | |||
use_proxy | 是事使用代理,代理需事先在環境變更中定義 |
示例:
目的:將
http://10.1.1.116/favicon.ico文件下載到指定節點的/tmp目錄下
命令:ansible 10.1.1.113 -m get_url -a 'url=
http://10.1.1.116/favicon.ico dest=/tmp'

①⑤synchronize模塊
使用rsync同步文件。
參數名 | 是否必須 | 默認值 | 選項 | 說明 |
archive | 歸檔,相當於同時開啟recursive(遞歸)、links、perms、times、owner、group、-D選項都為yes ,默認該項為開啟 | |||
checksum | 跳過檢測sum值,默認關閉 | |||
compress | 是否開啟壓縮 | |||
copy_links | 復制鏈接文件,默認為no ,注意后面還有一個links參數 | |||
delete | 刪除不存在的文件,默認no | |||
dest | 目錄路徑 | |||
dest_port | dest_port:默認目錄主機上的端口 ,默認是22,走的ssh協議 | |||
dirs | 傳速目錄不進行遞歸,默認為no,即進行目錄遞歸 | |||
rsync_opts | rsync參數部分 | |||
set_remote_user | 主要用於/etc/ansible/hosts中定義或默認使用的用戶與rsync使用的用戶不同的情況 | |||
mode | push或pull 模塊,push模的話,一般用於從本機向遠程主機上傳文件,pull 模式用於從遠程主機上取文件 |
示例1:
目的:將主控方/root/a目錄推送到指定節點的/tmp目錄下
命令:ansible 10.1.1.113 -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes'
delete=yes 使兩邊的內容一樣(即以推送方為主)
compress=yes 開啟壓縮,默認為開啟

由於模塊,默認都是推送push。因此,如果你在使用拉取pull功能的時候,可以參考如下來實現
mode=pull 更改推送模式為拉取模式
示例2:
目的:將10.1.1.113節點的/tmp/a目錄拉取到主控節點的/root目錄下
命令:ansible 10.1.1.113 -m synchronize -a 'mode=pull src=/tmp/a dest=/root/'

示例3:
由於模塊默認啟用了archive參數,該參數默認開啟了recursive, links, perms, times, owner,group和-D參數。如果你將該參數設置為no,那么你將停止很多參數,比如會導致如下目的遞歸失敗,導致無法拉取

①⑥ 其他模塊:
mount模塊:配置掛載點
unarchive模塊:解壓文件模塊
本文的模塊簡介僅供參考,要想更好更簡便的使用,請多參考官網的幫助文檔
http://docs.ansible.com/ansible/latest/intro_adhoc.html 或者使用ansible-hoc 模塊名查看。網絡上的中文文檔更新不是很頻繁,不建議閱讀,建議閱讀官方英文文檔。

三、核心模塊playbook介紹
ansible的playbook的文件格式為YAML格式,所以希望大家在學習playbook之前先對YAML語法有一定的了解,否則在運行playbook的過程中會經常碰到莫名其妙的語法錯誤。
這邊以一個例子簡單介紹一下playbook。
示例目的:指定一個主機名,對這個主機進行配置操作。
先展示目錄結構
config-ansible
|___config_hosts.yml
|___roles
|___config_hosts
|___tasks
|___main.yml
|___config.yml
總共3個YAML文件,其中config_hosts.yml為總入口,在這個文件里調用roles/config_hosts/tasks目錄下的腳本。執行命令ansible-playbook config_hosts.yml 運行劇本。
config_hosts.yml內容為
1. ---
2. - hosts: node1
3. roles:
4. - config_hosts
第1行表示該文件是YAML文件,非必須。
第2行定義該playbook針對的目標主機。
第3、4行指定角色目錄,具體操作在角色中定義。
main.yml的內容為
1. ---
2. - include: config.yml
第2行指定此roles要導入的task文件。
config.yml的內容為
1. ---
2. - name: copy test.file
3. copy:
4. src: /home/test.file
5. dest: /home/test.file
6. owner: root
7. group: root
8. mode: 0777
9. force: yes
10.
11. - name: exec hello world script
12. script: /home/helloworld.sh
13.
14.- name: rm test.file
15. file: path=/home/test.file state=absent
config.yml文件內的代碼才是真正執行的任務代碼。總共有3個任務,第一個把/home目錄的test.file文件拷貝到目標主機的相同路徑下,第二個在目標主機執行/home目錄下的helloworld.sh,helloworld.sh的內容就是打印一條helloworld信息,第三個任務是使用file模塊把目標主機的/home/test.file文件刪除。
其實playbook就是各個模塊的組裝,此處只是拋磚引玉,其他模塊在playbook中的使用可自行學習,就不再介紹循環、條件判斷等功能的實現了。關於ansible playbook的目錄結構可以參考
http://docs.ansible.com/ansible/latest/playbooks_roles.html#dynamic-versus-static-includes 或者
https://github.com/ceph/ceph-ansible