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

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

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

1,更改各個主機名稱

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

#hostnamectl set-hostname ansible-centos7

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

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

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

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

# vim /etc/sysconfig/network

添加如下

HOSTNAME=node3-centos6.localdomain

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

2,配置基於SSH KEY驗證

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

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

[root@ansible-centos7 ~]  # 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。,建議取消註釋

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

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

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

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

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

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

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

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

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

Ansible一共有2080個模塊,學無止境。
Linux之Ansible入門用法(實驗解析)

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

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

4,Ansible部分用法

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

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

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

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

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

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

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

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

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

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

6, # ansible websrv -a 'sed -i "s@SELINUX=disabled@SELINUX=permissvie@" /etc/selinux/config'
批量修改selinux配置文件

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

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'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

創建軟鏈接

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

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

創建硬鏈接

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

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

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

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

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

當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"'

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

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

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

刪除名字爲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*"'

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

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

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

執行yml文件

# ansible-playbook wall_helo.yml

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

# vim install_httpd.yml

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

執行腳本

# ansible-playbook install_httpd.yml

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

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

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

# vim create_mysql.yml               

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

執行結果:

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

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

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

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

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

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

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

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

6,tags的應用

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

# ansible-playbook -t config install_httpd.yml

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

7,變量引用

ansible_hostname
ansible_nodename
ansible_fqdn    
ansible_memtotal_mb
ansible_processor_vcpus

1,使用setup模塊內部變量

# vim create_file.yml

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

執行結果:

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

2,定義普通變量

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

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

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

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

查看結果

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

3,定義公共組變量

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

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

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

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

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

# vim /etc/ansible/hosts

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

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

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

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

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

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

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

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

# vim create_file.yml

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

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

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

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

# vim vars.yml

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

# vim create_file.yml

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

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

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

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

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

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

8,模板template

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

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

模板應用之一:httpd

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

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

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

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

模板應用之二:nginx

# vim install_nginx.yml

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

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

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

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

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

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

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

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

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

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

# vim nginx.conf.j2

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

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

# vim install_nginx.yml

修改如下 ,然後跑一遍

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

結果:線程數增加

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

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

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

yml文件內容

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

跑一遍yml文件
結果:

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

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

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

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

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

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

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

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

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

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

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

# vim test.conf.j2

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

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

再寫一個yml腳本:

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

執行結果:

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

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
root@test (2)[f:10] $
執行用戶@當前操作的主機組 (當前組的主機數量)[f:併發數]$
設置併發數: forks n 例如: forks 10
切換組: cd 主機組 例如: cd web
列出當前組主機列表: list
列出所有的內置命令: ?或help
示例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
root@appsrvs (2)[f:5]$ list
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章