1. 程式人生 > >運維自動化工具 Ansible

運維自動化工具 Ansible

工作 節點 cannot images ping 使用方法 自定義模塊 config 安裝

一、Ansible介紹

Ansible 簡單的說是一個配置管理系統(configuration management system)。你只需要可以使用 ssh 訪問你的服務器或設備就行。它也不同於其他工具,因為它使用推送的方式,而不是像 puppet 等 那樣使用拉取安裝agent的方式。你可以將代碼部署到任意數量的服務器上!

1、Ansible能做什麽

ansible可以幫助我們完成一些批量任務,或者完成一些需要經常重復的工作。

  • 比如:同時在100臺服務器上安裝nginx服務,並在安裝後啟動它們。
  • 比如:將某個文件一次性拷貝到100臺服務器上。
  • 比如:每當有新服務器加入工作環境時,你都要為新服務器部署某個服務,也就是說你需要經常重復的完成相同的工作。

這些場景中我們都可以使用到ansible。

2、Ansible特性

  • 模塊化:調用特定的模塊,完成特定任務
  • 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
  • 支持自定義模塊
  • 基於Python語言實現
  • 部署簡單,基於python和SSH(默認已安裝),agentless
  • 安全,基於OpenSSH
  • 支持playbook編排任務
  • 冪等性:一個任務執行1遍和執行n遍效果一樣,不因重復執行帶來意外情況
  • 無需代理不依賴PKI(無需ssl)
  • 可使用任何編程語言寫模塊
  • YAML格式,編排任務,支持豐富的數據結構
  • 較強大的多層解決方案

3、Ansible架構

技術分享圖片

  • Ansible核心組件說明:

Ansible:Ansible的核心程序
Host Lnventory:記錄了每一個由Ansible管理的主機信息,信息包括ssh端口,root帳號密碼,ip地址等等。可以通過file來加載,可以通過CMDB加載
Playbooks:YAML格式文件,多個任務定義在一個文件中,使用時可以統一調用,“劇本”用來定義那些主機需要調用那些模塊來完成的功能.
Core Modules:Ansible執行任何管理任務都不是由Ansible自己完成,而是由核心模塊完成;Ansible管理主機之前,先調用core Modules中的模塊,然後指明管理Host Lnventory中的主機,就可以完成管理主機。

Custom Modules:自定義模塊,完成Ansible核心模塊無法完成的功能,此模塊支持任何語言編寫。
Connection Plugins:連接插件,Ansible和Host通信使用

二、Ansible 的安裝

安裝方法有很多,這裏僅僅以CentOS 7 yum安裝為例,Ansible默認不在標準倉庫中,需要用到EPEL源。

yum install ansible -y
[root@monitor ~]# ansible --version
ansible 2.6.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u‘/root/.ansible/plugins/modules‘, u‘/usr/share/ansible/plugins/modules‘]
  ansible python module location = /usr/lib/python2.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]

三、Ansible 配置

1、實驗環境

我這裏主要是拿這幾臺設備進行測試,分組是隨意的。

IP 系統 功能
10.0.0.14 CentOS 6.7 ansible主控服務器
10.0.0.4 CentOS 7.3 cluster1
10.0.0.9 CentOS 6.6 cluster1
10.0.0.19 CentOS 6.9 cluster2
10.0.0.20 CentOS 6.5 cluster2
10.0.0.21 CentOS 6.5 cluster2

2、Inventory 主機清單

在主控服務器上面配置清單。

# cat /etc/ansible/hosts
[cluster1]
10.0.0.4
10.0.0.9
[cluster2]
10.0.0.19
10.0.0.20
10.0.0.21

3、配置無密碼通信

這裏配置比較簡單,自行操作一下。

4、測試 ping

[root@monitor ~]# ansible all -m ping
10.0.0.4 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
10.0.0.19 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
10.0.0.21 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
10.0.0.20 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
10.0.0.9 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

四、Ansible 模塊

ansible 使用方法

ansible <host-pattern> [-m module_name] [options]
指令 匹配規則的主機清單 -m 模塊名 選項

查看模塊使用方法

ansible-doc -s MODULE_NAME

1、ping

功能:嘗試連接到主機,驗證並返回pong成功。

對於Windows目標,請改用win_ping模塊
不使用icmp協議,使用ssh協議。

# ansible all -m ping
10.0.0.4 | SUCCESS => {
    "changed": false, 
    "ping": "pong"             # 返回pong表明成功通訊
}

2、command

功能:在遠程節點上執行命令

變量和操作符號 "<", ">", "|", ";" and "&" 不能正常工作。如果需要使用,請使用 shell 模塊
Ansible 默認不指定模塊時,將使用此模塊。

[root@monitor ~]# ansible cluster1 -a ‘date‘
10.0.0.4 | SUCCESS | rc=0 >>
Thu Sep 13 17:00:23 CST 2018

10.0.0.9 | SUCCESS | rc=0 >>
Thu Sep 13 17:00:33 CST 2018

3、shell

功能:在遠程節點上執行命令。

與command模快使用一致,但是,變量 和操作符號 "<", ">", "|", ";" and "&" 能正常工作。

我這裏使用通配符,使用command模塊是不行的。

# ansible cluster1 -m command -a ‘ls -d /usr/local/tomcat0[1-3]‘
10.0.0.4 | FAILED | rc=2 >>
ls: cannot access /usr/local/tomcat0[1-3]: No such file or directorynon-zero return code

10.0.0.9 | FAILED | rc=2 >>
ls: cannot access /usr/local/tomcat0[1-3]: No such file or directorynon-zero return code

改成shell模塊就可以。

# ansible cluster1 -m shell -a ‘ls -d /usr/local/tomcat0[1-3]‘       
10.0.0.4 | SUCCESS | rc=0 >>
/usr/local/tomcat01
/usr/local/tomcat02
/usr/local/tomcat03

10.0.0.9 | SUCCESS | rc=0 >>
/usr/local/tomcat01
/usr/local/tomcat02
/usr/local/tomcat03

4、cron

功能:管理計劃任務

backup:對遠程主機上的原任務計劃內容修改之前做備份
cron_file:如果指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶的任務計劃
day:日(1-31,/2,……)
hour:小時(0-23,/2,……)
minute:分鐘(0-59,/2,……)
month:月(1-12,/2,……)
weekday:周(0-7,*,……)
job:要執行的任務,依賴於state=present
name:該任務的描述
special_time:指定什麽時候執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly
state:確認該任務計劃是創建還是刪除
user:以哪個用戶的身份執行

  • 創建一個定時任務。

    # ansible cluster1 -m cron -a ‘name="test cron job" minute=*/2 job="/usr/bin/wall hello world"‘  
    10.0.0.4 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test cron job"
    ]
    }
    10.0.0.9 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test cron job"
    ]
    }
  • 查看創建的任務
# ansible cluster1 -a ‘crontab -l‘
10.0.0.4 | SUCCESS | rc=0 >>
42 5 * * * /usr/sbin/ntpdate time1.aliyun.com
#Ansible: test cron job
*/2 * * * * /usr/bin/wall hello world

10.0.0.9 | SUCCESS | rc=0 >>
23 15 * * * /usr/sbin/ntpdate time1.aliyun.com
#Ansible: test cron job
*/2 * * * * /usr/bin/wall hello world
  • 刪除定時任務
# ansible cluster1 -m cron -a ‘name="test cron job" minute=*/2 job="/usr/bin/wall hello world" state=absent‘
10.0.0.4 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}
10.0.0.9 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}

運維自動化工具 Ansible