ansible自動運維入門

一、簡要

1、關於Ansible
Ansible是一個部署一羣遠程主機的工具;Ansible通過SSH協議實現遠程節點和管理節點之間的通信。理論上說,只要管理員通過ssh登錄到一臺遠程主機上能做的操作,Ansible都可以做到。Ansible是python開發的,故依賴一些python庫和組件

2ansible架構:

image

上圖右邊綠色部分是被管理的主機(虛擬機,物理機,雲主機等)從以上架構圖中可以看出ansible是由主機清單(配置),playbook(配置),以及各模塊插件組成;簡單的說就是,用戶(管理員)通過ansible的主機清單配置或Playbook配置(一組任務),調用ansible的各種模塊及參數來對清單中的主機進行統一管理。

3、測試環境

ansible: 主機名:Cent65 版本:CentOS release 6.8  IP:192.168.1.65

node1: 主機名:cent67 版本:CentOS release 6.9 IP:192.168.1.67

node2 主機名:rescue 版本:CentOS release 6.9 阿里雲主機IP: 47.95.243.198

從ansible(Cent65)上生成ssh密鑰對同步到兩臺node主機上,實現無密鑰登錄管理(推薦)。

[root@Cent65 ~]# ssh-keygen -t rsa 一路回車。

image

把自己公鑰複製到遠程機器:

