ansible自動化運維平臺(部署+模組+playbook)介紹

2020-08-13 16:14:39

ansible自動化運維平臺部署

目錄

一、安裝ansible

二、驗證ansible是否安裝成功    ansible -m ping group1 

三、ansible語法格式

四、ansible常用模組

五、playbook(劇本)介紹


 

一、安裝ansible

#安裝ansible有原始碼安裝和yum源安裝
yum install ansible -y

#備份ansible組態檔
cd /etc/ansible/hosts && cp hosts hosts.default

#修改hosts檔案,ansible在執行任務的時候,會去讀取該檔案
vim /etc/ansible/hosts

[group1]
192.168.161.80
192.168.161.90
192.168.161.100


 

二、驗證ansible是否安裝成功

 

驗證ansible是否安裝成功

 

三、ansible語法格式

#ansible命令語法
ansible 機器 -m 模組 -a ‘模組參數’
    
#檢視ansible現有的模組
ansible-doc -l

#給80機器設定主機名
ansible 192.168.161.80 -m hostname -a "name=tyschool"

四、ansible常用模組

 

4.1 hostname模組:修改主機名

ansible 192.168.161.80 -m hostname -a "name=node1"


4.2 file模組:遠端主機上檔案操作

參數說明:

group:定義檔案/目錄的屬組

mode:定義檔案/目錄的許可權(注意:檔案許可權爲4位元數,第一位爲uid/gid,後面表示ugo許可權)

owner:定義檔案/目錄的屬主

path:必選項,定義檔案/目錄的路徑

recurse:遞回的設定檔案的屬性,只對目錄有效

src:要被鏈接的原始檔的路徑,只應用於state=link的情況

dest:被鏈接到的路徑,只應用於state=link的情況

state: (link|hard|touch|absent)

    link:建立軟鏈接

    hard:建立硬鏈接

    touch:如果檔案不存在,則會建立一個新的檔案,如果檔案或目錄已存在,則更新其最後修改時間

    absent:刪除目錄、檔案或者取消鏈接檔案

    directory:建立的是目錄

實操案例:

    1、建立檔案
    ansible group1 -m file -a "path=/tmp/ansible.txt state=touch"
    2、檔案刪除
    ansible group1 -m file -a "path=/tmp/ansible.txt state=absent"
    3、檔案鏈接
      3.1 軟連線
      ansible group1 -m file -a "src=/tmp/ansible.txt path=/tmp/ansible.ggg state=link"
      3.2 硬鏈接
      ansible group1 -m file -a "src=/tmp/ansble.txt path=/tmp/ansible_hard state=hard"
    4、修改使用者屬主和屬組,許可權
    ansible 192.168.161.80 -m file -a "path=/tmp/ansible.txt owner=bob group=bob mode=0600"
    5、建立目錄
        ansible group1 -m file -a "path=/tmp/ansible state=directory"
    6.目錄刪除
        ansible group1 -m file -a "path=/tmp/ansible state=absent"
    7、遞回
        recurse :yes /no 


4.3 copy模組:本地檔案拷貝到目標機器上

常用參數說明:
src :檔案源路徑
dest :目標路徑
content :指定檔案的內容複製到遠端機器檔案內
force   : 強制 yes/no
backup   : 是否備份有衝突的原始檔 yes/no
checksum:拷貝完整性校驗
owner   : 目標檔案所有者
group    :目標檔案所屬組
mode    :目標檔案許可權

案例:
1、拷貝本地檔案到業務機器
    ansible group1 -m copy -a "src=/tmp/huangshi.txt dest=/tmp/"
2、拷貝目錄
    ansible group1 -m copy -a "src=/etc/yum.repos.d/ dest=/tmp"     #加/,是拷貝的目錄下的檔案
    ansible group1 -m copy -a "src=/etc/yum.repos.d dest=/tmp"      #拷貝的是資料夾

