1. 程式人生 > >ansible 實現巡檢自動化

ansible 實現巡檢自動化

系統/運維 Linux


簡介

ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。


安裝

RHEL/CentOS

//yum安裝

#yum install epel-release -y && yum install ansible -y

如果是內網服務器,沒有聯網權限。則在虛擬機內使用如下命令,只下載不安裝

#yum -y install --downloadonly --downloaddir=/tmp/ ansible

則將安裝包下載到/tmp目錄下,再拷貝rpm到目標服務器,rpm進行安裝

技術分享圖片

#rpm -ivh *.rpm

初始化


遠程連接概述

在我們開始前要先理解Ansible是如何通過SSH與遠程服務器連接是很重要的.

Ansible 1.3及之後的版本默認會在本地的 OpenSSH可用時會嘗試用其進行遠程通訊.

技術分享圖片

簡單的說,在一臺主機上安裝 Ansible ,將其他服務器ip添加到配置文件中,通過密鑰免密碼登錄。可以批量執行命令,批量上傳下載文件、文件夾等。


以下為實際例子

管理機A: CentOS 7.4 192.168.153.22

被管理機B:Red Hat 6.7 192.168.153.11

被管理機C:SuSE 11 sp3 192.168.153.151

被管理機上均設置普通用戶xx,密碼為a。root不能直接登錄,需先登錄xx,再su切換到root。

首先將被管理主機添加到Ansible配置文件 hosts中

# vim /etc/ansible/hosts

[test]
192.168.153.11 ansible_ssh_user=xx ansible_ssh_pass=a ansible_su_pass=aaaaaa
192.168.153.151 ansible_ssh_user=xx ansible_ssh_pass=a ansible_su_pass=a

[test]是一個分組,test代表組內的兩臺機器

因為root不能直接登錄,所以配置文件裏面要寫上普通用戶的用戶名、密碼。及root密碼。

測試一下添加成功沒:

技術分享圖片

從上面的輸出提示上基本可以了解到由於在本機的~/.ssh/known_hosts文件中並有fingerprint key串,ssh第一次連接的時候一般會提示輸入yes 進行確認為將key字符串加入到 ~/.ssh/known_hosts 文件中。

在ansible.cfg配置文件中,也會找到如下部分:

1. # uncomment this to disable SSH key host checking
2. host_key_checking = False

默認host_key_checking部分是註釋的,通過找開該行的註釋,同樣也可以實現跳過 ssh 首次連接提示驗證部分。

重新測試一次

技術分享圖片


常用模塊

獲取模塊列表:ansible-doc –l

獲取模塊幫助:ansible-doc -s command

技術分享圖片

模塊一:測試目標主機是否在線:ping模塊

主機如果在線,則回復pong

技術分享圖片

模塊二:command模塊和shell

作用:用於在各被管理節點運行指定的命令

shell和command的區別:shell模塊可以特殊字符,而command是不支持

技術分享圖片

模塊三:復制文件copy模塊

作用:用於將文件批量傳送到所有被管理機

技術分享圖片

以上命令就是把本地機器的/tmp/目錄下的xx,傳送到所有服務器下,並且設置權限為755.

查看以下是否上傳成功。

技術分享圖片

其余還有很多模塊,上網查閱即可

普通用戶 su 到root

我們是通過ssh交互的,那服務器不允許通過root直接登錄,所以我們當前的權限是普通用戶。如下圖:

技術分享圖片

Ansible 支持切換到root,用法如下:

技術分享圖片

Playbook

playbooks 是一種簡單的配置管理系統與多機器部署系統的基礎.與現有的其他系統有不同之處,且非常適合於復雜應用的部署.

Playbooks 可用於聲明配置,更強大的地方在於,在 playbooks 中可以編排有序的執行過程,甚至於做到在多組機器間,來回有序的執行特別指定的步驟.並且可以同步或異步的發起任務.

我們使用 adhoc 時,主要是使用 /usr/bin/ansible 程序執行任務.而使用 playbooks 時,更多是將之放入源碼控制之中,用之推送你的配置或是用於確認你的遠程系統的配置是否符合配置規範.

個人理解,playbooks就像一個shell腳本一樣,把需要執行的任務都寫到一個文件裏面執行。

實戰
1.批量上傳+設置crontab

需求1:有2個文件 cpumonitor.sh iomonitor.sh 需要上傳到各個服務器上的/opt目錄下,並且設置定時任務

* * * * * /opt/cpumonitor.sh

* * * * * /opt/iomonitor.sh

使用ansible如何去做呢?1是上傳文件,2是設置定時任務

ansible test -b --become-method=su -m copy -a “src=/tmp/cpumonitor.sh dest=/opt/cpumonitor owner=root group=root mode=0755”
ansible test -b --become-method=su -m copy -a “src=/tmp/iomonitor.sh dest=/opt/cpumonitor owner=root group=root mode=0755”

執行成功

技術分享圖片

設置定時任務怎麽設置呢?

ansible test -b --become-method=su -m cron -a "minute=* job=/opt/cpumonitor.sh"
ansible test -b --become-method=su -m cron -a "minute=* job=/opt/iomonitor.sh"

技術分享圖片

查看一下是否設置成功

技術分享圖片

如果是寫成playbooks就要這樣寫:

---                              # --- 是yaml要求格式
- hosts: test                  # 要執行的分組,這裏要對test分組進行測試
  remote_user: xx        #登錄用戶是啥,xx
  become: yes             #是否要提升權限
  become_method: su #這裏使用su,也可以設置sudo等等
 
tasks:
- name: transfer file to server
  copy:
    src: /tmp/iomonitor.sh
    dest: /opt/iomonitor.sh
    owner: root
    group: root
    mode: 0755
 
 
- name: transfer file to server
  copy:
    src: /tmp/cpumonitor.sh
    dest: /opt/cpumonitor.sh
    owner: root
    group: root
    mode: 0755
 
- cron:
    name: "cti cpumonitor"
    minute: '*'
    job:  "/opt/cpumonitor.sh"
 
- cron:
    name: "cti iomonitor"
    minute: '*'
    job:  "/opt/iomonitor.sh"

執行:

技術分享圖片

技術分享圖片

設置成功

技術分享圖片

2批量上傳+執行腳本+下載巡檢報告

上傳腳本文件名為xunjian.sh,執行後在/tmp/下生成一個logs/*.txt文件。

寫一個playbooks,將巡檢腳本xunjian.sh上傳到所有服務器,自動執行,並自動下載到*.txt本地。

代碼如下:

---
- hosts: test
  remote_user: xx
  become: yes
  become_method: su
 
  tasks:
  - name: transfer file to server
    copy: src=/root/xunjian.sh dest=/tmp/xunjian.sh mode=0755
  #上面這個是上傳巡檢腳本到/tmp/目錄下,並設置755選項
  - name: execute the script
    shell: /bin/bash  /tmp/xunjian.sh
  # 執行腳本
  - name: fucking
    find:
      paths: /tmp/log/
      patterns: "*"
      recurse: no
    register: file_2_fetch
 
  - name: fuck your bitch
    fetch:
      src: "{{ item.path }}"
      dest: /tmp/
      flat: yes
with_items: "{{ file_2_fetch.files }}"

上面這兩段就是到/tmp/log/目錄下,find 查找文件,然後下載回本地。執行結果如下:

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

ansible 實現巡檢自動化