服務器版本信息:
Centos6.9
[root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
ansible軟件介紹
ansible是一個基於Python開發的自動化運維工具!
其功能實現基於SSH遠程連接服務!
ansible可以實現批量系統配置、批量軟件部署、批量文件拷貝、批量運行命令等功能
ansible官方資料
官網:http://www.ansible.com/home
官網文檔:http://docs.ansible.com/ansible/index.html
ansible軟件特點
- 不需要單獨安裝客戶端,基於系統自帶的sshd服務,sshd就相當於ansible的客戶端
- 不需要服務端
- 依靠大量的模塊實現批量管理
- 配置文件/etc/snsible/ansible.cfg,不用配置
ansible輸出結果的顏色
- 輸出內容顯示綠色:表示執行成功,當沒有任何改變
- 輸出內容顯示黃色:表示執行成功,但對被管理主機進行了改變
- 輸出內容顯示紅色:表示執行失敗
ansible參數
命令參數 |
參數說明 |
-m MODULE_NAME |
--module-name=MODULE_NAME module name to execute (default=command) 相應名稱的模塊被執行(默認模塊為 command ); -m后邊是模塊的名字 |
-a MODULE_ARGS |
--args=MODULE_ARGS module arguments 模塊參數信息; -a后面是要執行的命令;也可以寫一個 ip ,針對一台機器來執行命令 |
-C,--check |
don’t make any changes; instead, try to predict some of the changes that may occur 不做任何改變;反而,只是嘗試預言一些可能出現的改變 |
--syntax-check |
perform a syntax check on the playbook, but do not execute it 執行語法檢查在劇本上,但是並不執行劇本 |
ansible部署
第一步、首先部署ssh+key免密碼登陸方式
ssh+key部署:
http://www.cnblogs.com/lyq863987322/p/7886344.html
第二步、被管理端安裝libselinux
yum install libselinux-python -y
第三步、服務端安裝ansible,配置文件編寫
yum install ansible -y
ansible的重要目錄
/etc/ansible/hosts --- 定義anisble軟件可以管理的主機信息
/usr/bin/ansible --- ansible執行命令
/usr/bin/ansible-playboot --- ansible執行劇本命令
/etc/ansible/hosts 配置文件編寫舉例
在配置文件中添加被管理主機的ip模塊
[name] 172.16.1.21 172.16.1.11 172.16.1.1
在/etc/ansible/host文件最后添加[]下面接想要管理的主機ip,[]中起任意名字
測試控制這三台主機
命令語法:

ansible name -m shell -a "hostname" ansible ---- 命令 name ---- 主機模塊名稱 -m ---- 指定模塊的參數 shell --- 模塊名稱(不同模塊不同名稱) -a --- 指定利用模塊執行的動作參數 "hostname" ---- 在被控主機上批量執行的操作
[root@m01 scripts]# ansible name -m shell -a "hostname" 172.16.1.21 | SUCCESS | rc=0 >> backup 172.16.1.11 | SUCCESS | rc=0 >> nfs01 172.16.1.1 | SUCCESS | rc=0 >> web01
這樣就已經可以批量控制多台主機了,主要配置中需要注意的是ssh+key的配置。
如果沒有配置ssh+key密鑰分發的話,可以在/etc/ansible/host文件配置管理主機的時候 在ip后面空格接:ansible_ssh_user=用戶 ansible_ssh_pass=密碼,這樣也可以管理
ansible幾個常用模塊
ansible幫助:
ansible-doc -l ---列出所有模塊信息
ansible-doc -s 模塊名 ---看執行模塊信息
常用模塊 |
模塊說明 |
command (重要模塊) |
執行命令模塊,ansible命令執行默認模塊 |
shell (重要模塊) |
執行shell腳本模塊 |
script (重要模塊) |
把腳本發到客戶端,然后執行;執行腳本命令在遠端服務器上 |
copy (重要模塊) |
把本地文件發送到遠端 |
file |
設定文件屬性模塊 |
service |
系統服務管理模塊 |
cron |
計划任務管理模塊 |
yum |
yum軟件包安裝管理模塊 |
mount |
掛載模塊 |
synchronize |
使用rsync同步文件模塊 |
command模塊
ansible中的遠程執行命令模塊
- 命令模塊中的多個參數設置用空格進行分隔
- 命令模塊中不能出現"<" ">" "|" ";" "&"
參數 |
說明 |
chdir |
在執行命令之前,通過cd命令進入到指定目錄中 |
creates |
定義一個文件是否存在,如果不存在運行相應命令;如果存在跳過此步驟 |
executable |
改變shell使用command進行執行,並且執行時要使用絕對路徑 |
free_form |
free_form 命令模塊采用自由形式命令運行;即可以輸入任意linux命令 |
removes |
定義一個文件是否存在,如果存在運行相應命令;如果不存在跳過此步驟 |
warn |
如果ansible配置文件中定義了命令警告,如果參數設置了no/false,將不會警告此行命令 |
實例:
chdir參數:在執行命令之前,通過cd命令進入到指定目錄

[root@m01 scripts]# ansible oldboy -m command -a "chdir=/tmp pwd" 172.16.1.21 | SUCCESS | rc=0 >> /tmp 172.16.1.11 | SUCCESS | rc=0 >> /tmp 172.16.1.1 | SUCCESS | rc=0 >> /tmp
creates參數:定義一個文件是否存在,如果不存在運行相應命令;如果存在跳過此步驟

[root@m01 scripts]# ansible name -m command -a "pwd creates=/tmp/oldboy.txt" 172.16.1.21 | SUCCESS | rc=0 >> /root 172.16.1.11 | SUCCESS | rc=0 >> /root 172.16.1.1 | SUCCESS | rc=0 >> /root
shell模塊
參數 |
說明 |
chdir |
在執行命令之前,通過cd命令進入到指定目錄中 |
creates |
定義一個文件是否存在,如果不存在運行相應命令;如果存在跳過此步驟 |
executable |
改變shell使用command進行執行,並且執行時要使用絕對路徑 |
free_form |
free_form 命令模塊采用自由形式命令運行;即可以輸入任意linux命令 |
removes |
定義一個文件是否存在,如果存在運行相應命令;如果不存在跳過此步驟 |
warn |
如果ansible配置文件中定義了命令警告,如果參數設置了no/false,將不會警告此行命令 |
shell模塊類似於command模塊,最大區別是shell模塊可以執行腳本

[root@m01 scripts]# ansible name -m shell -a "sh /server/scripts/name.sh" 172.16.1.21 | SUCCESS | rc=0 >> nfs01 172.16.1.11 | SUCCESS | rc=0 >> backup 說明:shell模塊在遠程執行腳本時,遠程主機上一定要有相應腳本
script模塊
在本地執行腳本時,將腳本中的內容傳輸到遠程節點上運行
creates |
定義一個文件是否存在,如果不存在運行相應命令;如果存在跳過此步驟 command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database |
free_form |
命令模塊采用自由形式命令運行;即可以輸入任意linux命令 |
removes |
定義一個文件是否存在,如果存在運行相應命令;如果不存在跳過此步驟 |
實例:

[root@m01 scripts]# ansible name -m script -a "/tmp/name.sh" 172.16.1.21 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.1.21 closed.\r\n", "stdout": "nfs01\r\n", "stdout_lines": [ "nfs01" ] } 172.16.1.11 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.1.11 closed.\r\n", "stdout": "backup\r\n", "stdout_lines": [ "backup" ] } 說明:不需要將腳本傳輸到遠程節點上,腳本本身不用進行授權,即可利用script模塊批量執行腳本
copy模塊
將本地數據傳輸到遠端,或者將遠程節點上的數據進行移動
選項參數 |
選項說明 |
backup (重要參數) |
創建備份文件包含時間戳信息,以便能夠還原回原文件,在某種情況原文件被覆蓋錯誤時。 |
content |
當使用代替src參數時,將文件的內容直接設置為指定值。遠端創建有指定內容文這是只是簡單值,對於任何復雜或者有格式化的內容,請切換到template模塊 |
dest |
文件應該被拷貝到的遠程絕對路徑信息。如果src是一個目錄,dest也必須是目錄 |
directory_mode |
當遞歸復制設置目錄權限時,如果沒有設置權限,將使用系統默認這個權限值設置在目錄上只對於最近創建的,並且對於已經存在的沒有效果 |
force |
默認為yes,當遠程文件內容和源文件內容不同時,將覆蓋目標文件如果為no,文件將只被傳輸,在目標主機不存在此文件時 別名:thirsty |
group |
定義所擁有文件/目錄的所屬組名稱,類似交由chown命令進行處理 |
mode |
定義文件或目錄的權限信息;就像使用/usr/bin/chmod 設定八進制數(如0644)取消掉前導零可能會有意想不到的結果。作為1,8版本,可以指定為符號模式(如 u+rwx or u=rw,g=r,o=r) |
owner |
定義所擁有文件/目錄的所屬用戶名稱,類似交由chown命令進行處理 |
src |
本地路徑文件復制到遠程服務器;可以是絕對路徑也可以是相對路徑如果路徑是一個目錄,將會遞歸復制。在這種情況下,如果路徑以“/”結束,只將在該目錄的內容復制到目的地否則,如果它不以“/”結束,目錄和目錄下所有內容都會被復制以上這種復制方式類似於rsync |
remote_src |
如果這個值設置為True,將到遠程目標主機的機器上搜索 |
validate |
在文件復制到相應目錄位置之前,運行驗證命令要驗證的文件的路徑通過%s傳遞,並且要在下面的例子中顯示 |
實例:

[root@m01 scripts]# ansible name -m copy -a "src=/etc/hosts dest=/tmp/ mode=0777" 172.16.1.21 | SUCCESS => { "changed": true, "checksum": "da5234fc498b2c3bf8b98f6b08fe1d6d96e653c2", "dest": "/tmp/hosts", "gid": 0, "group": "root", "md5sum": "2253445a36ed3910d50887a6eb1e4b79", "mode": "0777", "owner": "root", "size": 393, "src": "/root/.ansible/tmp/ansible-tmp-1508394462.54-228657061248374/source", "state": "file", "uid": 0 } 172.16.1.11 | SUCCESS => { "changed": true, "checksum": "da5234fc498b2c3bf8b98f6b08fe1d6d96e653c2", "dest": "/tmp/hosts", "gid": 0, "group": "root", "md5sum": "2253445a36ed3910d50887a6eb1e4b79", "mode": "0777", "owner": "root", "size": 393, "src": "/root/.ansible/tmp/ansible-tmp-1508394462.62-205181338927486/source", "state": "file", "uid": 0 }
說明:
1. 如果指定的目標目錄不存在,系統會自動創建,否則源目錄會放到目標目錄下面去
2. 如果copy的是文件,dest指定的名字和源如果不同,並且它不是已經存在的目錄,相當於copy過去后在重命名;
3. 如果dest是目標機器上已經存在的目錄,則會直接把文件copy到該目錄下面。
4. 設定的用戶和組oldboy在所有客戶端必須存在
給文件加內容:

[root@m01 scripts]# ansible name -m copy -a "content=lyq.com\n dest=/tmp/1" 172.16.1.11 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/1", "gid": 0, "group": "root", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "mode": "0644", "owner": "root", "size": 7, "src": "/root/.ansible/tmp/ansible-tmp-1508465641.79-151255543511039/source", "state": "file", "uid": 0 } 172.16.1.21 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/1", "gid": 0, "group": "root", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "mode": "0644", "owner": "root", "size": 7, "src": "/root/.ansible/tmp/ansible-tmp-1508465641.82-210493742853029/source", "state": "file", "uid": 0 }
file模塊
設置文件屬性
參數 |
說明 |
force |
強行創建符號鏈接的兩種情況: 源文件不存在(但是日后會出現) 目標存在並且是一個文件(因此,我們需要將“路徑”文件取消,並創建“src”文件的符號鏈接) |
group |
定義所擁有文件/目錄的所屬組名稱,類似交由chown命令進行處理 |
mode |
定義文件或目錄的權限信息;就像使用/usr/bin/chmod 設定八進制數(如0644)取消掉前導零可能會有意想不到的結果。作為1,8版本,可以指定為符號模式(如 u+rwx or u=rw,g=r,o=r) |
owner |
定義所擁有文件/目錄的所屬用戶名稱,類似交由chown命令進行處理 |
path |
文件路徑管理: 別名方式:dest,name |
recurse |
遞歸設置指定文件屬性(這個參數值應用對於state=directory) |
src |
要鏈接的文件路徑(只能應用 state=link),接受絕對 相對以及不存在的路徑相對路徑不能擴展 |
state (重要參數) |
如果指定參數為directory |
實例:
創建目錄/刪除目錄

[root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_dir state=directory" 172.16.1.11 | SUCCESS => { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/oldboy_dir", "size": 4096, "state": "directory", "uid": 0 } 172.16.1.21 | SUCCESS => { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/oldboy_dir", "size": 4096, "state": "directory", "uid": 0 } [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_dir state=absent" 172.16.1.11 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_dir", "state": "absent" } 172.16.1.21 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_dir", "state": "absent" }
創建文件/刪除文件

[root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file state=touch" 172.16.1.11 | SUCCESS => { "changed": true, "dest": "/tmp/oldboy_file", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0 } 172.16.1.21 | SUCCESS => { "changed": true, "dest": "/tmp/oldboy_file", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0 } [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file state=absent" 172.16.1.11 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_file", "state": "absent" } 172.16.1.21 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_file", "state": "absent" }
創建軟連接/刪除軟連接

[root@m01 scripts]# ansible name -m file -a "src=/tmp/lyq_file dest=/tmp/lyq_file_link state=link" 172.16.1.11 | SUCCESS => { "changed": true, "dest": "/tmp/oldboy_file_link", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 16, "src": "/tmp/oldboy_file", "state": "link", "uid": 0 } 172.16.1.21 | SUCCESS => { "changed": true, "dest": "/tmp/oldboy_file_link", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 16, "src": "/tmp/oldboy_file", "state": "link", "uid": 0 } [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file_link state=absent" 172.16.1.21 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_file_link", "state": "absent" } 172.16.1.11 | SUCCESS => { "changed": true, "path": "/tmp/oldboy_file_link", "state": "absent" }
fetch模塊
將遠程主機上的文件,拉取到本地
參數 |
說明 |
dest |
定義一個保存文件的目錄(將遠程主機拉去過來的文件保存在本地的路徑信息) |
src |
指定從遠程主機要拉取的文件信息 |
flat |
默認設置為no,如果設置為yes,將不顯示路徑信息 |
實例:
從遠程主機拉取文件

[root@m01 scripts]# ansible name -m fetch -a "dest=/tmp src=/tmp/1" 172.16.1.11 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/172.16.1.11/tmp/1", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "remote_md5sum": null } 172.16.1.21 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/172.16.1.21/tmp/1", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "remote_md5sum": null }
flat 默認設置為no,如果設置為yes,將不顯示路徑信息

[root@m01 scripts]# ansible name -m fetch -a "dest=/tmp/ src=/tmp/1 flat=yes" 172.16.1.21 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/1", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "remote_md5sum": null } 172.16.1.11 | SUCCESS => { "changed": true, "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "dest": "/tmp/1", "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", "remote_md5sum": null }
mount模塊
控制激活和配置掛載點模塊
參數 |
說明 |
fstype |
指定掛載文件類型 |
path |
指定掛載點 |
opts |
設定掛載的參數選項信息 |
src |
要被掛載的目錄設備信息(共享目錄) |
boot |
確定是否在啟動時文件系統被掛載 |
dump |
Dump(參見 fstab5)。注意如果設置為null或狀態設置為present,它將停止工作,並將在隨后的運行中復制條目 |
state |
如果為mounted在fstab文件中的設備將被激活掛載和適當配置 # 如果為unmounted設備將被卸載並不會改變fstab文件信息bsent和present只處理fstab,但不影響目前的掛載 |
cron模塊
定時任務模塊
參數 |
說明 |
minute |
分 |
hour |
時 |
day |
日 |
month |
月 |
weekday |
周 |
job |
定時任務中要執行的操作 |
name |
定義定時任務的描述信息 |
state=absent |
刪除定時任務 |
disabled |
注釋定時任務 |
實例:
創建定時任務

[root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null'" 172.16.1.21 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "None" ] } 172.16.1.11 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "None" ] }
刪除定時任務

[root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null' state=absent"
注釋定時任務

[root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null' state=disabled"
user模塊
管理用戶賬戶
參數 |
說明 |
append |
如果為yes,將只添加組,而不是將它們設置為組中的列表 |
name |
要操作的用戶名稱 |
shell |
指定用戶的使用命令路徑(如:/bin/bash) |
comment |
可選設置用戶賬號描述信息(又稱為 GECOS) |
createhome |
除非設置為no,否則當創建賬戶或不存在主目錄時,將為用戶創建一個主目錄 |
user |
創建,移除或修改的用戶名稱信息 |
uid |
可選設置用戶UID信息 |
實例:

[root@m01 ansible-playbook]# ansible 172.16.1.1 -m user -a "user=lyq uid=2222" 172.16.1.1 | SUCCESS => { "append": false, "changed": true, "comment": "", "group": 500, "home": "/home/lyq", "move_home": false, "name": "lyq", "shell": "/bin/bash", "state": "present", "uid": 2222 }
ansible劇本
檢查劇本:
ansible-playbook --syntax-check 劇本名 ----進行劇本配置信息語法檢查
ansible-playbook -C 劇本名 ----模擬劇本執行
ansible核心功能
- pyYAML -----用於ansible編寫劇本所使用的語言格式
- paramiko ---遠程連接與數據傳輸
- Jinja2 -----用於編寫ansible的模塊信息
ansible劇本編寫規則
pyYAML語法規則
一:縮進
yaml使用一個固定的縮進風格表示數據層結構關系,Saltstack需要每個縮進級別由兩個空格組成。一定不能使用tab鍵(tab在vim編輯中是8個空格)
二:冒號
每個冒號后面一定要有一個空格(以冒號結尾不需要空格,表示文件路徑的模版可以不需要空格)
三:短橫線
- 想要表示列表項,使用一個短橫杠加一個空格。多個項使用同樣的縮進級別作為同一個列表的一部分。
- 核心規則:有效的利用空格進行劇本的編寫,劇本編寫是不支持tab的。
ansible-playbook編寫格式
劇本開頭,可以不寫
這兩項必須要寫:
- hosts:(空格)all 處理所有服務器,找到所有服務器
tasks: 劇本要干的事
檢查劇本命令
ansible-playbook --syntax-check 劇本 ----進行劇本配置信息語法檢查
ansible-playbook -C 劇本 ----模擬劇本執行
劇本實例
rsync一鍵部署劇本
- name: 后面是可以加入提示信息的
[root@m01 ansible-playbook]# vim rsync.yml - hosts: 172.16.1.21 tasks: - name: yum: name=rsync state=installed - name: copy: src=/tmp/rsyncd.conf dest=/etc/ - name: shell: userdel -r rsync && useradd rsync -M -s /sbin/nologin - name: shell: mkdir -p /backup/ && chown rsync.rsync /backup - name: copy: src=/tmp/rsync.password dest=/etc/ - name: shell: rsync --daemon creates=/var/run/rsyncd.pid - hosts: 172.16.1.11 tasks: - name: copy: content=lyq123 dest=/etc/rsync.password
寫的不好的地方,請大家多多包涵