ansible服務及劇本編寫

本文轉自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語法參數總結

語法格式

ansiblegroup_name-mcommand-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計劃任務管理模塊
yumyum軟件包安裝管理模塊
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編寫規則:

    1. 縮進/空格

      1. yaml使用一個固定的縮進風格表示數據層結構關係,saltstack需要每個縮進級別由兩個空格組成,一定不能使用tab

    2. 冒號

      1.  每個冒號前後一定要有空格(以冒號結尾不需要空格,表示路徑的模板不需要空格)

    3. 短橫線

      1. 表示列表項,使用一個短橫槓加一個空格,多個項使用同樣的縮進級別作爲同一個列表的一部分

核心規則:有效的利用空格進行劇本的編寫,劇本編寫不支持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

劇本排錯方法

  1. ansible-playbook編寫玩,檢查語法和模擬測試運行

  2. 打開劇本,定位異常問題原因,將劇本中的內容轉換成命令執行一次

  3. 將參數中的腳本文件推送到遠程服務器,再遠程服務器本地執行腳本

說明:ansible執行時,加上-vvvv顯示ansible詳細執行過程,也可以定位異常原因













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章