4.4 fetch模組(節點檔案拷貝到本地)
    ansible group1 -m fetch -a "src=/etc/passwd dest=/tmp"    #管理機器目錄中建立節點機器的ip目錄中存放

   注意:因爲業務節點有多個,當從業務節點獲取到檔案到管理節點後,會在目的目錄生成業務機器ip目錄,業務節點對應的檔案存放在該ip目錄中

4.5  user模組:主要用於操作系統使用者、組、許可權、密碼等操作
常用參數:
name
password                      指定密碼,密碼必須爲密文 (注意:在終端先生成金鑰對:echo 123456 |openssl passwd -1 -stdin
state=absent|present    刪除或建立
system=yes|no             是否爲系統使用者
shell=""                         指定登錄shell
group=                          使用者組
create_home=yes|no    是否建立家目錄
remove=yes|no             刪除家目錄
案例:
ansible group1 -m user -a "name=tianxian password=$1$1iBVoy.z$EB79SOJQ/u3HM.d98q7vV/ uid=4423 create_home=yes shell=/bin/bash state=present"    

4.6 group模組 :建立組
案例:ansible group1 -m group -a "name=admin system=yes state=present"

4.7 cron模組:給節點機器管理週期性的時間任務
參數:
name        計劃任務名稱        (爲了刪除的時候方便去指定)
user        執行計劃任務使用者
job        計劃任務命令
minute
hour
day
month
week        
state=absent    刪除計劃任務
注意:不指定user的話,預設就是root(你在管理端執行建立的使用者)
案例:
ansible group1 -m cron -a "name=test user=root job='echo haha >/tmp/test.txt' minute=12 hour=23"

4.8 yum_repository模組:yum_repository模組用於設定yum倉庫
name        倉庫名 name.repo
description    描述
baseurl        下載路徑
gpgcheck=1|0    
enabled=yes|no
state=absent    刪除源
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/
案例:給業務機增加清華園的yum
ansible group1 -m yum_repository -a "name=qinghua baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/ description='qinghua yum repo' gpgcheck=0 enabled=yes"

4.9 yum模組:用來使用yum命令實現軟體包的安裝和解除安裝,只能安裝單個包, 安裝多個包需要使用playbook
參數
name                需要安裝軟體包的名稱
list=installd,updates,available repos    列出已經安裝、需要更新、可獲得、和yum源
state=absent/removed installed present latest    刪除,移除、安裝確認,安裝最新版
ansible group1 -m yum -a "name=vsftpd state=latest"

4.10 service模組:用於控制服務的啓動、關閉、開機自啓動等
參數:
name                服務名稱
state=reloaded restarted started stopped    服務管理    
enabled yes|no            開機是否啓動
案例:設定vsftp開機自啓動並啓動服務
ansible group1 -m service -a "name=vsftpd state=started enabled=yes"

4.11 script模組:用於在遠端機器上執行本地指令碼
備註:只有一個參數,指定指令碼路徑,不用給許可權
案例:ansible group1 -m script -a "/root/haha.sh"

4.12 ansible command 和shell模組
兩個模組都歐式用於執行Linux命令
shell模組和command模組差不多,但是command模組不能執行一些類似$HOME < > |等符號,但是shell可以
shell模組和command模組都只只能執行非互動式命令互動式命令無法執行,例如:vim

4.13 setup模組:收集遠端主機的基本資訊(操作系統型別,主機名、ip、cpu、記憶體資訊等)
常用的過濾條件:
ansible_all_ipv4_address:顯示ipv4的資訊
ansible_devices:顯示磁碟裝置資訊
ansible_distribution_major_version:顯示系統主版本
ansible_distribution_version:顯示系統版本
ansible_machine:顯示系統型別
ansible_lvm:顯示lvm相關資訊
ansible_memtotal_mb:顯示系統總記憶體
ansible_memfree_mb:顯示系統可用記憶體
ansible_swaptotal_mb:顯示總的swap記憶體
ansible_swapfree_mb:顯示swap記憶體的可用記憶體
ansible_processor:顯示cpu個數
ansible_mounts:顯示系統磁碟掛載情況

五、playbook(劇本)介紹

ansible用來設定,部署、和管理控制節點的劇本
使用格式爲yaml格式,包括elk、docker等都會使用yaml格式
簡單來說:playbook是ansible格式的指令碼,將需要執行的操作按照ansible的程式設計語法,放到檔案中執行
替代方案:1、完全可以使用shell指令碼來替代playbook,shell中使用ansible模組
                  2、使用ansible+shell指令碼,使用script模組


yaml格式規則
1、檔案的第一行必須以'---'開始,表示這是yaml檔案的開始,...表示結束,單個文件可以省略
2、#號爲註釋
3、列表中所有成員都開始於相同的縮排級別,並且使用一個- 作爲開頭(一個橫槓和一個空格)
4、一個字典是由一個簡單的鍵:值的形式組成(這個冒號後面必須是一個空格)
    子集兩個空格縮排
5、注意:寫yaml檔案不要使用tab鍵,都使用空格
yaml數據結構
1、標量--》相當於數據型別
2、序列--》陣列和列表    - + 單個空格表示單個列表項 []表示一組數據
3、鍵值對--》相當於map    :+ 空格表示單個鍵值對

playbook批次安裝Apache過程分析:
1.安裝Apache並啓動
    需要模組:1、yum模組  2、service模組來啓動 3、copy模組來把本地修改好的Apache組態檔複製過去
2、建立過程
    1、建立playbook指令碼目錄
    2、修改好Apache組態檔
    3、編寫playbook指令碼

playbook基礎元件:
hosts:任務執行的遠端目標主機
remote_user:在遠端主機上執行任務的使用者
tasks:需要在遠端主機上執行的任務列表
variables:變數,變數可以在hosts中定義,可以在playbook中定義,也可以直接使用setup模組獲取變數內容
handlers:任務處理器,當滿足某些條件時纔會觸發任務操作
templates:使用模組語言的文字檔案
tags:playbook中一般有多個任務,我們可以給每個任務打上標籤,當我們只需執行某個任務時,執行的時候
ansible-playbook install_nginx -t tag3
那麼,將只會執行第三個任務
如果一個hosts執行任務失敗,整個tasks都會做回滾,重新修改playbook,重新執行即可

測試playbook指令碼是否有錯誤:
  ansible-playbook -C apache_init.yml

andlers也是一些task的列表,和一般的task並沒有什麼區別。
是由通知者進行的notify,如果沒有被notify,則Handlers不會執行,假如被notify了,則Handlers被執行
不管有多少個通知者進行了notify,等到play中的所有task執行完成之後,handlers也只會被執行一次

 

playbook案例一:重新啓動sshd服務

#restart sshd
---                 #開始
- hosts: group1     #指定hosts業務機
  remote_user: root #指定遠端操作使用者
  tasks:            #任務列表
    - name: restart sshd
      command: 'systemctl restart sshd' #使用的模組
#備註:一定要注意對齊方式

案例二:安裝Apache服務並初始化

---
#install and init apache
#date:2020-08-13

- hosts: group1
  remote_user: root
  tasks:
    #第一步:建立執行Apache服務的使用者
    - name: create user for httpd
      user: name=tyschool state=present
    #安裝Apache
    - name: yum install httpd
      yum: name=httpd state=latest
    #複製組態檔
    - name: copy httpd configure 
      copy: src=/etc/ansible/playbook/httpd.conf dest=/etc/httpd/conf/
    #啓動服務
    - name: start httpd
      service: name=httpd state=started enabled=yes

案例三:對Apache劇本進行進一步加深,新增notice和handler

---
#install and init apache
#date:2020-08-13

- hosts: group1
  remote_user: root
  tasks:
    - name: create user for httpd
      user: name=tyschool state=present

    - name: yum install httpd
      yum: name=httpd state=latest

    - name: copy httpd configure 
      copy: src=/etc/ansible/playbook/httpd.conf dest=/etc/httpd/conf/
      notify: #當Apache組態檔修改時,會觸發handler,執行handler任務
        - restart httpd

    - name: start httpd
      service: name=httpd state=started enabled=yes

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted