Ansible自動化運維工具使用,詳細 ! ! !

Ansible概述

Ansible是近年來愈來愈火的一款開源運維自動化工具,通過Ansible可以運維自動化,
提供運維工程師的工作效率,減少人物失誤

實驗環境如下

Ansible服務器 IP 192168.100.102 系統 centos7 (VM1)

客戶機 1 IP192.168.100.103 系統 centos7 (VM1)

客戶機 2 IP 192.168.100.104 系統centos7(VM1)

Ansible安裝

進入 192.168.100.102中操作
1)通過YUM安裝Ansible(聯網)

#阿里雲源
[root@CentOS7-02 www]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

#Ansible軟件默認不在yum倉庫中,因此我們需要配置 epel倉庫
[root@cong11 ~]# yum install -y epel-release

[root@CentOS7-02 www]#yum -y install ansible

2) 驗證安裝結果

[root@CentOS7-02 www]# ansible --version
ansible 2.3.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

3)創建SSH免密交互

Ansible需要建立密鑰對驗證,免交互登陸

按照我圖中操作

在這裏插入圖片描述[root@CentOS7-02 www]# ssh-copy-id [email protected]

Are you sure you want to continue connecting (yes/no)? yes

[email protected]'s password: (輸入100.103的root用戶密碼)

[root@CentOS7-02 www]# ssh-copy-id [email protected]

[root@CentOS7-02 www]# ssh 192.168.100.103
Last login: Thu Nov 14 04:05:02 2019 from 192.168.100.1
[root@centos7-03 ~]# exit (這裏主機已經變了)

[root@CentOS7-02 www]# ssh 192.168.100.104
Last login: Thu Nov 14 04:05:21 2019 from 192.168.100.1
[root@centos7-04 ~]# exit

Ansible配置

還是在100.102 ansible中操作
Ansible 通過將設備列表以分組添加到/etc/ansible/hosts文件來實現,對設備的管理

[root@CentOS7-02 www]# vim /etc/ansible/hosts (添加如下紅色的)
[web] #組名
192.168.100.103 #設備IP
192.168.100.104

#默認是SSH端口,如果你是其他端口可以在IP後面 192.68.100.103:21 類似這樣

#可以將一個主機同時歸置在不同的組中
#保存退出

配置完成後,可以針對組中指定的某一個或多個主機操作

首先在客戶機1,與客戶機2 中安裝httpd並啓動

[root@centos7-03 ~]# yum -y install httpd && systemctl start httpd

1)只對web組的192.168.100.103操作,通過 --limit

[root@CentOS7-02 www]#ansible web -m command -a "systemctl status httpd" --limit "192.168.100.103"

**httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)

(我這裏省略了內容,太多)

2)只對192.168.100.103操作,通過IP限定

[root@CentOS7-02 www]# ansible 192.168.100.103 -m command -a "systemctl status httpd"

192.168.100.103 | SUCCESS | rc=0 >>
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2019-11-14 05:17:48 CST; 10min ago

3)只對192.168.100.網段主機操作,通過通配符

[root@CentOS7-02 www]# ansible 192.168.100.* -m command -a "systemctl status httpd"

192.168.100.103 | SUCCESS | rc=0 >>
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)

192.168.100.104 | SUCCESS | rc=0 >>
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)

Ansible命令

都是在Ansible服務器 100.102中操作

Ansible的維護命令大多以ansible開頭,在終端輸入ansible兩次tab支持補全
[root@CentOS7-02 www]# ansible
ansible ansible-console-2 ansible-galaxy ansible-playbook-2.7

1.ansible

ansible 是生產環境中使用最頻繁的的命令之一,主要用於以下場景

非固化需求
臨時一次性操作
二次開發接口調用

非固化需求是指臨時的維護,類如 查看磁盤使用情況,複製一個文件,
這些沒有規律的

我這裏只介紹常用的參數

1)檢查所有主機是否存活

[root@CentOS7-02 ~]# ansible all -f 5 -m ping
192.168.100.103 | SUCCESS => { #SUCCESS表示成功
"changed": false, #changed:false表示沒有對主機進行更改
"ping": "pong" #pong:ping 執行了ping
}
192.168.100.104 | SUCCESS => {
"changed": false,
"ping": "pong"
}

(all,表示/etc/ansible/hosts,我們這裏只有兩個組,如果有多個會ping所有,-f 5參數表示 ping 5次 ,)

2)列出web組所有主機列表

[root@CentOS7-02 ~]# ansible web --list
hosts (2):
192.168.100.103
192.168.100.104

