ansible批量管理服務詳解

   在開始之前我們先試想一個場景,你的公司有成百上千臺的服務器,這時候領導要求在所有服務器上都添加一個定時任務,或者是執行某個命令,你可能會說用xshell一個一個去連或者是編寫一個shell腳本,但是如果過你經歷過類似的事情,你一定可以體會到其中的痛苦,因爲這麼多服務器你用xshell去連的話工作量將變得特別大,但如果你是選擇寫一個腳本的話也會特別的麻煩,因爲每執行一個不同的東西你就要去修改腳本的類容,而且批量腳本一般採用循環的方式去執行一些任務,如果節點太多的話,執行的效率會變得比較低,而批量管理工具一般採用的是並行的方式去執行一些任務或命令,這樣在效率上也得到了一定的提升,常見的批量管理工具有ansible,saltstack,puppet
   ansible是用python開發的一款自動化運維工具,基於ssh協議進行遠程的批量管理,ansible與同類別的軟件對比,最大的有優勢就是使用起來方便,簡單,快捷,所以被諸多的運維小夥伴兒所喜愛

一、ansible軟件部署流程

(一)、環境規劃

server type ipaddress hostname
管理主機 10.0.0.61 m01
受控主機 10.0.0.41 backup
受控主機 10.0.0.31 nfs01
受控主機 10.0.0.7 web01

PS:以上所有主機均爲centos6.9操作系統

(二)、創建ssh密鑰對並批量分發密鑰信息

  • 在管理主機上創建此腳本並執行

[root@m1 ~]# vim /service/scripts/fenfa_key.sh

#!/bin/bash
rm /root/.ssh/id_dsa
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
for ip in 31 41 7
do
sshpass -p666666 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 10.0.0.$ip"
done
[root@m1 scripts]# sh fenfa_key.sh

  • 在執行完批量分發腳本之後爲了保證ssh可以通過密鑰的方式進行連接,我們可以寫一個測試腳本進行測試

[root@m1 ~]# vim /service/scripts/jiancha_scripts.sh

