1、簡要node
1、關於Ansible
Ansible是一個部署一羣遠程主機的工具;Ansible經過SSH協議實現遠程節點和管理節點之間的通訊。理論上說,只要管理員經過ssh登陸到一臺遠程主機上能作的操做,Ansible均可以作到。Ansible是python開發的,故依賴一些python庫和組件python
2、ansible架構:nginx
上圖右邊綠色部分是被管理的主機(虛擬機,物理機,雲主機等)從以上架構圖中能夠看出ansible是由主機清單(配置),playbook(配置),以及各模塊插件組成;簡單的說就是,用戶(管理員)經過ansible的主機清單配置或Playbook配置(一組任務),調用ansible的各類模塊及參數來對清單中的主機進行統一管理。redis
3、測試環境 shell
ansible: 主機名:Cent65 版本:CentOS release 6.8 IP:192.168.1.65vim
node1: 主機名:cent67 版本:CentOS release 6.9 IP:192.168.1.67windows
node2: 主機名:rescue 版本:CentOS release 6.9 阿里雲主機IP: 47.95.243.198centos
從ansible(Cent65)上生成ssh密鑰對同步到兩臺node主機上,實現無密鑰登陸管理(推薦)。bash
[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
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是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
執行成功。