3)批量顯示web組中的磁盤使用空間

[root@CentOS7-02 ~]# ansible web -m command -a "df -hT"
(web是/etc/ansible/hosts,web組的意思)
192.168.100.104 | SUCCESS | rc=0 >>
文件系統 類型 容量 已用 可用 已用% 掛載點
/dev/mapper/centos-root xfs 17G 1.4G 16G 8% /
devtmpfs devtmpfs 478M 0 478M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm

192.168.100.103 | SUCCESS | rc=0 >>
文件系統 類型 容量 已用 可用 已用% 掛載點
/dev/mapper/centos-root xfs 17G 1.4G 16G 8% /
devtmpfs devtmpfs 478M 0 478M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm

Ansible 的返回結果非常友好,三種顏色表示結果: 紅色,綠色,橘黃色

紅色表示執行過程有異議,橘黃色表示執行後目標有狀態變化

綠色表示執行成功且沒有對目標機器做過修改

我上面其實是綠色,只是這個編輯器不能顯示綠色

2.Ansible-doc

用來查詢ansible模塊文檔的說明,類似man,可以針對每個模塊用法說明

列出支持的模塊

[root@CentOS7-02 ~]#ansible-doc -l
(q 退出)

查詢ping模塊的說明信息

[root@CentOS7-02 ~]# ansible-doc ping
> PING (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)

A trivial test module, this module always returns pong' on successful contact. It does not make sense in

3.Ansible-playbook

Ansible-playbook是日常應用中使用頻繁最高的命令,類似linux中的sh,source命令
這個命令,在後面應用腳本會詳細解釋

4.Ansible-console

這個工具是Ansible爲用戶提供的一款交互式工具,類似linux的shell,非常方便
root@CentOS7-02 ~]# ansible-console

root@all (2)[f:5]$ cd web
root@web (2)[f:5]$ list
192.168.100.103
192.168.100.104

root@web (2)[f:5]$ ping
192.168.100.103 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.104 | SUCCESS => {
"changed": false,
"ping": "pong"
}

(支持Tab鍵補全,Ctrl+C退出)

Ansible 模塊

還是在 Ansible 100.102中操作

1.command模塊

command模塊在遠程主機上執行命令,不支持管道,重定向等操作

chdir: 在遠程主機上運行命令前要提前進入的目錄

creates: 在命令運行時創建一個文件,如果文件已存在,不會執行

removes: 在命令運行時移除一個文件,如果文件不存在,不會執行

executeble: 指明運行命令的shell程序

運行“ls ./”命令,對所有組,運行前切換到/home目錄

[root@CentOS7-02 ~]# ansible-console
root@all (2)[f:5]$ cd web
root@web (2)[f:5]$ mkdir /home/123
root@web (2)[f:5]$ exit

[root@CentOS7-02 ~]# ansible all -m command -a "chdir=/home ls ./"

192.168.100.103 | SUCCESS | rc=0 >>
123
192.168.100.104 | SUCCESS | rc=0 >>
123

2.shell模塊

shell模塊在遠程主機執行命令,相當於調用遠程主機Shell的進程,然後在該Shell下打開一個子Shell運行命令,和command區別,它支持 管道,重定向等操作,

[root@CentOS7-02 ~]# ansible web -m shell -a 'echo "hello" >> /root/hello.txt'

192.168.100.104 | SUCCESS | rc=0 >>

192.168.100.103 | SUCCESS | rc=0 >>

[root@CentOS7-02 ~]# ssh 192.168.100.103 cat /root/hello.txt
hello
[root@CentOS7-02 ~]# ssh 192.168.100.104 cat /root/hello.txt
hello

3.copy模塊

copy模塊用於複製指定主機到遠程主機的遠程位置,參數如下

dest: 指出複製文件的目標目錄位置,使用絕對路徑,如果源是目錄,則目標也要是目錄,如果目標文件已存在,會覆蓋

src: 指出源文件路徑,可以使用相對路徑和絕對路徑,支持直接指定目錄,如果源是目錄,測目標也要是目錄

mode: 指出複製時,目標文件的權限,可選
ownter: 指出複製時,目標文件的屬主,可選
group: 支持複製時,目標文件的屬組,可選

content: 指出複製到目標主機上的內容,不能與src一起使用,

[root@CentOS7-02 ~]# ansible web -m copy -a "src=/etc/hosts dest=/root/ mode=777 owner=nobody group=root"

(應該是橘黃色,這裏網頁編輯器只有紅色,橘黃色表示命令執行後目標有變化)

192.168.100.104 | SUCCESS => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/root/hosts",