[root@Cent65 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.1.67

image

現在通過Cent65遠程cent67已經不需要密碼了。

image

同理,設置rescue主機免密登錄:

[root@Cent65 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 47.95.243.198

[root@Cent65 ~]# ssh 47.95.243.198

image

4、安裝

目前,只要機器上安裝了 Python 2.6 或 Python 2.7 (windows系統不可以做控制主機),都可以運行Ansible,我們這裏是2.6.6的python

[root@Cent65 ~]# python -V

image

開始安裝,這裏採用epel yum源的方式安裝,更方便。

先安裝epel源:

[root@Cent65 ~]# yum install epel-release –y

出現如下錯誤,意思是系統中沒有epel,需要先下載epel包才能安裝。

image

接下來,我們上阿里雲去尋找對應的epel源,網址:https://opsx.alibaba.com/mirror

搜索epel,複製地址:

image

到Cent65主機wget下載:

[root@Cent65 ~]# cd /etc/yum.repos.d/

[root@Cent65 yum.repos.d]# wget https://mirrors.aliyun.com/centos/6.10/extras/i386/Packages/epel-release-6-8.noarch.rpm

又出現了報錯:需要加參數

image

[root@Cent65 yum.repos.d]# wget https://mirrors.aliyun.com/centos/6.10/extras/i386/Packages/epel-release-6-8.noarch.rpm --no-check-certificate

這樣就可以了。可以安裝epel源了:

[root@Cent65 yum.repos.d]# rpm -ivh epel-release-6-8.noarch.rpm

[root@Cent65 yum.repos.d]# yum -y install ansible

[root@Cent65 ~]# ansible –version 查看版本。

image

二、配置及獲取幫助說明

通過rpm -ql ansible可以看到有很多文件,主要是配置文件和和可執行文件,以及所依賴的python庫文件

1、配置與執行文件說明

主配置文件: /etc/ansible/ansible.cfg (這個文件主要定義了roles_path路徑,主機清單路徑,連接清單中的主機方式等配置,這些大部的默認配置已經足夠我們平時使用,如需要特別配置可以自行去修改)

默認主機清單配置文件:/etc/ansible/hosts (可通過ansible.cfg重新定義)

除了以上兩個重要的配置文件還有三個重要的可執行文件分別是:

ansible  主執行程序,一般用於命令行下執行
ansible-playbook 執行playbook中的任務
ansible-doc  獲取各模塊的幫助信息

2ansible 使用格式

ansible

     HOST-PATTERN         #匹配主機模式,如all表示所有主機
    -i                     #指定hosts文件

-m MOD_NAME #模塊名 如:ping

-a MOD_ARGS #模塊執行的參數

-f FORKS #生成幾個子進行程執行

-C #(不執行,模擬跑)

-u Username #某主機的用戶名

-c CONNection #連接方式(default smart)

-

例如:[root@Cent65 ansible]# ansible all -m shell -a "ifconfig|grep eth0"

此命令意思是:ansible對hosts文件中所有主機通過shell模塊執行“ifconfig|grep eth0”命令。

3ansible-doc 獲取幫助信息

ansible-doc -s 模塊名 獲取指定模塊幫助信息說明

4、配置hosts文件

ansible默認的hosts文件路徑爲:/etc/ansible/hosts

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

在文件最後添加:

[testserver]

192.168.1.67

47.95.243.198

image

三、ansible常用模塊

1copy模塊

從本地copy文件分發到遠程主機。

參數說明:
src= 源文件路徑
dest= 目標路徑

注意src= 路徑後面帶/ 表示帶裏面的所有內容複製到目標目錄下,不帶/是目錄遞歸複製

owner 屬主 group 屬組 mode權限

示例:

[root@Cent65 ansible]# ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600"

image

[root@Cent65 ansible]# ansible all -m copy -a "content='hi there\n' dest=/tmp/hi.txt"

image

命令中沒有指定hosts文件,便是使用默認hosts,all參數代表指定所有主機。

現兩臺主機顯示執行都已經成功,現在我們在cent67主機上查看一下:

[root@cent67 ~]# ls /tmp/

image

image

2fetch模塊

從遠程主機拉取文件到本地

例:[root@Cent65 ansible]# ansible all -m fetch -a "src=/tmp/hi.txt dest=/tmp/"

image

說明:src爲遠程主機路勁,dest爲本地路徑。查看一下是否拉取文件成功:

[root@Cent65 ansible]# ls /tmp/

image

3command模塊

在遠程主機上執行命令,屬於裸執行,非鍵值對顯示;不進行shell解析;

示例1:

[root@Cent65 ansible]# ansible all -m command -a "ifconfig"

image

示例2:

[root@Cent65 ansible]# ansible all -m command -a "ifconfig|grep eth0"

image

現在使用了管道符後執行失敗了,說明command模塊不支持。爲了能夠達成解析,就需要用到shell模塊。

4shell模塊

由於commnad只能執行裸命令(即系統環境中有支持的命令),至於管道之類的功能不支持,shell模塊可以做到

例:[root@Cent65 ansible]# ansible all -m shell -a "ifconfig|grep eth0"

image

已經執行成功了。

5file模塊

設置文件屬性(創建文件)

常用參數:
path目標路徑
state directory爲目錄,link爲軟件鏈接
group 目錄屬組
owner 屬主

示例1:我們來給遠程主機創建一個/var/tmp/hello.dir目錄:

[root@Cent65 ansible]# ansible all -m file -a "path=/var/tmp/hello.dir state=directory"

image

cent67上檢查一下是否創建成功的目錄:

image

示例2:創建軟件鏈接:

[root@Cent65 ansible]# ansible all -m file -a "src=/tmp/hi.txt path=/var/tmp/hi.link state=link"

image

6cron模塊

對目標主機生成計劃任務

常用參數:
除了 分(minute) 時(hour) 日(day) 月(month) 周(week) 外
name: 本次計劃任務的名稱
state: present 生成(默認) |absent 刪除 (基於name)

示例1:對遠程各主機添加每隔3分鐘從time.windows.com同步時間

[root@Cent65 ansible]# ansible all -m cron -a "minute=*/3 job='/usr/sbin/ntpdate time.windows.com &>/dev/null' name=update_time"

image

到cent67上邊查看一下:

image

示例2:刪除計劃任務

[root@Cent65 ansible]# ansible all -m cron -a "name=update_time state=absent"

在cent67上查看發現計劃任務已經刪除了

image

7yum模塊

yum安裝軟件包的模塊;

常用參數說明:
enablerepo, disablerepo表示啓用與禁用某repo庫
name 安裝包名
state (present 或者installed)表示安裝, (absent或者removed) 表示刪除

示例:通過安裝epel擴展源並安裝nginx

[root@Cent65 ansible]# ansible all -m yum -a "name=epel-release state=installed"

[root@Cent65 ansible]# ansible all -m yum -a "name=nginx state=installed"

在cent67上邊查看已經安裝成功:

image

8service模塊

服務管理模塊
常用參數:

name: 服務名
state: 服務狀態
enabled: 是否開機啓動 true | false
runlevel: 啓動級別 (systemed方式忽略)

示例:啓動nginx服務,並設置開機自動啓動

[root@Cent65 ansible]# ansible all -m service -a "name=nginx state=started enabled=true"

在cent67上查看狀態,已經啓動成功

image

9script模塊

把本地的腳本傳到遠端執行;前提是到遠端可以執行,不能把Linux下的腳本同步到windows下執行;

示例:

編寫一個簡單的腳本;

[root@Cent65 ansible]# vim test.sh

#!/bin/bash

echo "ansible script test!" > /tmp/ansible.txt

[root@Cent65 ansible]# ansible all -m script -a "/etc/ansible/test.sh"

image

在cent67機器上查看test.sh腳本已經執行成功。

以上就是一些常用的模塊,其他模塊的使用可以用以下命令查看

[root@Cent65 ansible]# ansible-doc -l

查看某個模塊使用方法:

ansible-doc –s 模塊名稱

四、Playbook實戰

playbook是Ansible的配置,部署和編排的語言。他們可以描述你所希望的遠程系統強制執行的政策,或者在一般的IT流程的一組步驟

1playbook的核心元素

hosts : playbook配置文件作用的主機
tasks: 任務列表
variables: 變量
templates:包含模板語法的文本文件
handlers :由特定條件觸發的任務
roles :用於層次性、結構化地組織playbook。roles 能夠根據層次型結構自動裝載變量文件、tasks以及handlers等

2playbook運行方式

ansible-playbook --check  只檢測可能會發生的改變,但不真執行操作
ansible-playbook --list-hosts  列出運行任務的主機
ansible-playbook --syntax-check playbook.yaml 語法檢測
ansible-playbook -t TAGS_NAME playbook.yaml 只執行TAGS_NAME任務
ansible-playbook playbook.yaml 運行

3、通過playbook安裝管理redis服務

先創建一個劇本文件夾,用來存放我們的劇本文件。

[root@Cent65 ansible]# mkdir playbooks

[root@Cent65 ansible]# cd playbooks/

創建劇本文件:

[root@Cent65 playbooks]# vim redis.yaml

(1)下面我們來檢測一下這個劇本文件:

[root@Cent65 playbooks]# ansible-playbook --syntax-check redis.yaml

image

沒有報錯,說明語法沒有問題。

(2)再來查看一下運行任務的主機:

[root@Cent65 playbooks]# ansible-playbook --list-hosts redis.yaml

image

(3)執行劇本文件

[root@Cent65 playbooks]# ansible-playbook redis.yaml

image

由於上面的操作是直接安裝redis服務並啓動,並沒有配置文件,這還不能往生產環境中使用,生產環境中的redis肯定有不同的配置項,因此需要在安裝時提供配置文件。

4、帶配置文件的安裝管理redis

1首先複製一個redis.conf到本地home目錄下並進行修改

[root@Cent65 ansible]# ansible 192.168.1.67 -m fetch -a "src=/etc/redis.conf dest=/home"

 (2)然後編輯下載好的配置文件,修改bind 0.0.0.0,爲了任意主機可以遠程連接rsdis。之後將配置文件移動到/etc/ansible/playbooks/.

image

[root@Cent65 ~]# vim !$

image

[root@Cent65 etc]# mv redis.conf /etc/ansible/playbooks/

(3)重新編寫redis2.yaml劇本文件

[root@Cent65 ~]# vim redis2.yaml

 - hosts: all                          #所有遠程主機

remote_user: root #以遠程主機上root用戶執行

tasks: #任務

- name: install redis #任務之安裝

yum: name=redis state=latest #動作調用yum模塊安裝

- name: copy config file #任務之複製同步配置文件到遠程目標主機

copy: src=/etc/ansible/playbooks/redis2.conf dest=/etc/redis.conf owner=redis #動作copy模塊執行

notify: restart redis #觸發的動作

tags: configfile #任務標記名configfile

- name: start redis #任務之啓動redis

service: name=redis state=started #動作調用sevice模塊

handlers: #特定情況下,接收到其他任務的通知時被觸發

- name: restart redis

service: name=redis state=restarted

(4)檢測劇本語法

[root@Cent65 ~]# ansible-playbook --syntax-check redis2.yaml

image

(把redis2.yaml移動到/etc/ansible/playbook/下面)

[root@Cent65 ~]# mv redis2.yaml /etc/ansible/playbooks/

[root@Cent65 ~]# cd !$

(5)執行劇本

[root@Cent65 playbooks]# ansible-playbook redis2.yaml

執行成功。

本文參考博客:http://blog.51cto.com/dyc2005/2070729

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