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入門用法(實驗解析)