本文轉自https://www.cnblogs.com/bananaaa/p/8143345.html
ansible概述
ansible是基於python開發的自動化運維工具(saltstack),其功能實現基於SSH遠程連接服務;ansible可實現批量系統配置、批量文件拷貝、批量運行命令的功能
軟件特點
不需要單獨安裝客戶端(no agent),基於系統自身的sshd服務
不需要服務端(no server)
需要依賴大量的模塊實現批量管理
配置文件無需配置
批量管理-自動化管理方案
簡單/易用/強大的選擇是ssh key+shell/pssh方案
方法:
利用ssh key執行命令,並將命令放在腳本里
利用ssh key執行命令,將命令放在腳本里,並加上相應的循環語句或判斷語句
sina cfengine/puppet較早,現在基本沒有企業使用
門戶級別常用puppet批量管理(複雜/笨重)
saltstack:簡單,功能強大(配置複雜)
ansible軟件實踐部署
1、yum安裝:需要先配置epel源
2、基於python pip庫安裝。參考《ansible簡易安裝》
部署完成後需要生成公鑰,並對受管主機進行免密操作,方便日常運維
[root@m01 ~]# rpm -ql ansible|egrep -v '/usr/share/|/usr/lib' /etc/ansible /etc/ansible/ansible.cfg #ansible配置文件 /etc/ansible/hosts #定義ansible可以管理的主機信息 /etc/ansible/roles #主要在自動化部署多臺主機時應用 /usr/bin/ansible /usr/bin/ansible-playbook #執行ansible劇本命令
主機管理方法
配置hosts文件文件格式
[group_name] IP IP ...
ansible語法參數總結
語法格式
ansible | group_name | -m | command | -a | 'command' |
命令 | 主機組模塊名 | 指定模塊參數 | 模塊名稱 | 指定利用模塊執行的動作參數 | 執行的命令/腳本 |
命令參數 | 參數說明 |
-m module_name | 相應名稱的模塊被執行 -m後邊是模塊的名稱 |
-a module_args | 模塊參數信息 -a後邊是要執行的命令,也可以寫一個IP,針對一臺機器來執行命令 |
-C,--check | 不做任何改變,只是嘗試預言一些可能出現的改變 |
--syntax-check | 執行語法檢查再劇本上,但是並不執行劇本 |
ansible常用模塊
常用模塊 | 模塊說明 |
command(重要模塊) | 執行命令模塊,ansible命令執行默認模塊 |
shell(重要模塊) | 執行shell腳本模塊 |
script(重要模塊) | 把腳本發到客戶端然後執行,執行腳本命令再遠程服務器上 |
copy(重要模塊) | 把本地文件發送到遠端 |
file | 設定文件屬性模塊 |
service | 系統服務管理模塊 |
cron | 計劃任務管理模塊 |
yum | yum軟件包安裝管理模塊 |
synchronize | 使用rsync同步文件模塊 |
mount | 掛載模塊 |
ansible幫助信息系統中查看方法: | ansible-doc -l 查看全部模塊列表信息 ansible-doc -s [模塊] 查看指定模塊用法參數信息 |
ping模塊
測試主機連通性
ansible group -m ping
模塊概要:
ping是一個簡單的測試模塊,這個模塊在成功連接時返回pong信息。在劇本中沒有意義,但能夠使用ansible命令驗證登陸能力和用於python的配置
非傳統ICMP ping,二十先檢查是否通過ssh登陸節點,再檢查python版本是否滿足要求,能滿足要求返回pong
command模塊
常見模塊 | 模塊說明 | |
chdir | 在執行命令前通過cd命令進入到指定目錄中 | ansible group_name -m command -a "chdir=/tmp ls" |
create | 定義一個文件是否存在,如果不存在運行相應命令,如果存在跳過此步驟 | ansible group_name -m command -a "pwd creates=/tmp/test_file" |
executable | 改變shell使用command進行執行,並且執行時要使用絕對路徑 | |
free_from | 命令模塊採用自由形式命令運行,即可以輸入任意Linux命令 | |
removes | 定義一個文件是否存在,如果存在運行相應命令,如果不存在跳過此步驟 | |
warn | 如果ansible配置文件中定義了命令警告,如果參數設置了no/false,將不會警告此行命令 |
模塊概要:
命令模塊中的多個參數設置用空格進行分割
命令模塊中不能出現"<"">""|"","";"and"&"如需使用這些功能,可用shell模塊
注:command模塊作爲默認模塊,在-m不指定具體模塊時,採用默認command模塊
debug模塊
msg:設置打印自定義消息;如果忽略,則打印通用信息
ansible group_name -m debug -a "msg=hello"
模塊概要:這個模塊會打印語句在執行時,並且能夠用於調試變量或表達式,可以不需要停止劇本,可以結合when指令一起進行調試
copy模塊
參數 | 參數說明 |
src | 被複制到遠程主機的本地文件。如果路徑是一個目錄,它將遞歸複製。如果路徑使用"/"來結尾,則只複製目錄裏的內容,如果沒有使用"/"來結尾,則包含目錄在內的整個內容全部複製 |
remote_src | 如果這個值設置爲True,將到遠程/目標主機的機器上搜索 |
dest | 必選項。要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目錄,那麼該路徑也必須是個目錄 |
owner | 設置複製傳輸後的數據屬主信息 |
group | 設置複製傳輸後的數據屬組信息 |
mode | 設置文件數據權限信息(注意4位) |
backup | 在覆蓋遠端服務器文件之前,將遠端服務器源文件備份,備份文件包含時間信息。有兩個選項:yes|no |
content | 用於替代"src”,可以直接設定指定文件的值 |
force | 如果目標主機包含該文件,但內容不同。 如果設置爲yes,則強制覆蓋;如果爲no,則只有當目標主機的目標位置不存在該文件時才複製,默認爲yes。 |
directory_mode | 遞歸設定目錄的權限,默認爲系統默認權限 |
模塊概要:
copy模塊拷貝文件從本地或遠程機器到遠程機器的一個目錄中,使用fetch模塊來拷貝文件從遠程區域到本地
如果需要複製文件中插入的變量值,可以使用template模塊
將test.txt文件複製到遠程主機,權限0600,屬主、屬組爲appuser
ansible group_name -m copy -a "src=/test.txt dest=/tmp/ mode=0600 owner=appuser group=appuser"
移動遠程主機上的文件到某個位置remote_src=true參數
拷貝test.txt文件到tmp下,權限600
ansible group_name -m copy -a "remote_src=true src=/opt/test.txt dest=/tmp mode=0600"
通過content定義文件內容,默認不換行
ansible group_name -m copy -a "content=helloworld dest=/opt/test.txt"
shell模塊
shell模塊在遠程執行腳本時,遠程主機上一定要有相應的腳本,且腳本路徑一致
ansible group_name -m shell -a "sh /path/test.sh"
執行shell語句
ansible group_name -m shell -a "cat /etc/passwd >> /tmp/test.txt"
script模塊
script與shell的區別
shell:需要腳本文件都在遠端服務器的相同位置才能執行腳本
script:只需要本地有腳本文件,不要將腳本複製到遠端服務器,是將腳本的執行過程在遠端服務器執行
ansible group_name -m script -a "/test.sh"
file模塊
參數 | 參數說明 | |
owner | 設置複製傳輸後的數據屬主信息 | |
group | 設置複製傳輸後的數據屬組信息 | |
mode | 設置文件數據權限信息 | |
dest | 要創建的文件或目錄命令,以及路徑信息 | |
src | 指定要創建軟鏈接的文件信息 | |
state | 參數 | 參數說明 |
directory | 所有不存在的子目錄將會被創建 | |
file | 文件不存在將不能被創建 | |
link | 符號鏈接(軟鏈接)將被創建或更改 | |
hard | 創建出硬鏈接 | |
absent | 目錄將被遞歸刪除以及文件,鏈接被取消 注意:定義文件不存在不會失敗,只是輸出沒有發生任何改變的結果 | |
touch | 如果路徑不存在將創建一個空文件,如果文件或目錄存在將接收更新的文件訪問和修改時間 |
創建遠端目錄
ansible group_name -m file -a "dest=/tmp/test_dir state=directory"
創建遠端文件
ansible group_name -m file -a "dest=/tmp/test_txt state=touch"
yum模塊
參數 | 參數說明 |
name=name | 指定安裝的軟件 |
state=installed | 安裝 |
遠端安裝apache
ansible group_name -m yum -a "name=httpd state=installed"
state狀態均爲過去是ed/d
service模塊
參數 | 參數說明 |
name=service name | 服務的名稱 |
state=參數 | 停止服務 服務狀態信息爲過去時 stared/stoped/restarted/reloaded |
enabled=yes | 設置開機自啓動 |
重啓計劃任務服務,name爲服務名稱,state爲動作,並取消開機自啓動
ansible group_name -m service -a "name=crond state=restarted enabled=no"
cron模塊
創建定時任務,name識別定時任務唯一性,只管理ansible信息
ansible group_name -m cron -a "name=01 minute=*/5 job='/usr/sbin/ntpdate time.nist.gov > /dev/null 2>&1'"
刪除定時任務
ansible group_name -m cron -a "name=None minute=*/5"
fetch模塊
參數 | 參數說明 |
dest | 將遠程主機拉取過來的文件保存在本地的路徑信息 |
src | 指定從遠程主機要拉取的文件信息,只能拉取文件 |
flat | 默認設置爲no,如果設置爲yes,將不顯示172.16.1.8/etc/信息 |
拉取遠端主機文件
ansible group_name -m fetch -a "dest=/tmp src=/tmp/test.txt"
拉取時不創建目錄(同名會覆蓋)
ansible group_name -m fetch -a "dest=/tmp/ src=/tmp/test.log flat=yes"
mount模塊
參數 | 參數說明 |
fstype | 指定掛載文件類型;-t nfs == fstype=nfs |
opts | 設定掛載的參數選項信息;-o ro == opts=ro |
path | 指定掛載點 path=/mnt |
src | 要被掛載的目錄設備信息 src=172.16.1.31:/data/w |
state | 01.如果爲mountd 在fstab文件中的設備將被激活掛載和適當配置 02.如果爲unmounted 設備將被卸載並不會改變fstab文件信息,absent和present只處理fstab,但不影響目前的掛載 |
掛載
ansible group_name -m mount -a "fstype=nfs opts=ro src=xxx.xxx.xxx.xxx:/dirname path=/mnt state=mounted"
卸載
ansible group_name -m mount -a "fstype=nfs opts=ro src=xxx.xxx.xxx.xxx:/dirname path=/mnt state=umounted"
palybook編寫
ansible特點:
可以實現批量管理、部署
ad-hoc(批量執行命令)針對臨時性的操作
ansible group_name -m command -a "hostname" <-批量執行命令舉例
編寫劇本(playbook)針對重複性操作
ansible核心功能
pyYAML:用於ansible編寫劇本所使用的語言格式(saltstack-python)
paramiko:遠程連接與數據傳輸
Jinja2:用於編寫ansible模板信息
playbook編寫規則:
縮進/空格
yaml使用一個固定的縮進風格表示數據層結構關係,saltstack需要每個縮進級別由兩個空格組成,一定不能使用tab
冒號
每個冒號前後一定要有空格(以冒號結尾不需要空格,表示路徑的模板不需要空格)
短橫線
表示列表項,使用一個短橫槓加一個空格,多個項使用同樣的縮進級別作爲同一個列表的一部分
核心規則:有效的利用空格進行劇本的編寫,劇本編寫不支持tab
劇本示例:vim httpd.yml
install httpd #名稱 - hosts: 192.168.40.110 #所處理的服務器IP,可以爲all格式(-(空)hosts:(空)IP/all) tasks: #要做什麼 - name: install httpd #要做的事情 yum: name=httpd state=installed #模塊名稱:(空)模塊對應的功能
劇本檢查方法
ansible-playbook --syntax-check httpd.yml ##語法檢查 ansible-playbook -C httpd.yml ##劇本模擬(彩排)可以查看修改了哪些內容
完整示例安裝、啓動和停止、卸載apache
install and uninstall httpd - hosts: 192.168.40.110 tasks: - name: install httpd yum: name=httpd state=installed - name: start httpd service: name: httpd state: started enabled: true - name: stop httpd service: name=httpd state=stopped - name: uninstall httpd yum: name=httpd state=removed
多主機格式
- hosts: 10.1.1.x tasks: - name: xxxx module: name=xxx state=xxxx - hosts: 10.1.1.x tasks: - name: xxxx module: name=xxx state=xxxx
劇本排錯方法
ansible-playbook編寫玩,檢查語法和模擬測試運行
打開劇本,定位異常問題原因,將劇本中的內容轉換成命令執行一次
將參數中的腳本文件推送到遠程服務器,再遠程服務器本地執行腳本
說明:ansible執行時,加上-vvvv顯示ansible詳細執行過程,也可以定位異常原因