1. 程式人生 > >Linux之Ansible入門用法(實驗解析)

Linux之Ansible入門用法(實驗解析)

blog work sent 取消 script 主機系統 http water 開頭

Linux之Ansible入門用法(實驗解析)

實驗前提:
三臺CentOS7和一臺CentOS6,其中一臺CentOS7當作Ansible堡壘機,其余三臺主機當作被控主機。四臺主機均為最小化安裝,全部配置好了yum源,包括本地和EPEL源,禁用了防火墻和SELINUX。每個主機上面都增加了一塊橋接網卡可供安裝EPEL源資源。分別設置各個主機的主機名為ansible,node1-centos7,node2-centos7,node3-centos,使用Ansible管理,最好基於SSH KEY驗證,這樣就不用輸入各個主機的密碼了。

1,更改各個主機名稱

技術分享圖片

#hostnamectl set-hostname ansible-centos7

其余兩臺Centos7按下圖更改類似,更改完畢後,重新登入生效

技術分享圖片

#hostname node3-centos6
#vim /etc/hosts 在第一行最後增加node3-centos6

技術分享圖片

# vim /etc/sysconfig/network

添加如下

HOSTNAME=node3-centos6.localdomain

技術分享圖片

2,配置基於SSH KEY驗證

ssh-keygen
生成密鑰對-實驗用處,故沒有對私鑰加密,生產環境看需要

技術分享圖片

[[email protected] ~]  # ssh-copy-id 172.16.36.132 **

同樣拷貝到另外兩臺被控主機,即可直接SSH IPADDR

3,配置堡壘機/主控機

yum源配置就位,外網卡連接就位,開始安裝ansible

#yum install ansible        沒任何意外安裝成功
#vim /etc/ansible/ansible.cfg

找到下面的一行,將 #號刪除,此項是為了SSH遠程主機IP時,檢查對應服務器的host_key,不輸入YES。,建議取消註釋

技術分享圖片

找到下面的一行,將 #號刪除,更改command為shell。此項為Ansible不加-m MODULE時默認調用模塊。

技術分享圖片

ansible.cfg中對返回的消息不同顏色的釋義

技術分享圖片

如果想要使用ansible的話,需要將被控主機IP放入到hosts目錄中,如下圖,參照內部說明即可定義。同一個主機IP可以同時屬於不同組

技術分享圖片
技術分享圖片

測試Ansible ping模塊-返回正常,表明堡壘機配置成功。

技術分享圖片

Ansible一共有2080個模塊,學無止境。
技術分享圖片

先收工回去休息^.^,Ansible批量關機

技術分享圖片

4,Ansible部分用法

1, # ansible websrv -m ping -v|-vv|-vvv 顯示詳細或更詳細過程

技術分享圖片

2, # ansible |172.16.36.12|websrv|appsrv|all -m ping
hostpattern可以使用通配符,別名,ip地址。前提在/etc/ansible/hosts中有定義

技術分享圖片

3, # ansible ‘websrv:!appsrv’|‘websrv:&appsrv‘ -m ping hostpattern也可以使用邏輯與&,邏輯非!,以及正則表達式(需要以~開頭),來取得hosts中的IP

技術分享圖片

4, # ansible-doc -s shell 查看shell這個模塊的說明

技術分享圖片

5, # ansible websrv -a ‘echo $HOSTNAME’ 查看被控主機時,變量引用需要在單引號中,雙引號無效(顯示本機主機名),雙引號中可以寫命令(如果命令中還有需要使用引號的選項,則使用單引號)

技術分享圖片
技術分享圖片

6, # ansible websrv -a ‘sed -i "[email protected][email protected][email protected]" /etc/selinux/config‘
批量修改selinux配置文件

技術分享圖片

5,Ansible常用模塊

command,shell,script,copy,fetch,file,unarchive,hostname,cron,yum,service,user,group,setup
1,script
腳本模塊
直接在被控主機執行本機腳本

# vim hello.sh
hostname > /data/hostname.log
# ansible websrv -m script -a ‘/root/hello.sh‘

技術分享圖片

2,copy
拷貝模塊
將本機文件復制到被控主機上,可指定相應內容

# ansible websrv -m copy -a ‘src=/root/hello.sh dest=/data/ owner=martin group=bin mode=600‘

技術分享圖片

寫內容並在被控主機生成文檔

# ansible websrv -m copy -a ‘content="hello\nlinux" dest=/data/my.txt‘ 

技術分享圖片

源文件覆蓋被控主機文件,提前備份主機文件

# ansible websrv -m copy -a ‘src=/root/hello.sh dest=/data/my.txt backup=yes  

技術分享圖片

3,fetch
抓取模塊
被控端主機文件抓取到本地機,目前支支持文件抓取,需要抓取目錄內所有數據的話,先打包

抓取過來同時保持目錄結構

# ansible websrv -m fetch -a ‘src=/data/my.txt dest=/root/‘ 

技術分享圖片

4,file
文件模塊
設置文件屬性
創建軟硬鏈接 state=touch(空文件)|directory(目錄)|link(軟鏈接)|hard(硬鏈接)|absent(刪除,不支持通配符*)

