ansible自動運維入門
1、關於Ansible
Ansible是一個部署一群遠程主機的工具;Ansible通過SSH協議實現遠程節點和管理節點之間的通信。理論上說,只要管理員通過ssh登錄到一臺遠程主機上能做的操作,Ansible都可以做到。Ansible是python開發的,故依賴一些python庫和組件
2、ansible架構:
上圖右邊綠色部分是被管理的主機(虛擬機,物理機,雲主機等)從以上架構圖中可以看出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 一路回車。
把自己公鑰復制到遠程機器:
[root@Cent65 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.1.67
現在通過Cent65遠程cent67已經不需要密碼了。
同理,設置rescue主機免密登錄:
[root@Cent65 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 47.95.243.198
[root@Cent65 ~]# ssh 47.95.243.198
4、安裝
目前,只要機器上安裝了 Python 2.6 或 Python 2.7 (windows系統不可以做控制主機),都可以運行Ansible,我們這裏是2.6.6的python
[root@Cent65 ~]# python -V
開始安裝,這裏采用epel yum源的方式安裝,更方便。
先安裝epel源:
[root@Cent65 ~]# yum install epel-release –y
出現如下錯誤,意思是系統中沒有epel,需要先下載epel包才能安裝。
接下來,我們上阿裏雲去尋找對應的epel源,網址:https://opsx.alibaba.com/mirror
搜索epel,復制地址:
到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
又出現了報錯:需要加參數
[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 查看版本。
二、配置及獲取幫助說明
通過rpm -ql ansible可以看到有很多文件,主要是配置文件和和可執行文件,以及所依賴的python庫文件
1、配置與執行文件說明
主配置文件: /etc/ansible/ansible.cfg (這個文件主要定義了roles_path路徑,主機清單路徑,連接清單中的主機方式等配置,這些大部的默認配置已經足夠我們平時使用,如需要特別配置可以自行去修改)
默認主機清單配置文件:/etc/ansible/hosts (可通過ansible.cfg重新定義)
除了以上兩個重要的配置文件還有三個重要的可執行文件分別是:
ansible 主執行程序,一般用於命令行下執行
ansible-playbook 執行playbook中的任務
ansible-doc 獲取各模塊的幫助信息
2、ansible 使用格式
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”命令。
3、ansible-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
三、ansible常用模塊
1、copy模塊
從本地copy文件分發到遠程主機。
參數說明:
src= 源文件路徑
dest= 目標路徑
註意src= 路徑後面帶/ 表示帶裏面的所有內容復制到目標目錄下,不帶/是目錄遞歸復制
owner 屬主 group 屬組 mode權限
示例:
[root@Cent65 ansible]# ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600"
[root@Cent65 ansible]# ansible all -m copy -a "content='hi there\n' dest=/tmp/hi.txt"
命令中沒有指定hosts文件,便是使用默認hosts,all參數代表指定所有主機。
現兩臺主機顯示執行都已經成功,現在我們在cent67主機上查看一下:
[root@cent67 ~]# ls /tmp/
2、fetch模塊
從遠程主機拉取文件到本地
例:[root@Cent65 ansible]# ansible all -m fetch -a "src=/tmp/hi.txt dest=/tmp/"
說明:src為遠程主機路勁,dest為本地路徑。查看一下是否拉取文件成功:
[root@Cent65 ansible]# ls /tmp/
3、command模塊
在遠程主機上執行命令,屬於裸執行,非鍵值對顯示;不進行shell解析;
示例1:
[root@Cent65 ansible]# ansible all -m command -a "ifconfig"
示例2:
[root@Cent65 ansible]# ansible all -m command -a "ifconfig|grep eth0"
現在使用了管道符後執行失敗了,說明command模塊不支持。為了能夠達成解析,就需要用到shell模塊。
4、shell模塊
由於commnad只能執行裸命令(即系統環境中有支持的命令),至於管道之類的功能不支持,shell模塊可以做到
例:[root@Cent65 ansible]# ansible all -m shell -a "ifconfig|grep eth0"
已經執行成功了。
5、file模塊
設置文件屬性(創建文件)
常用參數:
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"
cent67上檢查一下是否創建成功的目錄:
示例2:創建軟件鏈接:
[root@Cent65 ansible]# ansible all -m file -a "src=/tmp/hi.txt path=/var/tmp/hi.link state=link"
6、cron模塊
對目標主機生成計劃任務
常用參數:
除了 分(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"
到cent67上邊查看一下:
示例2:刪除計劃任務
[root@Cent65 ansible]# ansible all -m cron -a "name=update_time state=absent"
在cent67上查看發現計劃任務已經刪除了
7、yum模塊
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上邊查看已經安裝成功:
8、service模塊
服務管理模塊
常用參數:
name: 服務名
state: 服務狀態
enabled: 是否開機啟動 true | false
runlevel: 啟動級別 (systemed方式忽略)
示例:啟動nginx服務,並設置開機自動啟動
[root@Cent65 ansible]# ansible all -m service -a "name=nginx state=started enabled=true"
在cent67上查看狀態,已經啟動成功
9、script模塊
把本地的腳本傳到遠端執行;前提是到遠端可以執行,不能把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"
在cent67機器上查看test.sh腳本已經執行成功。
以上就是一些常用的模塊,其他模塊的使用可以用以下命令查看
[root@Cent65 ansible]# ansible-doc -l
查看某個模塊使用方法:
ansible-doc –s 模塊名稱
四、Playbook實戰
playbook是Ansible的配置,部署和編排的語言。他們可以描述你所希望的遠程系統強制執行的政策,或者在一般的IT流程的一組步驟
1、playbook的核心元素
hosts : playbook配置文件作用的主機
tasks: 任務列表
variables: 變量
templates:包含模板語法的文本文件
handlers :由特定條件觸發的任務
roles :用於層次性、結構化地組織playbook。roles 能夠根據層次型結構自動裝載變量文件、tasks以及handlers等
2、playbook運行方式
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
沒有報錯,說明語法沒有問題。
(2)再來查看一下運行任務的主機:
[root@Cent65 playbooks]# ansible-playbook --list-hosts redis.yaml
(3)執行劇本文件
[root@Cent65 playbooks]# ansible-playbook redis.yaml
由於上面的操作是直接安裝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/.
[root@Cent65 ~]# vim !$
[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
(把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
ansible自動運維入門