ansible批量管理服務詳解

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

1、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操做系統python

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

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

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

#!/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 web

  • 在執行完批量分發腳本以後爲了保證ssh能夠經過密鑰的方式進行鏈接,咱們能夠寫一個測試腳本進行測試

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

#/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==============
nfs01vim

==============info 10.0.0.41==============
backupcentos

==============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 ansiblebash

小提示:在有的時候咱們可能爲了服務器的安全性開啓了系統當中的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軟件部署完成

2、ansible軟件的應用

(一)、ansible應用語法

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

    (二)、ansible經常使用模塊

    一、 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

    二、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

    三、scripts模塊

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

    四、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

    五、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"--->(在遠程節點上穿件文件,並修改權限)

    六、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軟件)

    七、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這個服務關閉並設置開機不要啓動)

八、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命令語法模塊寫到一個文件裏,從而實現一些自動化的,方便的一些功能

一、ansible編寫劇本規範

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

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

    二、執行ansible腳本的方法

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

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

相關文章
相關標籤/搜索