# ansible websrv -m file -a ‘path=/data/root owner=martin mode=000‘

技術分享圖片

創建軟鏈接

# ansible websrv -m file -a ‘src=/data/hello.sh path=/data/hello.sh.link state=link‘

技術分享圖片

創建硬鏈接

# ansible websrv -m file -a ‘src=/data/hello.sh path=/data/hello.sh.hardlink state=hard‘ 

技術分享圖片

5,unarchive
解壓模塊
解壓文件到被控主機
如果copy不指定no,默認copy為yes相當於把本機打包文件拷貝到被控主機上,再解壓。

# ansible websrv -m unarchive -a ‘src=/root/root.tar dest=/data/‘

技術分享圖片

當copy=no時,src指定網上的壓縮包

# ansible websrv -m unrchive -a ‘src=https://example.com/example.zip dest=/usr/local/bin copy=no’

6,hostname
主機名模塊
更改主機名
如果要定義不同主機不同主機名,需要用到變量,此方式修改,直接修改主機名的配置文件centos6:/etc/sysconfig/networks,centos7:/etc/hostname,永久生效。

# ansible 172.16.36.142 -m hostname -a ‘name=test.localdomain‘

7,cron
計劃任務
支持時間:minute,hour,day,month,weekday
每5分鐘執行一次向堡壘機同步時間。

# ansible 172.16.36.112 -m cron -a ‘name=synctime minute=*/5 job="ntpdate 172.16.36.122 &> /dev/null"‘

技術分享圖片

# ansible all -m cron -a ‘name=synctime minute=*/5 job="ntpdate 172.16.36.122 &> /dev/null" disabled=true‘

技術分享圖片

刪除名字為synctime的任務項

# ansible all -m cron -a ‘name=synctime state=absent‘

8,yum
安裝模塊
安裝服務等

# ansible appsrv -m yum -a ‘name=httpd state=present‘   安裝
# ansible appsrv -m yum -a ‘name=httpd state=absent‘    卸載

9,service
服務模塊
對服務狀態做出控制

# ansible appsrv -m service -a ‘name=httpd state=started|stoppted|reloaded|restarted‘ 服務管理
# ansible appsrv -m service -a ‘name=httpd enabled=yes‘  開機是否自啟動

10,user
用戶模塊
創建用戶使用
創建mysql為系統用戶,指定家目錄,但不創建家目錄

# ansible appsrv -m user -a ‘name=mysql system=yes shell=/sbin/nologin home=/usr/local/mysql create_home=no‘

刪除mysql用戶

# ansible appsrv -m user -a ‘name=mysql state=absent‘

刪除mysql用戶,如果家目錄存在的話,刪除之

# ansible appsrv -m user -a ‘name=mysql remove=true state=absent‘

11,group
組模塊
創建組使用
創建mysql組

# ansible appsrv -m user -a ‘name=mysql system=yes‘

刪除mysql組

#  ansible appsrv -m user -a ‘name=mysql state=absent‘

12,setup
主機信息模塊

# ansible appsrv -m setup -a ‘filter="*hostname*"‘

技術分享圖片

6,Ansible系列命令

1,ansible-galaxy

連接 https://galaxy.ansible.com 下載相應的roles
安裝galaxy
geerlingguy.redis
開發者姓名.角色

# ansible-galaxy install geerlingguy.redis 

刪除galaxy

# ansible-galaxy remove geerlingguy.redis

2,ansible-playbook

執行腳本前檢查有無錯誤,可使用ansible-playbook -C xxx.yml

1,編寫一個yml文件

嚴格區分空格,對其方式,第一次寫頭大

# vim wall_helo.yml

技術分享圖片

執行yml文件

# ansible-playbook wall_helo.yml

2,編寫一個安裝httpd的yml文件

# vim install_httpd.yml

技術分享圖片

執行腳本

# ansible-playbook install_httpd.yml

配置文件端口已被修改為8000
執行結果:

技術分享圖片

3,編寫一個yum文件,用於創建mysql用戶

# vim create_mysql.yml               

技術分享圖片

執行結果:

技術分享圖片

4,存儲yml文件目錄結構,方便存儲。

技術分享圖片

針對上述install_httpd.yml,改進如下

技術分享圖片

5,handlers和notify結合使用出發條件

針對上述install_httpd.yml,改進如下

技術分享圖片

6,tags的應用

針對上述install_httpd.yml,改進如下
指定tags定義的內容,只執行此tags內的列表內容,可多個tags同時執行,用逗號分隔。
tags定義的內容可以相同,同時執行相同tags內的列表內容。

# ansible-playbook -t config install_httpd.yml

技術分享圖片

7,變量引用

ansible_hostname
ansible_nodename
ansible_fqdn    
ansible_memtotal_mb
ansible_processor_vcpus

1,使用setup模塊內部變量

# vim create_file.yml

技術分享圖片

執行結果:

技術分享圖片

2,定義普通變量

# vim /etc/ansible/hosts 如下圖針對不同IP增加port變量