192.168.100.103 | SUCCESS => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/root/hosts",

[root@CentOS7-02 ~]# ssh 192.168.100.103 ls -l /root/hosts
-rwxrwxrwx 1 nobody root 158 11月 14 14:55 /root/hosts
[root@CentOS7-02 ~]# ssh 192.168.100.104 ls -l /root/hosts
-rwxrwxrwx 1 nobody root 158 11月 14 14:55 /root/hosts
(權限777,nobody是屬主,root是屬組)

4.hostname模塊

hostname模塊用於管理遠程主機上的主機名,參數如下

name : 指定主機名

[root@CentOS7-02 ~]# ansible 192.168.100.103 -m hostname -a "name=demo1"

192.168.100.103 | SUCCESS => {
"ansible_facts": {
"ansible_domain": "",
"ansible_fqdn": "demo1",
"ansible_hostname": "demo1",
"ansible_nodename": "demo1"
},
"changed": true,
"name": "demo1"
}

(還是橘黃色)

進到客戶機 1 100.103中
[root@centos7-03 ~]# hostname
demo1 #這裏雖然改了,重啓纔會生效,本例不重啓

5.yum模塊

yum模塊基於yum機制,可以對遠程主機管理程序包,參數如下

name: 程序包的名稱,可以帶上版本號,若不指明,則默認爲最新版本

state=present | latest | absent : 指明對程序包執行的操作,present表示安裝 latest 表示安裝最新版本的程序包,absent表示卸載

disablerepo: 在用yum安裝時,臨時禁用某個倉庫的ID
enablerepo: 在用yum安裝時,臨時啓動某個倉庫的ID

conf_file: yum運行時的配置文件,而不是使用默認的配置文件
diable_gpg_check=yes|no: 是否啓動完整性效驗功能

這裏的yum只是發送一個指令,客戶端本地需要配置yum,而且有可以軟件包

客戶機1 100.103中配置yum源,掛載光盤,客戶機2 也是

ansible服務器運行如下
[root@CentOS7-02 www]# ansible web -m yum -a "name=vsftpd state=present"

[root@CentOS7-02 www]# ssh 192.168.100.103 rpm -qa vsftpd
vsftpd-3.0.2-22.el7.x86_64

這裏104我就不顯示驗證了

6.service模塊

service模塊爲用來遠程管理主機上的服務模塊,參數如下
name: 被管理的服務
state=started | stopped | restarted : 動作包含關機,關閉或重啓

enabled=yes|no: 表示是否設置開機自啓
runlevel: 如果設定了enabled開機自啓,則要定義在哪些運行目標下自動啓動

先進入客戶機 1 100.103中,運行如下命令
[root@centos7-03 ~]# systemctl stop httpd

再進入客戶機2 100.104中
[root@centos7-04 ~]# systemctl start httpd
[root@centos7-04 ~]# systemctl enable httpd

回到Ansible服務器中
[root@CentOS7-02 ~]# ansible web -m service -a "name=httpd state=started enabled=yes"