#/bin/bash
if [ $# -ne 1 ]
then
echo "pls input one agrs"
exit 1
fi
for ip in 31 41 7
do
echo ==============info 10.0.0.$ip==============
ssh 10.0.0.$ip $1
echo ""
done
[root@m1 ~]# sh /service/scripts/jiancha_scripts.sh hostname
==============info 10.0.0.31==============
nfs01

==============info 10.0.0.41==============
backup

==============info 10.0.0.7==============
web01

(三)、通過yum安裝ansible軟件

  • 注意在安裝之前我們需要確認自己的管理主機服務器上邊安裝了epel源,如果沒有可以通過下邊這條命令進行下載阿里的epel源
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

[root@m1 ~]# yum -y install ansible

小提示:在有的時候我們可能爲了服務器的安全性開啓了系統當中的selinux,這時候selinux就有可能阻止了正常的ssh服務的連接,導致ansible命令運行失敗,如果你懂selinux還好,如果你不懂selinux怎麼辦呢?這時候可以在受控端通過 yum install -y libselinux-python 安裝ansible官方提供的一個軟件來解決因selinux而無法正常使用ansible命令的問題

(四)、在管理主機上添加受控端

[root@m1 ~]# vim /etc/ansible/hosts

[SA]
10.0.0.7
10.0.0.31
10.0.0.41

配置說明:[SA]是受控端主機的組名,下邊的ip地址爲受控端主機的ip地址,如果有需要可以設置多個組名,方便管理
至此ansible軟件部署完成

二、ansible軟件的應用

(一)、ansible應用語法

  • ansible 受控端主機信息或者主機組信息 -m 模塊名稱 -a 相關模塊參數

    (二)、ansible常用模塊

    1、 command模塊

    在遠程節點上執行命令

  • chidir-->(在運行命令之前切換到此目錄)
    一個栗子:[root@m1 ~]# ansible 10.0.0.31 -m command -a "chdir=/tmp/ pwd"
         10.0.0.31 | SUCCESS | rc=0 >>
         /tmp
  • creates-->(判斷一個文件或目錄是否存在,如果不存在則執行後邊的命令)
    一個栗子:[root@m1 ~]# ansible 10.0.0.31 -m command -a "creates=/etc/dd hostname"
         10.0.0.31 | SUCCESS | rc=0 >>
         nfs01
  • removes -->(判斷一個文件是否存在,如果不存在則不執行後邊的命令)
    [root@m1 ~]# ansible 10.0.0.31 -m command -a "removes=/etc/dd hostname"
    10.0.0.31 | SUCCESS | rc=0 >>
    skipped, since /etc/dd does not exist

    2、shell模塊

    shell模塊可以滿足command模塊所有功能,並且可以支持識別特殊字符信息,可以理解成一個萬能的模塊,參數也基本與command相同
    一個栗子:[root@m1 ~]# ansible 10.0.0.31 -m shell -a "cd /etc/;pwd"
         10.0.0.31 | SUCCESS | rc=0 >>
         etc

    3、scripts模塊

    一個專門執行腳本的模塊,即把腳本里邊的類容在遠端節點上執行
    一個栗子:[root@m1 scripts]# ansible 10.0.0.31 -m script -a "/service/scripts/test.sh"

    4、copy模塊

    將文件複製到遠端節點上

  • backup-->(覆蓋文件前備份源文件)
  • src--->(指定要推送的數據信息)
  • dest-->(定義數據推送到遠程目錄的什麼節點中)
  • owner--->(設置複製後的文件屬主權限)
  • group--->(設置複製後的文件屬組權限)
  • mode--->(設置複製後的文件權限)
    一個栗子:[root@m1 ~]# ansible 10.0.0.31 -m copy -a "src=/tmp/aa.txt dest=/tmp/ backup=yes mode=777"
    說明:將管理主機下/tmp/aa.txt 文件推到0.31遠程節點/tmp/目錄下並備份源文件且把文件權限改爲777

    5、file模塊

    用於修改文件屬性或者創建文件或目錄

  • owner--->(設置複製後的文件屬主權限)
  • group--->(設置複製後的文件屬組權限)
  • mode--->(設置複製後的文件權限)
  • state---->(創建文件或目錄)
    幾個栗子:
    [root@m1 tmp]# ansible 10.0.0.31 -m file -a "dest=/tmp/bb state=directory"------>(在遠程節點上創建目錄)
    [root@m1 tmp]# ansible 10.0.0.31 -m file -a "dest=/tmp/bb.txt state=touch mode=644"--->(在遠程節點上穿件文件,並修改權限)

    6、yum模塊

    用於安裝卸載查看遠程節上的程序包

  • name-->(執行要安裝軟件的名稱,以及軟件的版本)
  • state-->(installed安裝 absent(卸載)
  • list-->(指定軟件名稱,查看軟件是否可以安裝,以及是否已經安裝過了)
    幾個栗子
    [root@m1 tmp]# ansible 10.0.0.31 -m yum -a "name=iftop state=absent"-->(卸載iftop軟件)
    [root@m1 tmp]# ansible 10.0.0.31 -m yum -a "name=iftop state=installed"-->(安裝iftop軟件)
    [root@m1 tmp]# ansible 10.0.0.31 -m yum -a "list=iftop"-->(查看iftop軟件)

    7、service模塊

    用於管理遠程節點服務運行狀態及開機自啓

  • name-->(指定要管理的服務名稱;注意:管理的服務一定在chkconfig中可以看到)
  • state-->(用於設置服務的狀態如:stopped started restarted reloaded)
  • enabled-->(設置服務是否開機自啓動,yes表示服務開機自啓動 no表示服務開機不要自動啓動)

一個栗子
[root@m1 tmp]# ansible 10.0.0.31 -m service -a "name=crond state=stopped enabled=on"-->(將crond這個服務關閉並設置開機不要啓動)

8、cron模塊

用於管理遠端節點的定時任務

  • minute  -->(分)
  • hour   -->(時)
  • day   -->(日)
  • month  -->(月)
  • weekday -->(周)
  • name   -->(指定定時任務的名字)
  • job    -->(要乾的事情)
  • state-->(對定時任務執行什麼操作如:absent刪除定時任務)
  • disabled-->(註釋某個定時任務,yes標識註釋,no 標識取消註釋)

幾個栗子

[root@m1 tmp]# ansible 10.0.0.31 -m cron -a "name=empty minute=0 hour=0 job='cat /dev/null>/tmp/aa.txt' "-->(添加一個定時任務)
[root@m1 tmp]# ansible 10.0.0.31 -m cron -a "name=empty job='cat /dev/null>/tmp/aa.txt' disabled=yes"-->(註釋掉一個定時任務)
[root@m1 tmp]# ansible 10.0.0.31 -m cron -a "name=empty state=absent"-->(刪除掉一個定時任務)

(三)、ansible劇本

ansible劇本與Linux當中shell腳本類似,在Linux中如果我們需要執行多條命令實現一個功能這時候我們就可以把這些命令寫到一個文件裏生成一個shell腳本,而ansible劇本就是將多個ansible命令語法模塊寫到一個文件裏,從而實現一些自動化的,方便的一些功能

1、ansible編寫劇本規範

PS:編寫規範遵循pyyaml語法規範,我們可以參考官方文檔進行學習:https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
格式說明

  • 短橫線“-”表示定義同級別的語法
  • 冒號“:”定義鍵號後邊的值如:姓名: 張三
  • 空格 對內容進行分級,每隔一級前邊需要有兩個空格
    一個栗子
    使用ansible一鍵安裝httpd服務
    ansible批量管理服務詳解

    2、執行ansible腳本的方法

  • ansible-playbook httpd.yml執行該劇本
  • ansible-playbook -C httpd.yml 測試該劇本是否可以正常運行

總結:學好ansible的兩個重點一是學好ansible的模塊二是學好ansible劇本的編寫,當然前者是爲後者做鋪墊的,所以想要學好ansible除了參考官方文檔以外還可以使用ansible-doc命名,這個命令相當與shell中的man命令,可以在線尋求幫助

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