技術分享圖片

# vim create_file.yml
# 創建文件名時加上{{port}},調用上面/etc/ansible/hosts裏port變量裏的值。

技術分享圖片

查看結果

技術分享圖片

3,定義公共組變量

# vim /etc/ansible/hosts 如下圖針對某個組內增加martin變量

技術分享圖片

# vim create_file.yml
# 創建文件名時加上{{martin}},調用上面/etc/ansible/hosts裏martin變量裏的值。

技術分享圖片

4,定義公共組變量和普通變量,其中有一個IP沒定義port變量

# vim /etc/ansible/hosts

技術分享圖片

結論:變量優先級:普通變量優先級大於公共變量

技術分享圖片

5,命令行變量直接定義-e

# ansible-playbook -e port=9527 create_file.yml

結論:命令行變量優先級大於普通變量優先級大於公共變量

技術分享圖片

6,直接在yml腳本內定義變量

# vim create_file.yml

技術分享圖片

結論:yml文件內變量優先級大於普通變量優先級大於公共變量

技術分享圖片

7,變量單獨定義在另一個yml文件中

# vim vars.yml

技術分享圖片

# vim create_file.yml

技術分享圖片

結論:單獨yml定義變量優先級在執行的yml腳本內變量之上

技術分享圖片

8,命令行定義變量,yml腳本內定義變量,同時定義普通變量和公共變量

# ansible-playbook -e port=9999 create_file.yml

結論:
命令行定義變量優先級最高
外部yml定義變量優先級第二
yml內定義變量優先級第三
普通變量優先級第四
公共變量優先級第五

8,模板template

根據模板內容動態生成對應的配置文件,模板文件必須存放在templates目錄下,且後綴為.j2,此目錄和yml文件存放目錄平級。

技術分享圖片

模板應用之一:httpd

# vim templates/httpd.conf.j2 找到Listen這行,將端口改為9999
修改上面的install_httpd.yml

技術分享圖片

執行結果:通過template功能拷貝文件到被控主機端覆蓋文件

技術分享圖片

模板應用之二:nginx

# vim install_nginx.yml

技術分享圖片

跑一下yml腳本,安裝成功後,可以看下nginx線程數,
但由於使用最小安裝,pstree竟然都沒有,自己安裝下》。》

# ansible appsrv -a ‘yum install psmisc -y‘

查看一下進程樹,ngnix的線程數和cpu內核數量有關,但可後期人為更改,需要用到template,

技術分享圖片

把配置文件先拷貝到templates文件夾內

# cp /etc/nginx/nginx.conf templates/nginx.conf.j2

技術分享圖片

使用setup模塊找到cpu對應的變量,進而去修改nginx.conf裏的線程數量,改變啟動後的線程數

技術分享圖片

# vim nginx.conf.j2

更改如下,將線程數改為cpu內核數量+2個。

技術分享圖片

# vim install_nginx.yml

修改如下 ,然後跑一遍

技術分享圖片

結果:線程數增加

技術分享圖片

模板應用之三:when的使用
根據被控主機系統不同應用不同模板時,就需要使用到when
還是拿httpd服務實驗,websrv裏有一臺主機是centos6,另一臺是centos7。事先在templates文件夾裏放入兩個不同版本的httpd.conf.j2。為了加以區分,6的端口號改為90,7的端口號改為4444

技術分享圖片

yml文件內容

技術分享圖片

跑一遍yml文件
結果:

技術分享圖片

叠代:with_items的使用
使用方法之一:創建不同名稱文件

# cp create_file.yml create_file2.yml
# vim create_file2.yml

技術分享圖片

跑一遍yml腳本
結果:叠代生成多個文件。

技術分享圖片

使用方法之二:創建用戶和與之對應的組(with_items和字典{})

技術分享圖片

執行結果:創建用戶成功,組相對應

技術分享圖片
技術分享圖片

模板應用之四:for if
使用test.conf.j2模板,動態生成多個不同內容的配置文件

# vim test.conf.j2

定義默認端口,如果yml文件裏沒給出端口號,會使用模板默認端口,if用法,如果定義了,就使用定義的,沒定義就置為空。

技術分享圖片

再寫一個yml腳本:

技術分享圖片

執行結果:

技術分享圖片

3,ansible-vault

管理加密解密yml文件

ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 編輯加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 創建新文件

4,ansible-console

交互式執行ansible命令

Ansible-console:2.0+新增,可交互執行命令,支持tab
[email protected] (2)[f:10] $
執行用戶@當前操作的主機組 (當前組的主機數量)[f:並發數]$
設置並發數: forks n 例如: forks 10
切換組: cd 主機組 例如: cd web
列出當前組主機列表: list
列出所有的內置命令: ?或help
示例:
[email protected] (2)[f:5]$ list
[email protected] (2)[f:5]$ cd appsrvs
[email protected] (2)[f:5]$ list
[email protected] (2)[f:5]$ yum name=httpd state=present
[email protected] (2)[f:5]$ service name=httpd state=started

Linux之Ansible入門用法(實驗解析)