一、ansible Playbook應用
由于服務器數量很多,配置信息比較多,因此可以利用Ansible Playbook編寫任務自動化與流程化腳本
Playbook 由一個或多個play組成的列表,play的主要功能Ansible中Task定義好的角色,指定劇本對應的服務器組
二、Ansible實戰演練
yaml語法特點
Ansible Playbook可以收集命令、可以創建多個任務集,Playbook采用YAML語法結構
YAML語言特性:可讀性強、腳本語言交互性好、實現語言的數據類型、信息模型、易于實現,可擴展性強
ansible-playbook組件
Target 定義playbook的遠程主機組;
Variable 定義playbook使用的變量;
Task 定義遠程主機上執行的任務列表;
Handler 定義task執行完成以后需要調用的任務,例如配置文件被改動,則啟動handler任務重啟相關聯的服務。
ansible批量創建用戶
- hosts: allremote_user: roottasks:- name: create useruser: name={{item}} state=presentwith_items:- halo1- halo2- halo3- halo4
nginx之v1版本中play-book劇本
使用了taget模塊、task模塊構建
## 創建劇本文件
touch install_nginx.yaml ## 編寫劇本
#!/bin/bash
#2025年8月20日10:14:06
# auto install nginx web
# by author www.hxd666.com
- hosts: 192.168.101.7remote_user: roottasks:- name: download_nginxshell: wget -c http://nginx.org//download/nginx-1.26.1.tar.gz -P /usr/src/- name: extract nginx softwareshell: cd /usr/src/;tar -xzf nginx.1.26.1.tar.gz- name: install gcc and pcre-develyum: name=gcc,pcre-devel,zlib-devel state=install- name: install nginxshell: cd /usr/src/nginx.1.26.1/;./confirgure;make;make install- name: start nginxshell: /usr/local/nginx/sbin/nginx## 啟動劇本
[root@localhost ~]# ansible-playbook install_nginx.yaml
nginx之v2版本中play-book劇本
優化了版本v1模塊,如涉及到了版本handler模塊處理,判斷了是否已經安裝nginx模塊
notify模塊前寫執行條件,后面寫執行哪些模塊,并指明順序,而handler模塊后面寫task模塊任務板塊內容
- hosts: 192.168.101.7remote_user: roottasks:- name: nginx server installfile: path=/usr/local/nginx state=directorynotify:- download_nginx- extract nginx- install tools- install_nginx- start nginxhandlers:- name: download_nginxshell: wget "http://nginx.org/download/nginx-1.26.1.tar.gz" -P /usr/src- name: extract nginxshell: cd /usr/src;tar -zxf nginx-1.26.1.tar.gz- name: install toolsyum: name=pcre,pcre-devel,zlib-devel state=installed- name: install_nginxshell: cd /usr/src/nginx-1.26.1; ./configure;make;make install- name: start nginxshell: /usr/local/nginx/sbin/nginx
nginx之v3版本中play-book劇本
引入變量簡化書寫,易于觀察(vars模塊)
- hosts: allremote_user: rootvars:NGX_SOFT: nginx-1.26.1.tar.gzNGX_DIR: /usr/local/nginxtasks:- name: install nginx_toolsyum: name=gcc,pcre-devel,zlib-devel- name: check nginxfile: path={{ NGX_DIR }} state=directorynotify:- download nginx- extract nginx- install nginx- start nginxhandlers:- name: download nginxshell: wget http://nginx.org/download/{{ NGX_SOFT }} -P /usr/src- name: extract nginxshell: cd /usr/src;tar -zxf {{ NGX_SOFT }};- name: install nginxshell: cd /usr/src/nginx-1.26.1;./configure; make; make install;- name: start nginxshell: "{{ NGX_DIR }}/sbin/nginx"
nginx之v4版本中play-book劇本
自定義template.yaml模塊,根據設置ansible主機端口管理遠程機器
## 根據遠程的ansible設置端口
[nginx]
192.168.101.5 httpd_port=80
[web]
192.168.101.6 httpd_port=81
192.168.101.7 httpd_port=82## 設置模版nginx文件,修改模版配置文件中的內容
listen {{httpd_port}}## 在ansible添加templete模塊進行遠程控制
template: src=/data/sh/nginx.bak dest=/usr/local/nginx/conf/nginx.conf
三、ansible配置文件和優化
ansible默認的配置文件為/etc/ansible/ansible.cfg,那么咱們下面來詳細聊聊ansible各項參數,包括用戶、模塊路徑、配置優化等
ansible配置文件
下面來看一下defaults默認配置端常見參數
[defaults]?? ????????????????????????????????????????? 通用默認配置段;
inventory????? = /etc/ansible/hosts???? ??? ????被控端IP或者DNS列表;
library??????? = /usr/share/my_modules/ ? ????Ansible默認搜尋模塊的位置;
host_key_checking = False? ? ? ? ? ? ? ? ? ? ? 不檢查遠程主機的公鑰和密鑰
#sudo_exe = sudo???? ????????????????????????? ????sudo遠程執行命令;
#sudo_flags = -H?????????????????????????????????? 傳遞sudo之外的參數;
timeout = 10????????????????????????????????????????? SSH超時時間;
remote_user = root?? ?????????????????????????? ????遠程登陸用戶名;
log_path = /var/log/ansible.log???? ????? ????日志文件存放路徑;
module_name = shell ???????????????????? ????????Ansible命令執行默認的模塊;
#executable = /bin/bash???? ????????????????????? 執行的Shell環境,用戶Shell模塊;
#system_warnings = False??? ???????????????????? 禁用系統運行ansible潛在問題警告;
#command_warnings = False??? ??????????????? ????command模塊Ansible默認發出警告;
nocolor = 0? ?????????????????????????????????? ????輸出帶上顏色區別,開啟/關閉:0/1;
pipelining = True?????????????????????????????????? 開啟pipe SSH通道優化;
ansible性能優化
ansible在企業環境中,隨著被管理 的服務器越來越多,ansible的執行效率會越來越慢,可以通過優化openssh協議提高,提高后臺管理的效率
Anisble SSH關閉密鑰檢測
ssh 遠程登錄客戶端,會檢查客戶端主機的公鑰,并將公鑰的情況記錄在~/.ssh/know_hosts文件中,若openssh公鑰不同,openssh會發出警告,而當openssh 公鑰相同,則會提示輸出密碼
## 關閉ssh檢查
host_key_checking = False
OpenSSH連接優化
使用OpenSSH服務時,默認SShd配置文件UseDNS=yes狀態,該選項會導致SSH服務根據客戶端的IP進行DNS PTR反向解析,得到客戶端主機名,然后將根據取到的主機名進行正向DNS解析,從而驗證該IP是否與原始IP一致。
sed -i '/^GSSAPI/s/yes/no/g;/UseDNS/d;/Protocol/aUseDNS no'
/etc/ssh/sshd_config
/etc/init.d/sshd restart
SSH pipelineing加速Ansible
SSH pipelining默認是關閉的,關閉是為了兼容不同sudo問題,主要是requiretty選項(使用sudo操作必須將其禁止)
sed -i '/^pipelining/s/False/True/g' /etc/ansible/ansible.cfg
Ansible Facts緩存優化
Ansible-playbook在執行過程中,默認會執行Gather facts,如果不需要獲取fact基礎數據(客戶端IP、掩碼、Mac、主機名信息),關閉之后可以加快ansible-play-book效率
gather_facts: no
Facts信息可以作為Ansible Play-book變量信息進行引用,當然可以的話我們也可以考慮使用Redis存放Facts信息
- 安裝Redis和Python-Redis服務中間價
## 1.部署Redis服務
wget http://download.redis.io/releases/redis-2.8.13.tar.gz tar -zxf redis-2.8.13.tar.gzcd redis-2.8.13make PREFIX=/usr/local/redis installcp redis.conf /usr/local/redis/export PATH=/usr/local/redis/bin:$PATH
source /etc/profile## 啟動
nohup /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &## 2.安裝Python-Redis模塊
yum -y install python-redis
- Ansible整合Redis配置
在ansible.cfg的defaults段加如下代碼,如果admin有密碼,則開啟admin密碼行
gathering = smart
fact_caching = redis
fact_caching_timeout = 86400
fact_caching_connection = localhost:6379
#fact_caching_connection = localhost:6379:0:admin
ControlPersist SSH優化(要求centos6以上高版本ssh)
ControlPersist即持久化Socket,即一次驗證多次通信,并且只需要修改ssh客戶端配置即可
ansible以root身份登錄客戶端,在機器的/root/.ssh/config(低版本用yum升級openssh)文件中加入如下代碼
Host * ## 表示適用于所有主機Compression yes ## SSH連接壓縮數據流ServerAliveInterval 60 ## 客戶端發送心跳包時間ServerAliveCountMax 5 ## 客戶端發送心跳包間隔時間ControlMaster auto ## 啟用連接復用,減少斷開次數ControlPath ~/.ssh/%r@%h-%p ## 開啟復用的文件路徑ControlPersist 4h ## 復用的持續時間