ansible 使用詳解
準備工作及試驗環境介紹
假設有三臺主機爲:n1,n2,n3
n1作爲mater主機,其他三臺作爲受控主機
172.16.253.30主機爲centos6系統,其他主機均爲centos7系統
ssh-keygen -t rsa
#跳過生成私鑰和公鑰中間的填寫內容
ssh-copy-id 172.16.253.184
ssh-copy-id 172.16.254.89
ssh-copy-id 172.16.253.47
ssh-copy-id 172.16.253.30
vim /etc/ansible/ansible.cfg
#替換下面指令爲:
host_key_checking = False #本指令的含義爲:每次在執行命令前都要檢查該主機是否已經基於key做過認證
ansible srvs -m ping
#在每臺主機上創建組group和user,並設置密碼
ansible srvs -m group -a 'name="tomcat" state="present"'
ansible srvs -m user -a 'name="tomcat" group="tomcat" password="abcd" state="present"'
#以achudk用戶的身份執行以root用戶的權限執行ping指令
su - achudk
ansible srvs -m ping --become-user=root
基本使用
- 測試執行 ” -C ” 選項
ansible HOSTS -m MODULES -a 'DIRECTIVE' -C
#或者
ansible-playbook PLAYBOOK_NAME -C
- 查詢所有模塊的命令
ansible-doc -l
command模塊與shell模塊的區別
shell功能全面但執行效率低
command不支持:邏輯運算符、條件判斷符號、重定向命令或管道
ansible srvs -m command -a 'echo "$HOSTNAME"'
ansible srvs -m shell -a 'echo "$HOSTNAME"'
使用command模塊會報錯
ansible srvs -m command -a 'cat /etc/issue > /tmp/issue.tmp'
使用shell模塊則不會
ansible srvs -m shell -a 'cat /etc/issue > /tmp/issue.tmp'
ansible srvs -m command -a 'cat /tmp/issue.tmp'
文件傳輸模塊:copy、fetch、template
copy模塊:複製本機文件,傳輸至遠程主機,並修改屬主、屬組和權限
==注意:可以在參數中增加 backup=yes ,可以實現備份的功能==
實現copy功能
ansible srvs -m copy -a 'src=/etc/yum.repos.d/CentOS-Base.repo dest=/etc/yum.repos.d/CentOS-Base.repo owner=root group=root mode=0644'
ansible srvs -m command -a 'yum clean all'
ansible srvs -m command -a 'yum repolist'
實現備份功能
ansible srvs -m copy -a 'src=/root/test.txt dest=/root/ backup=yes'
- fetch模塊:複製遠程文件,傳輸至本機(僅支持傳輸文件,如果傳輸目錄可以先歸檔或壓縮爲一個文件後傳輸)
在n2主機的/root目錄下創建文件f1,在n3主機的/root目錄下創建文件f2,假設n2主機的/root目錄下沒有f2這個文件,假設n3主機的/root目錄下沒有f1這個文件,如果我們想從n2中傳輸f1這個文件至n1的/root目錄下
- ==注意:使用fetch模塊傳輸至本地主機的文件,全部會保存在目錄,文件實際保存路徑爲:==
- /”dest參數指定的目錄”/”源文件所在主機的IP地址”/”執行命令的用戶名”/”傳輸的文件”
#在n1主機執行命令
ansible srvs -m fetch -a 'src=/root/f1 dest=/root/ backup=yes'
#f1文件的路徑
ls 172.16.254.89/root/f1
cron模塊
- 增加計劃任務
設置每天的3:15,執行磁盤空間查看命令,並將命令結果保存至指定位置
ansible srvs -m cron -a 'name="disk check loger" minute=15 hour=3 job="df -hT >> /tpm/df.log"'
#驗證結果
ansible srvs -m command -a 'crontab -l'
ansible srvs -m command -a 'cat /tmp/df.log'
- 移除指定計劃任務
ansible srvs -m cron -a 'name="disk check loger" state=absent'
#驗證
ansible srvs -m command -a 'crontab -l'
yum模塊
安裝epel源
ansible srvs -m yum -a 'name=epel-release state=latest'
安裝應用
ansible srvs -m yum -a 'name=nginx state=latest'
ansible srvs -m yum -a 'name=ntpdate state=latest'
ansible srvs -m command -a 'ntpdate 172.16.0.1'
管理各種服務:service模塊
ansible srvs -m service -a 'name=nginx state=started'
service模塊中的state支持的選擇有:started, stopped, restarted, reloaded
ansible srvs -m service -a 'name=nginx state=restarted'
setup 模塊
自動從遠程主機上獲取可用與playbook中的變量
- 獲取所有可用變量
ansible srvs -m setup
- 對變量進行過濾,僅獲取符合匹配要求的變量
查詢與系統版本相關的變量
“ansible_distribution”: “CentOS”
“ansible_distribution_major_version”: “7”
#方法1
ansible srvs -m setup -a 'filter=*distribut*'
#方法2
ansible srvs -m setup | grep -i distribut
debug 模塊
可以通過debug模塊調用變量顯示想要的信息
tasks:
- name: show hosts information
tags: info
debug: msg="{{ ansible_distribution }}-{{ ansible_distribution_major_vers
ion }}-{{ ansible_distribution_release }}"
驗證結果
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=info
#結果爲
ok: [172.16.254.89] => {
"msg": "CentOS-7-Core"
}
script 模塊
準備測試腳本
vim /root/test.sh
#!/bin/bash
#
touch /tmp/test.log
echo `date` >> /tmp/test.log
ls -l /tmp/test.log
cat /tmp/test.log
在所有主機執行腳本
ansible srvs -m script -a '/root/test.sh'
ansible-vault 命令
- 加密 .yml 文件
#準備一個.yml文件
ansible-vault encrypt test.yml
#輸入密碼並確認
此時無法使用普通方法查看test.yml文件
- 查看加密的.yml文件
ansible-vault view test.yml
#輸入密碼
- 解密.yml文件
ansible-vault decrypt test.yml
#輸入密碼
此時可以使用普通方法查看.yml文件內容
ansible-galaxy 命令
- 文件下載至/etc/ansible/roles目錄下
==注意:下載其他人共享的roles,在執行前應審覈一遍文件內容,防止危險操作==
安裝並使用其他人共享的roles文件
ansible-galaxy install devops.nginx
ls /etc/ansible/roles/devops.nginx
- 想刪除下載的roles文件,將install替換爲delete即可
ansible-console 命令
ansible的交互式命令工具
ansible-console 的命令提示符
root@all (4)[f:5]$ cd srvs
root@srvs (4)[f:5]$ forks 4
root@srvs (4)[f:4]$ list
172.16.253.184
172.16.254.89
172.16.253.47
172.16.253.30
其中:
root :當前執行用戶
@ :分隔符
all :分組的組名
(4) :當前分組內的主機數量
[f:4] :併發線程數
ansible-console 的使用
ansible-console工具可自動補全選項,使用格式爲:
模塊名 選項1=value 選項2=value
service name=nginx state=started
yum name=tree state=latest
command tree -L 1 /
ansible-playbook命令及YAML語法
YAML語法
YAML :YAML ain’t a Markup Language ,以數據爲中心、而不是以標記語言爲重點的一種語言
- 首行以 “—” 開始,且需頂格書寫
- 次行開始寫playbook的正文,建議寫明playbook的功能等描述信息
- 註釋符爲 ” # “
- 格式非常嚴格,嚴格控制縮進統一,不能和空格或Tab混用
- 縮進級別必須一致,縮進級別相同代表同級別,級別的判斷是通過縮進結合換行實現的
- YAML文件內容和Linux系統大小寫的判斷方式保持一致,是區分大小寫的,k/v的值均對大小寫敏感
- k/v的值可同行寫,也可換行寫,同行書寫使用分隔符 ” : ” ,換行寫分隔符 ” - “
- 一個完整的代碼塊所必需包含的元素:name、task
- 一個name只能包括一個task
test.yml 示例
vim /root/test.yml
#文件內容
---
- hosts: srvs
remote_user: root
tasks:
- name: adduser test
user: name=test shell=/bin/bash home=/home/test
playbook 核心元素
- hosts :指定運行任務的目標主機
- tasks :任務列表
- variables :變量
- templates :模板
- handlers :動作執行探測器,探測到指定條件,觸發執行動作
- roles :按照固定目錄結構組成的playbook
playbook中tags、notify、handlers的使用
- ==playbook實例 :httpd-manager.yml==
---
- hosts: srvs
remote_user: root
tasks:
- name: install httpd
tags: install
yum: name=httpd state=latest
- name: start httpd.service
tags: start
service: name=httpd state=started
- name: start httpd.service
tags: restart
service: name=httpd state=restarted
- name: stop httpd.service
tags: stop
service: name=httpd state=stopped
- name: config httpd
tags: config
copy: src=/root/ansible/httpd.conf dest=/etc/httpd/conf/ backup=yes
when: ansible_distribution_major_version == "7"
notify: restart httpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
實現功能:
單獨調用其中一個功能
ansible-playbook httpd-server-deploy.yml --tags=start
- 同時調用多個功能
ansible-playbook httpd-server-deploy.yml --tags="stop,config"
- 針對某一單個成員執行某一功能
ansible-playbook httpd-server-deploy.yml --tags="start,stop" -l 172.16.253.30
playbook中變量的使用
定義變量
在/etc/ansible/hosts文件中定義變量,可針對某臺主機定義變量,也可以對整個分組定義變量
組變量和主機變量的生效優先級爲:如果針對主機定義了變量(無論是否定義了組變量),主機變量生效;如果未定義主機變量,僅定義了組變量,組變量生效。
vim /etc/ansible/hosts
#組變量
[srvs:vars]
webport=80
#主機變量
[srvs]
172.16.253.184 webport=10080 hostname=node1
172.16.254.89 webport=10180 hostname=node2
172.16.253.47 webport=10280 hostname=node3
172.16.253.30 webport=10380 hostname=node4
調用變量
調用變量的兩種方式的生效優先級:在命令行下直接定義的變量優先級高於在hosts文件中定義的變量(主機變量或分組變量)
1. 可以在命令行模式直接使用”ansible-playbook test.yml -e “webport=2000”
2. 調用在hosts文件中定義好的變量引用變量注意:使用雙大括號 “{{ VAR-NAME }}” ,且括號前後要有空格
- 修改主機名
ansible srvs -m hostname -a 'name=“name-{{ hostname }}-port-{{ webport }}"'
ansible srvs -m command -a 'hostname'
#執行結果
172.16.253.30 | SUCCESS | rc=0 >>
name-node4-port-10380
172.16.253.184 | SUCCESS | rc=0 >>
name-node1-port-10080
172.16.253.47 | SUCCESS | rc=0 >>
name-node3-port-10280
172.16.254.89 | SUCCESS | rc=0 >>
name-node2-port-10180
ansible-playbook 之強大的 template
- jianja2語法格式:
支持算術運算:+ , - , * , / , **
支持比較操作符:== , >= , != , <= , > , <
支持邏輯運算符: and , or , not
支持流表達式:for , if , while
使用template在配置文件中調用變量
- 設置template配置文件
#設置jianja2文件
cp /root/ansible/httpd.conf /root/ansible/httpd.conf.j2
vim /root/ansible/httpd.conf.j2
#修改Listen一項的值爲 "{{ webport }}"
Liten {{ webport }}
#重新設置yml文件
cp /root/ansible/httpd-manager.yml /root/ansible/httpd-manager-j2.yml
vim /root/ansible/httpd-manager-j2.yml
#修改config配置塊中的copy指令爲template指令,其他部分不變,示例如下:
- name: config httpd
tags: config
template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "7"
notify: restart httpd
- 執行playbook
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config
#執行結果:對分組中不同的主機採用不同的端口
ansible srvs -m shell -a 'ss -tnlp | grep httpd'
- template還支持算術運算
將所有端口加1
vim /root/ansible/httpd.conf.j2
#修改以下內容
Listen {{ webport+1 }}
通過template在配置文件中使用for循環和if語句
- 定義基於不同域名的多個虛擬主機
#查找主機名變量
ansible srvs -m setup | grep hostname
#修改httpd.conf.j2文件
Listen {{ webport }}
<VirtualHost *.{{ webport }}>
ServerName {{ ansible_hostname }}.achudk.com
DocumentRoot /var/www/html
<Directory "/var/www">
Require all granted
</Directory>
</VirtualHost>
#驗證結果
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config
curl curl 172.16.254.89:10180
- 使用for循環生成多個基於不同域名且不同端口的虛擬主機,並使用if判斷條件
#修改httpd.conf.j2文件
vim httpd.conf.j2
{% for vport in vports %}
<VirtualHost *.{{ vport }}>
ServerName {{ ansible_hostname }}.achudk.com
DocumentRoot /var/www/html
<Directory "/var/www">
Require all granted
</Directory>
{% if errorlog is not defined %}
ErrorLog "{{ errorlog | default('/web/httpd/log/vh1/error_log') }}"
{% endif %}
</VirtualHost>
{% endfor %}
#修改httpd-manager-j2.yml文件,在起始處增加vars指令,餘下內容不變,如下:
vim httpd-manager-j2.yml
#正文如下
---
- hosts: srvs
remote_user: root
vars:
- vport:
- 80
- 443
- 8080
- errorlog:
- "/web/httpd/log/vh1/error_log"
#驗證結果
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config
- when條件判斷
#當系統爲CentOS7時,才啓用該配置片段
- name: config httpd
tags: config
template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution == "CentOS"
when: ansible_distribution_major_version == "7"
notify: restart httpd
- ==when指令的多條件聯合判斷==
多個條件之間使用 “and” 連接
tasks:
- name: show hosts information
tags: info
debug: msg={{ ansible_distribution }},msg={{ ansible_distribution_major_v
ersion }}
when: ansible_distribution == "CentOS" and ansible_distribution_major_ver
sion == "6"
==最終實例==
將所學內容綜合起來使用,形成具有管理功能的yml文件
---
- hosts: srvs
remote_user: root
vars:
- vports:
- 80
- 443
- 8080
- errorlog:
- "/web/httpd/log/vh1/error_log"
tasks:
- name: show hosts information
tags: info
debug: msg="{{ ansible_distribution }}-{{ ansible_distribution_major_version }}-{{ ansible_distribution_release }}"
- name: install httpd
tags: install
yum: name=httpd state=latest
- name: start httpd.service
tags: start
service: name=httpd state=started
- name: start httpd.service
tags: restart
service: name=httpd state=restarted
- name: stop httpd.service
tags: stop
service: name=httpd state=stopped
- name: config httpd
tags: config
template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution == "CentOS" and ansible_distribution_major_ver
sion == "7"
notify: restart httpd
handlers:
- name: restart httpd
service: name=httpd state=restarted