192.168.100.104 | SUCCESS => { #綠色顯示,成功沒有改變
"changed": false,
"enabled": true,
"name": "httpd",
"state": "started",

192.168.100.103 | SUCCESS => { #橘黃色顯示,表示有改變
"changed": true,
"enabled": true,
"name": "httpd",
"state": "started",

7.user模塊

user 模塊用於管理遠程主機上的用戶賬戶,參數如下

name: 必須策略,賬戶名稱
state=present| absent : 創建賬戶或者刪除賬戶,present 表示創建,absent表示刪除
system=yes|no: 是否爲系統賬號

uid: 用戶 UID
group: 用戶的基本組
groups: 用戶的附加組
shell: 默認使用的shell
home: 用戶的家目錄

move_home=yes|no: 如果設置的家目錄已經存在,是否將已存在的家目錄進行移動
password: 用戶的密碼,建議使用加密後的字符串
comment: 用戶的註釋信息
remove=yes|no: 當state=absent時,是否要刪除用戶的家目錄

[root@CentOS7-02 ~]# ansible web -m user -a 'name=user1 system=yes uid=51 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment="test user"'

192.168.100.104 | SUCCESS => {
"changed": true,
"comment": "test user",
"createhome": true,
"group": 0,

192.168.100.103 | SUCCESS => {
"changed": true,
"comment": "test user",
"createhome": true,
"group": 0,

[root@CentOS7-02 ~]# ssh 192.168.100.103 tail -1 /etc/passwd
user1:x:51:0:test user:/home/user1:/sbin/nologin
[root@CentOS7-02 ~]# ssh 192.168.100.104 tail -1 /etc/passwd
user1:x:51:0:test user:/home/user1:/sbin/nologin
(51是uid,test user是解釋,/home/user1是家目錄,後面的是使用的shell)

刪除用戶及家目錄實例如下

[root@CentOS7-02 ~]# ansible web -m user -a "name=user1 remove=yes state=absent"

192.168.100.104 | SUCCESS => {
"changed": true,
"force": false,
"name": "user1",

192.168.100.103 | SUCCESS => {
"changed": true,
"force": false,
"name": "user1",

[root@CentOS7-02 ~]# ssh 192.168.100.103 tail -1 /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@CentOS7-02 ~]# ssh 192.168.100.104 tail -1 /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
(已經沒有這個用戶了)

playbook配置文件

1.基本配置

playbook配置文件使用YAML語法,playbook配置文件類似shell腳本,一個YAML格式文件

在playbook配置文件中可以放置任務代碼,然後執行,可以實現自動化運維

YAML文件的擴展名通常爲.yaml或.yml

YAML語法和其他語言類似,通過 “-” 來代表項,通過冒號":"來分隔鍵和值, 整個文件以 " - - - " 開始並以 “. . .” 結束
進入ansible服務器中 100.102中

[root@CentOS7-02 ~]# vim /etc/ansible/hosts (組的改成如下)
[web1]
192.168.100.103
[web1]
192.168.100.104

這裏以一個例子演示,創建用戶,和複製文件

[root@CentOS7-02 ~]# vim /etc/ansible/a.yml (按照下圖中打)
(如果你想直接複製粘貼,我後面提供一個百度雲txt文檔,不要直接託txt到linux中,進去txt後複製粘貼)

必須和我下面的格式一模一樣空格也是,不然會報錯

在這裏插入圖片描述

鏈接:https://pan.baidu.com/s/17lrspNNUi7vPtzptjdhGiQ

提取碼:x56p

腳本寫好後,需要依靠特定的命令執行
ansible-playbook

--syntax-check: 檢查yaml文件的語法
-C: 預測試,不會改變目標主機的任何設置
–list-hosts: 列出yaml文件影響的主機列表
–list-tasks: 列出,yaml文件的任務列表

[root@CentOS7-02 ~]# ansible-playbook --syntax-check /etc/ansible/a.yml (測試a.yml語法)

playbook: /etc/ansible/a.yml #這樣表示沒有錯誤

[root@CentOS7-02 ~]# ansible-playbook -C /etc/ansible/a.yml
在這裏插入圖片描述
[root@CentOS7-02 ~]# ansible-playbook --list-hosts /etc/ansible/a.yml (列出主機)

playbook: /etc/ansible/a.yml

play #1 (web1): web1 TAGS: []t
pattern: [u'web1']
hosts (2):
192.168.100.103
192.168.100.104

play #2 (web2): web2 TAGS: []
pattern: [u'web2']
hosts (0):

[root@CentOS7-02 ~]# ansible-playbook --list-tasks /etc/ansible/a.yml

playbook: /etc/ansible/a.yml

play #1 (web1): web1 TAGS: []
tasks:
adduser TAGS: [aaa] #這裏aaa就是剛剛的tag標籤,可以很方便的看任務
addgroup TAGS: [bbb]

play #2 (web2): web2 TAGS: []
tasks:
copy file to web TAGS: [ccc]

[root@CentOS7-02 ~]# ansible-playbook /etc/ansible/a.yml (執行腳本,注意看下圖)
在這裏插入圖片描述

一般都先是預測試腳本文件,然後再執行腳本文件

2. 觸發器

需要觸發才能執行的任務,當之前在tasks中的任務執行成功後,若希望在此基礎上觸發其他的任務,這是就需要定義handlers

例如當對目標主機的配置文件做修改後,如果任務執行成功,可以配置一個觸發器,在觸發器中,定義目標主機的服務重啓,以使配置文件生效

handlers是Ansible提供的條件機制之一,handlers和task很類似,但是它只是在task通知時候纔會觸發執行

handlers只會在所有任務執行後執行,而且即使被通知多次,它也只會執行一次,handlers按照定義的順序依次執行

例如,把web1 100.103主機的80端口改爲8080端口

[root@CentOS7-02 ~]# ssh 192.168.100.103 netstat -anpt | grep 80
tcp6 0 0 :::80 :::* LISTEN 892/httpd

[root@CentOS7-02 ~]# vim /etc/ansible/httpd.yml (按我下圖打,這個在我上面的百度雲中也有分享)
在這裏插入圖片描述

[root@CentOS7-02 ~]# ansible-playbook --syntax-check /etc/ansible/httpd.yml

playbook: /etc/ansible/httpd.yml #沒有報錯

[root@CentOS7-02 ~]# ansible-playbook -C /etc/ansible/httpd.yml (預測試)

[root@CentOS7-02 ~]# ansible-playbook /etc/ansible/httpd.yml (執行)

[root@CentOS7-02 ~]# ssh 192.168.100.103 netstat -anpt | grep 8080 (已修改)
tcp6 0 0 :::8080 :::* LISTEN 2093/httpd

3.角色

有了角色後,可以直接在yaml文件中調用一個或多個角色,然後會自動運行其目錄中全部代碼,

將多種不同的tasks的文件集中,則該目錄就是角色,角色一般存放在/etc/ansible/roles目錄,

/etc/ansible/roles/目錄下有很多目錄,其中每一個子目錄對應一個角色,每個角色也有自己的目錄結構

有apache角色,nginx角色,這裏mariadb爲例

files: 存放由copy或scrip等模塊調用的文件
templates: 存放template模塊查找所需要的模塊文件的目錄,如mysql配置文件的模塊
tasks: 任務存放的目錄
handlers: 存放相關觸發執行器的目錄
vars: 變量存放的目錄
meta: 用於存放此角色元數據
default: 默認變量存放的目錄,文件中定義了此角色使用的默認變量

基本格式如下
--- hosts: web
remote_user: root
roles:
- mysql
- httpd

當定義了角色後,使用ansible-playbook執行,此時ansible會到角色結合目錄中,去找mysql和httpd目錄,然後依次允許mysql目錄和httpd目錄下的所有代碼

可以只調用一個角色,也可以調用多個角色

這裏以一個例子安裝mariadb數據庫,安裝完成後上傳本地配置文件,重啓服務,並新建testdb數據庫,並允許test用戶對其有權限
1)被管理端配置yum源

客戶機1 100.103配置yun源,掛載系統光盤

2)配置數據庫角色
在ansible服務器100.102中操作

[root@CentOS7-02 ~]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
(會輸出信息,-v就是輸出信息的意思,創建目錄結構)

[root@CentOS7-02 handlers]# cd /etc/ansible/roles/mariadb/

[root@CentOS7-02 mariadb]# ls
files handlers tasks (剛剛創建的三個目錄)
[root@CentOS7-02 mariadb]# cd tasks/ (任務存放目錄)

[root@CentOS7-02 tasks]# vim main.yml
(按照我下圖打,這個上面的百度雲中也有分享)

下面的 這個 “create database testdb” 我下圖中這裏的"databse"打錯了,少打了一個a,把圖中錯誤的改成我這裏紅色字的

在這裏插入圖片描述
這個文件只是部分腳本代碼,不可以單獨運行,所有也就不用測試

[root@CentOS7-02 tasks]# cd /etc/
[root@CentOS7-02 etc]# chmod 777 my.cnf (默認只有讀取權限)

[root@CentOS7-02 etc]# cd /etc/ansible/roles/mariadb/files/
[root@CentOS7-02 files]# cp /etc/my.cnf /etc/ansible/roles/mariadb/files/
(這就是剛剛腳本文件中寫的,src就是會在這個文件夾中找my.cnf,然後上傳)

[root@CentOS7-02 files]# cd …/handlers/
[root@CentOS7-02 handlers]# vim main.yml
在這裏插入圖片描述
保存退出,這個也不可以單獨運行,是一部分代碼

[root@CentOS7-02 handlers]# cd /etc/ansible/
[root@CentOS7-02 ansible]# vim mariadb.yml
在這裏插入圖片描述

執行這個腳本文件,相當於一個總的開關,會調用mariadb角色,並執上兩個文件中的那些代碼

[root@CentOS7-02 ansible]# ansible-playbook --syntax-check mariadb.yml

playbook: mariadb.yml
[root@CentOS7-02 ansible]# ansible-playbook -C mariadb.yml
(測試會出現藍色,沒事,只要沒有紅色就行)

[root@CentOS7-02 tasks]# ansible-playbook /etc/ansible/mariadb.yml
(執行,不能出現紅色,其他顏色都可以,紅色是報錯)

驗證

進入客戶機1 100.103中

[root@demo1 ~]# mysql -u root

MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb | #這裏有testdb數據庫
+--------------------+

驗證權限

MariaDB [(none)]> show grants for 'test'@'192.168.100.%';
在這裏插入圖片描述

實驗完畢 !!

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