天天看點

運維自動化—ansible的使用

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

ansible是基于 paramiko 開發的,并且基于子產品化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運作的子產品,ansible隻是提供一種架構。ansible不需要在遠端主機上安裝client/agents,因為它們是基于ssh來和遠端主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,并且上手容易,學習簡單。

1、部署簡單,隻需在主要端部署Ansible環境,被控端無需做任何操作;

2、預設使用SSH協定對裝置進行管理;

3、有大量正常運維操作子產品,可實作日常絕大部分操作。

4、配置簡單、功能強大、擴充性強;

5、支援API及自定義子產品,可通過Python輕松擴充;

6、通過Playbooks來定制強大的配置、狀态管理;

7、輕量級,無需在用戶端安裝agent,更新時,隻需在操作機上進行一次更新即可;

8、提供一個功能強大、操作性強的Web管理界面和REST API接口——AWX平台。

這裡使用3台主機為例:ansible ,被管理的兩台主機

1、ansible的安裝

yum install epel-release -y

yum install ansible –y

2、配置ansible的主機清單

vim /etc/ansible/hosts

定義方式

[web] 主機組名:可以自己寫

192.168.191.132 管理的主機1

192.168.191.133 管理的主機2

3、ansible 主機能夠ssh無密連接配接要管理的主機

配置ansible使用公鑰驗證

雖然ansible支援其他主機認證方式,但是我們最常用的的還是基于秘鑰的認證:

(1)首先生成秘鑰

ssh-keygen -t rsa 後面直接回車

(2)然後向監控主機分發秘鑰:

即将公鑰複制到要監控的主機上 

ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.191.132

ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.191.133

(3)在ansible上ssh連接配接測試

(1) ansible web -m ping

192.168.191.132 | SUCCESS => { “changed”: false,

“ping”: “pong” }

192.168.191.133 | SUCCESS => { "changed": false,

"ping": "pong" }

可以看出監控的兩台主機是連通的

(2)ansible all -m ping 測試所有的監控主機

ansible 主機組名 -m command -a "操作" 

(1)ansible web -m comman -a "cat /etc/passwd"

-m 指定子產品 -a 指定指令

将監控的兩台主機的/etc/passwd 檔案内容顯示在ansible主機的螢幕上

(2)ansible web -m comman -a "ifconfig"

因為command子產品不支援管道,是以有了shell子產品,支援shell的各種功能

(1)[root@ansiable ~]# ansible web -m shell -a ‘cat /etc/passwd |grep “root”’

192.168.191.132 | SUCCESS | rc=0 >> root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

192.168.191.133 | SUCCESS | rc=0 >> root:x:0:0:root:/root:/bin/bash

copy 

相關選項如下:

①backup:在覆寫之前,将源檔案備份,備份檔案包含時間資訊。有兩個選項:yes|no

②content:用于替代“src”,可以直接設定指定檔案的值

③dest:必選項。要将源檔案複制到的遠端主機的絕對路徑,如果源檔案是一個目錄,那麼該路徑也必須是個目錄

④directory_mode:遞歸設定目錄的權限,預設為系統預設權限

⑤force:如果目标主機包含該檔案,但内容不同,如果設定為yes,則強制覆寫,如果為no,則隻有當目标主機的目标位置不存在該檔案時,才複制。預設為yes

⑥others:所有的file子產品裡的選項都可以在這裡使用

⑦src:被複制到遠端主機的本地檔案,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它将遞歸複制。在這種情況下,如果路徑使用“/”來結尾,則隻複制目錄裡的内容,如果沒有使用“/”來結尾,則包含目錄在内的整個内容全部複制,類似于rsync

(1)ansible web -m copy -a 'src=/root/a.sh dest=/app/a.sh '

源檔案是:/root/a.sh,複制到web組監控主機的 /app/a.sh 

(2)ansible web -m copy -a "content='hello word' dest=/app/a.sh mode=644 backup=yes" 

将hello word 内容推送到web主機組監控主機的/app/a.sh ,權限改為644 ,backup:當檔案内容發生變化會對原來的内容進行備份。

(3)ansible web -m copy -a "content='hi' dest=/app/a.sh mode=644 backup=yes" 如再次推送内容到啊a.sh 中

在app下用兩個檔案

a.sh 内容為最新推送的hi 

a.sh.7560.2017-12-08@19:56:01~ 内容為以前的hello word

(1)ansible web -m file -a "path=/app/app state=directory" 在遠端建立目錄/app/app

(2)ansible web -m file -a "path=/app/app state=absent" 删除目錄/app/app

(3)state 有下面内容

directory:如果目錄不存在,就建立目錄

file:即使檔案不存在,也不會被建立

link:建立軟連結

hard:建立硬連結

touch:如果檔案不存在,則會建立一個新的檔案,如果檔案或目錄已存在,則更新其最後修改時間

absent:删除目錄、檔案或者取消連結檔案

(1)ansible web -m fetch -a 'src=/var/log/messages dest=/root/test'

将遠端主機的 /var/log/messages 拿來放在本機的root下

cd /root/test

ls

192.168.191.132 192.168.191.133 

會自動建立兩個子檔案夾區分

cron 選項

day= #日應該運作的工作( 1-31, , /2, )

hour= # 小時 ( 0-23, , /2, )

minute= #分鐘( 0-59, , /2, )

month= # 月( 1-12, , /2, )

weekday # 周 ( 0-6 for Sunday-Saturday,, )

job= #指明運作的指令是什麼

name= #定時任務描述

reboot # 任務在重新開機時運作,不建議使用,建議使用special_time

special_time #特殊的時間範圍,參數:reboot(重新開機時),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小時)

state #指定狀态,present表示添加定時任務,也是預設設定,absent表示删除定時任務

user # 以哪個使用者的身份執行

(1)ansible web -m cron -a 'name="sync time from ntpserver" minute="/10" job="/sbin/ntpdate 172.17.0.1 &>/dev/null" 

在遠端主機上每10分鐘同步一下伺服器時間

(2)ansible web -m shell -a “crontab -l” 檢視遠端主機的檔案中是否寫入成功

conf_file #設定遠端yum安裝時所依賴的配置檔案。如配置檔案沒有在預設的位置。

disable_gpg_check #是否禁止GPG checking,隻用于<code>present</code> or <code>latest</code>。

disablerepo #臨時禁止使用yum庫。 隻用于安裝或更新時。

enablerepo #臨時使用的yum庫。隻用于安裝或更新時。

name= #所安裝的包的名稱

state= #present安裝, latest安裝最新的, absent 解除安裝軟體。

update_cache #強制更新yum的緩存。

(1) ansible web -m yum -a 'name=htop state=present disable_gpg_check =yes'

在遠端安裝htop包

arguments #指令行提供額外的參數

enabled #設定開機啟動。

name= #服務名稱

runlevel #開機啟動的級别,一般不用指定。

state #started啟動服務, stopped停止服務, restarted重新開機服務, reloaded重載配置

(1)啟動nginx服務并設定範圍自啟動:

[root@ansiable ~]# ansible web -m service -a 'name=nginx state=started enabled=true'

使用者子產品,管理使用者帳号action: user

comment # 使用者的描述資訊

createhome # 是否建立家目錄

force # 在使用state=absent是, 行為與userdel –force一緻.

group # 指定基本組

groups # 指定附加組,如果指定為(groups=)表示删除所有組

home # 指定使用者家目錄

move_home # 如果設定為home=時, 試圖将使用者主目錄移動到指定的目錄

name # 指定使用者名

non_unique # 該選項允許改變非唯一的使用者ID值

password # 指定使用者密碼

remove # 在使用state=absent時, 行為是與userdel –remove一緻

shell # 指定預設shell

state # 設定帳号狀态,不指定為建立,指定值為absent表示删除

system # 當建立一個使用者,設定這個使用者是系統使用者。這個設定不能更改現有使用者

uid # 指定使用者的uid

(1)ansible web -m user -a 'name=tom comment="tom is cat" uid=1111 group=tom groups=wheel shell=/bin/zshell home=/home/tomhome'

action: group

gid # 設定組的GID号

name= # 管理組的名稱

state # 指定組狀态,預設為建立,設定值為absent為删除

system # 設定值為yes,表示為建立系統組

(1)建立名為tom的組

[root@Ansible ~]#ansible web -m group -a 'name=tom state=present'

(1)将本地的腳本在其他主機上運作

[root@Ansible ~]#vim test.sh

#/bin/bash

touch /tmp/test.sh.log

#建立/tmp/test.sh.log

echo “hello” &gt;&gt; /tmp/test.sh.log

(2)執行指令

ansible web -m script -a ‘/root/test.sh’

(3)檢視web主機組下主機的/tmp/test.sh.log

[root@Ansible ~]#ansible web -m shell -a ‘cat /tmp/test.sh.log’

setup子產品,主要用于擷取主機資訊,在playbooks裡經常會用到的一個參數gatherfacts就與該子產品相關。setup子產品下經常使用的一個參數是filter參數

(1)ansible web -m setup -a "filter='ansible_mb'" 檢視主機記憶體資訊

(2)ansible 192.168.191.132 -m setup -a "filter='ansible_eth[0-1]' " 檢視地接口為eth0-1的網卡資訊

(3)ansible web -m setup -a "filter='mem'* " 檢視記憶體多大

playbook是ansible用于配置,部署,和管理被控節點的劇本。

通過playbook的較長的描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀态。playbook就像Ansible控制器給被控節點列出的的一系列to-do-list,而被控節點必須要完成。

也可以這麼了解,playbook 字面意思,即劇本,現實中由演員按照劇本表演,在Ansible中,這次由計算機進行表演,由計算機安裝,部署應用,提供對外服務,以及組織計算機處理各種各樣的事情。

Hosts:主機清單,主機組

Tasks:任務清單

Variables

Templates:包含了模闆文法的文本檔案;

Handlers:由特定條件觸發的任務;

Hosts:運作指定任務的目标主機;

remoute_user: 在遠端主機上執行任務的使用者;

sudo_user:

tasks:任務清單

cd /etc/ansible 

vim web1.yml

使用:ansible-playbook web1.yml

vim web2.yml

使用:ansible-playbook web2.yml

vim web3.yml

使用:ansible-playbook web3.yml -e rpmname=nginx

mv /root/nginx.conf /root/nginx.conf.j2 标記成模闆

在模闆中可以使用變量

ansible web -m setup -a "filter=vcpu" 擷取cpu顆數

(1)vim /root/nginx.conf.j2

worker_processes {{ ansible_processor_vcpus }}; 使用變量

listen {{ listenpport }};

(2)vim web.yml

使用:ansible-playbook web.yml

本文轉自 hawapple 51CTO部落格,原文連結:http://blog.51cto.com/guanm/2048854

繼續閱讀