Ansible自動運維企業實戰


目錄:

1.1  自動化運維工具簡介

1.2  Ansible運維工具原理

1.3  Ansible安裝配置

1.4  Ansible工具參數詳解

1.5  Ansible ping模塊實戰

1.6  Ansible command模塊實戰

1.7  Ansible copy模塊實戰

1.8  Ansible yum模塊實戰

1.9  Ansible file模塊實戰

1.10  Ansible user模塊實戰

1.11  Ansible cron模塊實戰

1.12  Ansible synchronize模塊實戰

1.13  Ansible shell模塊實戰

1.14  Ansible service模塊實戰

1.15  Ansible Playbook應用

1.16  Ansible配置文件詳解

1.17  Ansible性能調優

 

 

 

 

1.1  自動化運維工具簡介

曾有媒體報道,Facebook一個運維人員管理上萬台服務器,如果使用手工的方法去維護是很難做到的,基於自動化工具就可以輕松的實現管理上萬台、甚至十萬台。

如下為IT運維主流自動化管理工具PuppetsaltstackAnsible各自優缺點:

1.1.1  Puppet自動運維工具

Puppet是早期的Linux自動化運維工具,是一種LinuxUnixWindows平台的集中配置管理系統,發展至今目前已經非常成熟,可以批量管理遠程服務器,模塊豐富,配置復雜,基於Ruby語言編寫。最典型的C/S模式,需要安裝服務端與客戶端。

puppet采用C/S星狀的結構,所有的客戶端和一個或幾個服務器交互,每個客戶端周期的(默認半個小時)向服務器發送請求,獲得其最新的配置信息,保證和該配置信息同步。

每個puppet客戶端每半小時(可以設置)連接一次服務器端, 下載最新的配置文件,並且嚴格按照配置文件來配置客戶端. 配置完成以后,puppet客戶端可以反饋給服務器端一個消息,如果出錯也會給服務器端反饋一個消息。

Puppet適用於服務器管理的整個過程,比如初始安裝、配置、更新以及系統下線。

1.1.2  Saltstack自動運維工具

SaltstackPuppet均是C/S模式,需安裝服務端與客戶端,基於Python編寫,加入MQ消息同步,可以使執行命令和執行結果高效返回,但其執行過程需等待客戶端全部返回,如果客戶端未及時返回或未響應的話,可能會導致部分機器沒有執行結果。

1.1.3  Ansible自動運維工具

AnsibleSaltstack均是基於Python語言開發,Ansible只需要在一台普通的服務器上運行即可,不需要在客戶端服務器上安裝客戶端。因為Ansible是基於SSH遠程管理,而Linux服務器大都離不開SSH,所以Ansible不需要為配置工作添加額外的支持。

Ansible安裝使用非常簡單,而且基於上千個插件和模塊實現各種軟件、平台、版本的管理,支持虛擬容器多層級的部署。很多讀者在使用Ansible工具時,認為AnsibleSaltstatck執行效率慢,其實不是軟件本身慢,是由於SSH服務慢,可以優化SSH連接速度及使用Ansible加速模塊,滿足企業上萬台服務器的維護和管理。

1.2  Ansible運維工具原理

Ansible是一款極為靈活的開源工具套件,能夠大大簡化Unix管理員的自動化配置管理與流程控制方式。它利用推送方式對客戶系統加以配置,這樣所有工作都可在主服務器端完成。其命令行機制同樣非常強大,允許大家利用商業許可Web UI實現授權管理與配置。

可以通過命令行或者GUI來使用Ansible,運行Ansible的服務器這里俗稱管理節點;通過Ansible進行管理的服務器俗稱受控節點。權威媒體報道Ansible2015年被Red Hat公司1.5億美元收購,新版Red Hat內置Ansible軟件。

本書以Ansible為案例,基於Ansible構建企業自動化運維平台,實現大規模服務器的快速管理和部署。Ansible將平常復雜的配置工作變得簡單,變得更加標准化更容易控制。

Ansible自動運維管理工具優點:

輕量級,更新時,只需要在操作機上進行一次更新即可;

采用SSH協議;

不需要去客戶端安裝agent;

批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行;        

使用python編寫的,維護更簡單;     

支持sudo普通用戶命令;

去中心化管理。

 

1.3  Ansible安裝配置

Ansible 可以工作在LinuxBSDMac OS X 等平台,對Python環境的版本最低要求為Python2.6以上,如果操作系統Python軟件版本為2.4,需要升級方可使用Ansible工具。

Red HatCentOS操作系統可以直接基於YUM工具自動安裝AnsibleCentOS6.x或者CentOS7.x安裝前,需先安裝epel擴展源,代碼如下:

rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum   install   epel-release   -y

yum   install   ansible       -y

Ansible工具默認主目錄為:/etc/ansible/,其中hosts文件為被管理機IP或者主機名列表,ansible.cfgansible主配置文件,roles為角色或者插件路徑,默認該目錄為空,如圖21-2所示:

 

21-2 Ansible主目錄信息

Ansible遠程批量管理,其中執行命令是通過Ad-Hoc來完成,也即點對點單條執行命令,能夠快速執行,而且不需要保存執行的命令。默認hosts文件配置主機列表,可以配置分組,可以定義各種ip及規則,hosts列表默認配置如圖21-3所示:

 

21-3 Hosts主機列表文件內容

Ansible基於多模塊管理,常用的Ansible工具管理模塊包括:commandshellscriptyumcopyFileasyncdockercronmysql_userpingsysctluseracladd_hosteasy_installhaproxy等。

可以使用ansible-doc -l|more查看ansible支持的模塊,也可以查看每個模塊的幫助文檔,ansible-doc  module_name,如圖21-4所示:

 

21-4 Ansible-doc docker幫助信息

 

1.4  Ansible工具參數詳解

基於Ansible批量管理之前,需將被管理的服務器IP列表添加至/etc/ansible/hosts文件中,如圖21-5添加4台被管理端IP地址,分成webdb兩組,本機也可以是被管理機。

21-5 Ansible Hosts主機列表

基於Ansible自動運維工具管理客戶端案例操作,由於Ansible管理遠程服務器基於SSH,在登錄遠程服務器執行命令時需要遠程服務器的用戶名和密碼,也可以加入-k參數手動輸入密碼或者基於ssh-keygen生成免秘鑰。

Ansible自動化批量管理工具主要參數如下:

-v,–verbose       打印詳細模式;

-i PATH,–inventory=PATH    指定host文件路徑;

-f NUM,–forks=NUM    指定fork開啟同步進程的個數,默認5;

-m NAME,–module-name=NAME    指定module名稱,默認模塊command;

-a MODULE_ARGS               module模塊的參數或者命令;

-k,–ask-pass                     輸入遠程被管理端密碼;

–sudo                            基於sudo用戶執行;

-K,–ask-sudo-pass                提示輸入sudo密碼與sudo一起使用;

-u USERNAME,–user=USERNAME   指定移動端的執行用戶;

-C,–check                        測試執行過程,不改變真實內容,相當於預演;

-T TIMEOUT, 執行命令超時時間,默認為10;

--version 查看Ansible軟件版本信息。

1.5  Ansible ping模塊實戰

Ansible最基礎的模塊為ping模塊,主要用於判斷遠程客戶端是否在線,用於ping本身服務器,返回值為changedping

Ansible ping模塊企業常用案例如下:

(1) Ansible ping服務器狀態,如圖21-6所示:

ansible -k all  -m ping

 

21-6 Ansible ping服務器狀態

1.6  Ansible command模塊實戰

Ansible command模塊為ansible默認模塊,主要用於執行Linux基礎命令,可以執行遠程服務器命令執行、任務執行等操作。Command模塊使用詳解:

Chdir 執行命令前,切換到目錄;

Creates 當該文件存在時,則不執行該步驟;

Executable 換用shell環境執行命令;

Free_form 需要執行的腳本;

Removes 當該文件不存在時,則不執行該步驟;

Warn 如果在ansible.cfg中存在告警,如果設定了False,不會警告此行。

Ansible command模塊企業常用案例如下:

(1) Ansible command模塊遠程執行date命令,執行結果如圖21-7所示:

ansible -k -i /etc/ansible/hosts  all  -m command -a  "date"

 

21-7 Ansible command date命令執行結果

(2) Ansible command模塊遠程執行ping命令,執行結果如圖21-8所示:

ansible  -k  all  -m command -a  "ping  -c  1  www.baidu.com"

 

21-8 Ansible command ping命令執行結果

(3) Ansible Hosts正則模式遠程執行df -h,執行結果如圖21-9所示:

ansible -k  192.168.149.13*  -m  command  -a  "df -h"

 

21-9 Ansible command df -h命令執行結果

1.7  Ansible copy模塊實戰

Ansible copy模塊主要用於文件或者目錄拷貝,支持文件、目錄、權限、用戶組功能,copy模塊使用詳解:

src     Ansible端源文件或者目錄,空文件夾不拷貝;

content   用來替代src,用於將指定文件的內容,拷貝到遠程文件內;

dest     客戶端目標目錄或者文件,需要絕對路徑;

backup 拷貝之前,先備份遠程節點上的原始文件;

directory_mode 用於拷貝文件夾,新建的文件會被拷貝,而老舊的不會被拷貝;

follow 支持link文件拷貝;

force 覆蓋遠程主機不一致的內容;

group   設定遠程主機文件夾的組名;

mode   指定遠程主機文件及文件及的權限;

owner   設定遠程主機文件夾的用戶名。

Ansible copy模塊企業常用案例如下:

(1) Ansible copy模塊操作,src表示源文件,dest表示目標目錄或者文件,owner指定擁有者,執行結果如圖21-10所示:

ansible -k all -m copy  -a  'src=/etc/passwd  dest=/tmp/  mode=755  owner=root'

 

21-10 Ansible copy拷貝文件

(2) Ansible copy模塊操作,content文件內容,dest目標文件,owner指定擁有者,執行結果如圖21-11所示:

ansible -k all -m copy  -a  'content="Hello World"  dest=/tmp/jfedu.txt  mode=755  owner=root'

 

21-11 Ansible copy追加內容

(3) Ansible copy模塊操作,content文件內容,dest目標文件,owner指定擁有者,backup=yes開啟備份,執行結果如圖21-12所示:

ansible -k all -m copy  -a  'content="Hello World"  dest=/tmp/jfedu.txt  backup=yes mode=755  owner=root'

 

21-12 Ansible copy客戶端備份結果

1.8  Ansible yum模塊實戰

Ansible yum模塊主要用於軟件的安裝、升級、卸載,支持紅帽.rpm軟件的管理,YUM模塊使用詳解:

conf_file     設定遠程yum執行時所依賴的yum配置文件

disable_gpg_check     安裝軟件包之前是否堅持gpg  key;

name 需要安裝的軟件名稱,支持軟件組安裝;

update_cache     安裝軟件前更新緩存;

enablerepo 指定repo源名稱;

skip_broken           跳過異常軟件節點;

state     軟件包狀態,包括:installedpresentlatestabsentremoved

Ansible yum模塊企業常用案例如下:

(1) Ansible yum模塊操作,name表示需安裝的軟件名稱,state表示狀態,常見state= installed表示安裝軟件,執行結果如圖21-13所示:

ansible  all  -k  -m  yum  -a  "name=sysstat,screen  state=installed"

 

21-13 Ansible YUM安裝軟件包

(2) Ansible yum模塊操作,name表示需安裝的軟件名稱,state表示狀態,常見state= installed表示安裝軟件,執行結果如圖21-14所示:

ansible  all  -k  -m  yum  -a  "name=sysstat,screen  state=absent"

 

21-14 Ansible YUM卸載軟件包

(3) Ansible yum模塊操作,name表示需安裝的軟件名稱,state表示狀態,常見state= installed,表示安裝軟件,disable_gpg_check=no不檢查key,執行結果如圖21-15所示:

ansible  192.168.149.129  -k  -m  yum  -a  "name=sysstat,screen  state=installed disable_gpg_check=no"

 

21-15 Ansible YUM安裝軟件包,不檢查KEY

1.9  Ansible file模塊實戰

Ansible file模塊主要用於對文件的創建、刪除、修改、權限、屬性的維護和管理,File模塊使用詳解:

src Ansible端源文件或者目錄;

follow 支持link文件拷貝;

force 覆蓋遠程主機不一致的內容;

group 設定遠程主機文件夾的組名;

mode 指定遠程主機文件及文件及的權限;

owner 設定遠程主機文件夾的用戶名;

path     目標路徑,也可以用dest,name代替;

state     狀態包括:filelinkdirectoryhardtouchabsent;

attributes     文件或者目錄特殊屬性。

Ansible file模塊企業常用案例如下:

(1) Ansible file模塊操作,path表示目錄的名稱和路徑, state=directory表示創建目錄,執行結果如圖21-16所示:

ansible  -k  192.168.* -m  file  -a  "path=/tmp/`date +%F`  state=directory  mode=755"

 

21-16 Ansible file創建目錄

(2) Ansible file模塊操作,path表示目錄的名稱和路徑, state=touch表示創建文件,執行結果如圖21-17所示:

ansible  -k  192.168.*  -m  file  -a  "path=/tmp/jfedu.txt  state=touch  mode=755"

 

21-17 Ansible file創建文件

1.10  Ansible user模塊實戰

Ansible user模塊主要用於操作系統用戶、組、權限、密碼等操作,user模塊使用詳解:

system               默認創建為普通用戶,為yes則創建系統用戶;

append 添加一個新的組;

comment 新增描述信息;

createhome 給用戶創建家目錄;

force 用於刪除強制刪除用戶;

group 創建用戶主組;

groups 將用戶加入組或者附屬組添加;

home 指定用戶的家目錄;

name 表示狀態,是否createremovemodify;

password     指定用戶的密碼,此處為加密密碼;

remove 刪除用戶;

shell     設置用戶的shell登錄環境;

uid 設置用戶id;

update_password     修改用戶密碼;

state                用戶狀態,默認為present表示新建用戶。

Ansible user模塊企業常用案例如下:

(1) Ansible user模塊操作,name表示用戶名稱,home表示其家目錄,執行結果如圖21-18所示:

ansible  -k  192.168.149.*   -m   user   -a   "name=jfedu   home=/tmp/"

 

21-18 Ansible user創建新用戶

(2) Ansible user模塊操作,name表示用戶名稱,home表示其家目錄,執行結果如圖21-19所示:

ansible  -k  192.168.149.*   -m   user   -a   "name=jfedu   home=/tmp/ shell=/sbin/nologin"

 

21-19 Ansible user指定Shell環境

(3) Ansible user模塊操作,name表示用戶名稱,state=absent表示刪除用戶,執行結果如圖21-20所示:

ansible  -k  192.168.149.*   -m   user   -a   "name=jfedu   state=absent  force=yes"

 

21-20 Ansible user刪除用戶

1.11  Ansible cron模塊實戰

Ansible cron模塊主要用於添加、刪除、更新操作系統Crontab任務計划,Cron模塊使用詳解:

name       任務計划名稱;

cron_file 替換客戶端該用戶的任務計划的文件;

minute     分( 0-59 * */2 ;

hour       時( 0-23 * */2 ;

day        日( 1-31 * */2 ;

month      月( 1-12 * */2 ;

weekday    周( 0-6 1-7 * ;

job        任何計划執行的命令,state要等於present;

backup     是否備份之前的任務計划;

user       新建任務計划的用戶;

state      指定任務計划presentabsent

Ansible cron模塊企業常用案例如下:

(1) Ansible cron模塊操作,基於cron模塊,創建crontab任務計划,執行結果如圖21-21所示:

ansible  -k  all  -m  cron  -a  "minute=0  hour=0  day=*  month=*  weekday=* name='Ntpdate server for sync time'   job='/usr/sbin/ntpdate 139.224.227.121'"

 

21-21 Ansible cron添加任務計划

(2) Ansible cron模塊操作,基於cron模塊,備份crontab任務計划,backup=yes表示開啟備份,備份文件存放於客戶端/tmp/,執行結果如圖21-22所示:

ansible  -k  all  -m  cron  -a  "minute=0  hour=0  day=*  month=*  weekday=* name='Ntpdate server for sync time'  backup=yes job='/usr/sbin/ntpdate  pool.ntp.org'"

  

21-22 Ansible cron刪除任務計划

(3) Ansible cron模塊操作,基於cron模塊,刪除crontab任務計划,執行結果如圖21-23所示:

ansible  -k  all  -m  cron  -a  "name='Ntpdate server for sync time'  state=absent"

 

21-23 Ansible cron刪除任務計划

1.12  Ansible synchronize模塊實戰

Ansible synchronize模塊主要用於目錄、文件同步,基於Rsync命令同步目錄,Synchronize模塊使用詳解:

compress             開啟壓縮,默認為開啟;

archive          是否采用歸檔模式同步,保證源和目標文件屬性一致;

checksum             是否效驗;

dirs             以非遞歸的方式傳輸目錄;

links            同步鏈接文件;

recursive        是否遞歸yes/no;

rsync_opts       使用rsync 的參數;

copy_links       同步的時候是否復制連接;

delete           刪除源中沒有而目標存在的文件;

src                          源目錄及文件;

dest          目標目錄及文件;

dest_port        目標接受的端口;

rsync_path       服務的路徑,指定 rsync 命令來在遠程服務器上運行;

rsync_timeout    指定rsync操作的IP超時時間;

set_remote_user     設置遠程用戶名;

--exclude=.log   忽略同步.log結尾的文件;

mode             同步的模式,rsync同步的方式PUSHPULL,默認都是推送push

Ansible synchronize模塊企業常用案例如下:

(1) Ansible synchronize模塊操作,src源目錄、dest目標目錄,執行結果如圖21-24所示:

ansible  -k  all  -m synchronize  -a 'src=/tmp/ dest=/tmp/'

 

21-24 Ansible 目錄同步

(2) Ansible synchronize模塊操作,src源目錄、dest目標目錄、compress=yes開啟壓縮、delete=yes數據一致、rsync_opts同步參數、--exclude排除文件,執行結果如圖21-25所示:

ansible  -k  all  -m synchronize  -a 'src=/tmp/ dest=/tmp/ compress=yes delete=yes rsync_opts=--no-motd,--exclude=.txt'

 

21-25 Ansible 目錄同步排除.txt文件

1.13  Ansible shell模塊實戰

Ansible shell模塊主要用於遠程客戶端上執行各種Shell命令或者運行腳本,遠程執行命令通過/bin/sh環境來執行,支持比command更多的指令,Shell模塊使用詳解:

Chdir 執行命令前,切換到目錄;

Creates 當該文件存在時,則不執行該步驟;

Executable 換用shell環境執行命令;

Free_form 需要執行的腳本;

Removes 當該文件不存在時,則不執行該步驟;

Warn 如果在ansible.cfg中存在告警,如果設定了False,不會警告此行。

Ansible shell模塊企業常用案例如下:

(1) Ansible shell模塊操作,-m shell指定模塊為shell,遠程執行Shell腳本,遠程執行腳本也可采用script模塊。並把執行結果追加至客戶端服務器/tmp/var.log文件,執行結果如圖21-26所示:

ansible -k all -m shell -a "/bin/sh /tmp/variables.sh >>/tmp/var.log"

 

21-26 Ansible shell遠程執行腳本

(2) Ansible shell模塊操作,遠程執行創建目錄命令,執行之前切換在/tmp目錄,屏蔽警告信息,執行結果如圖21-27所示:

ansible -k all -m shell -a "mkdir -p `date +%F` chdir=/tmp/ state=directory warn=no"

  

21-27 Ansible shell遠程執行腳本

(3) Ansible shell模塊操作,-m shell指定模塊為shell,遠程客戶端查看http進程是否啟動,執行結果如圖21-28所示:

ansible -k  all  -m  shell  -a  "ps -ef |grep http"

 

21-28 Ansible shell遠程查看進程

(4) Ansible shell模塊操作,-m shell指定模塊為shell,遠程客戶端查看crontab任務計划,執行結果如圖21-29所示:

ansible    -k   all  -m  shell  -a  "crontab -l"

 

21-29 Ansible shell遠程查看任務計划

1.14  Ansible service模塊實戰

Ansible service模塊主要用於遠程客戶端各種服務管理,包括啟動、停止、重啟、重新加載等,service模塊使用詳解:

enabled 是否開啟啟動服務;

name 服務名稱;

runlevel     服務啟動級別;

arguments 服務命令行參數傳遞;

state     服務操作狀態,狀態包括started, stopped, restarted, reloaded

Ansible service模塊企業常用案例如下:

(1) Ansible service模塊操作,遠程重啟httpd服務,執行結果如圖21-30所示:

ansible -k all  -m  service  -a  "name=httpd  state=restarted"

 

21-30 Ansible service重啟httpd服務

(2) Ansible service模塊操作,遠程重啟網卡服務,指定參數eth0,執行結果如圖21-31所示:

ansible  -k   all  -m  service  -a  "name=network   args=eth0  state=restarted"

 

21-31 Ansible service重啟network服務

(3) Ansible service模塊操作,遠程開機啟動nfs服務,設置3,5級別自動啟動,執行結果如圖21-32所示:

ansible -k all  -m  service  -a  "name=nfs  enabled=yes  runlevel=3,5"

 

21-32 Ansible service開機啟動nfs服務

1.15  Ansible Playbook應用

如上使用Ad-hoc方式點對點命令執行,可以管理遠程主機,如果服務器數量很多,配置信息比較多,還可以利用Ansible Playbook編寫劇本、從而以非常簡便的方式實現任務處理的自動化與流程化。

Playbook由一個或多個"play"組成的列表,play的主要功能Ansible中的Task定義好的角色,指定劇本對應的服務器組。

從根本上說,Task是一個任務,Task調用Ansible各種模塊module,將多個paly組織在一個playbook劇本中,然后組成一個非常完整的流程控制集合。

基於Ansible Playbook還可以收集命令、可以創建任務集,這樣能夠大大降低管理工作的復雜程度,Playbook采用YAML語法結構,易於閱讀、方便配置。

YAMLYet Another Markup Language),是一種直觀的能夠被電腦識別的數據序列化格式,是一個可讀性高並且容易被人類閱讀,容易和腳本語言交互,用來表達資料序列的編程語言。它參考了其它多種語言,包括:XMLC語言、PythonPerl以及電子郵件格式RFC2822,是類似於標准通用標記語言的子集XML的數據描述語言,語法比XML簡單很多。

YAML使用空白字符和分行來分隔資料,適合用 grepPythonPerlRuby 操作。

(1) YAML語言特性如下:

可讀性強;

和腳本語言的交互性好;

使用實現語言的數據類型;

一致的信息模型;

易於實現;

可以基於流來處理;

可擴展性強。

(2) Playbooks組件包括如下:

Target 定義playbook的遠程主機組;

Variable     定義playbook使用的變量;

Task   定義遠程主機上執行的任務列表;

Handler     定義task執行完成以后需要調用的任務,例如配置文件被改動,則啟動handler任務重啟相關聯的服務。

(3) Target常用參數如下:

hosts                        定義遠程主機組;

user                    執行該任務的用戶;

sudo       設置為yes的時候,執行任務的時候使用root權限;

sudo_user 指定sudo普通用戶;

connection 默認基於SSH連接客戶端;

gather_facks     獲取遠程主機facts基礎信息。

(4) Variable常用參數如下:

vars   定義格式,變量名:變量值;

vars_files       指定變量文件;

vars_prompt   用戶交互模式自定義變量;

setup 模塊去遠程主機的值;

(5) Task常用參數如下:

name 任務顯示名稱也即屏幕顯示信息;

action 定義執行的動作;

copy 復制本地文件到遠程主機;

template     復制本地文件到遠程主機,可以引用本地變量;

service       定義服務的狀態。

Ansible playbook案例演示如下:

(1) 遠程主機安裝Nginx WEB服務,playbook代碼如下,執行結果如圖21-33所示:

- hosts: all

  remote_user: root

  tasks:

  - name: Jfedu Pcre-devel and Zlib LIB Install.

    yum:  name=pcre-devel,pcre,zlib-devel state=installed

  - name: Jfedu  Nginx WEB  Server Install Process.

    shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0.tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

 

21-33 Ansible Playbook遠程Nginx安裝

(2) 檢測遠程主機Nginx目錄是否存在,不存在則安裝Nginx WEB服務,安裝完並啟動Nginxplaybook代碼如下,執行結果如圖21-34所示:

- hosts: all

  remote_user: root

  tasks:

      - name: Nginx server Install 2017

        file: path=/usr/local/nginx/ state=directory

        notify:

            - nginx install

            - nginx start

  handlers:

      - name: nginx install

        shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0

.tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

      - name: nginx start

        shell: /usr/local/nginx/sbin/nginx

 

21-34 Ansible Playbook Nginx觸發安裝

(3) 檢測遠程主機內核參數配置文件是否更新,如果更新則執行命令sysctl –p使內核參數生效,playbook代碼如下,執行結果如圖21-35所示:

- hosts: all

  remote_user: root

  tasks:

      - name: Linux kernel config 2017

        copy: src=/data/sh/sysctl.conf dest=/etc/

        notify:

            - source sysctl

  handlers:

      - name: source sysctl

        shell: sysctl -p

 

21-35 Ansible Playbook 內核參數優化

(4) 基於列表items多個值創建用戶,通過{{}}定義列表變量,with_items選項傳入變量的值,執行結果如圖21-36a)、21-36b)所示:

- hosts: all

  remote_user: root

  tasks:

  - name: Linux system Add User list.

    user: name={{ item }} state=present

    with_items:

       - jfedu1

       - jfedu2

       - jfedu3

       - jfedu4

 

 

 

21-36aAnsible Playbook item變量創建用戶

 

 

 

21-36bAnsible Playbook item變量創建用戶

(5) Ansible Playbook可以自定義template模板文件,模板文件主要用於服務器需求不一致的情況,需要獨立定義的,例如兩台服務器安裝了Nginx,安裝完畢之后將服務器AHTTP端口改成81,服務器BHTTP端口改成82,基於tempalte模塊輕松實現,方法步驟如下:

  1. Ansible hosts文件指定不同服務器不同httpd_port端口,代碼如下:

[web]

192.168.149.128 httpd_port=81

192.168.149.129 httpd_port=82

  1. Ansible 創建nginx.conf.j2模板文件,cp nginx.conf nginx.conf.j2,並修改listen 80listen {{httpd_port}}Nginx其他配置項不變,代碼如下:

cp nginx.conf nginx.conf.j2

listen  {{httpd_port}};

  1. Ansible playbook劇本yaml文件創建,代碼如下:

- hosts: all

  remote_user: root

  tasks:

      - name: Nginx server Install 2017

        file: path=/usr/local/nginx/ state=directory

        notify:

            - nginx install

            - nginx config

  handlers:

      - name: nginx install

        shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0

.tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

      - name: nginx config

        template: src=/data/sh/nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf

  1. Ansible playbook執行劇本文件,如圖21-37a)、21-37b)、21-37c)所示:

 

 

 

21-37aAnsible Playbook 執行模板yaml

 

 

 

21-37b149.128服務器Nginx HTTP Port 80

 

 

 

21-37c149.129服務器Nginx HTTP Port 81

1.16  Ansible配置文件詳解

Ansible默認配置文件為/etc/ansible/ansible.cfg,配置文件中可以對ansible進行各項參數的調整,包括並發線程、用戶、模塊路徑、配置優化等,如下為Ansible.cfg常用參數詳解:

[defaults]    通用默認配置段;

inventory      = /etc/ansible/hosts          被控端IP或者DNS列表;

library        = /usr/share/my_modules/     Ansible默認搜尋模塊的位置;

remote_tmp     = $HOME/.ansible/tmp       Ansible遠程執行臨時文件;

forks          = 5     並行進程數;

sudo_user      = root    sudo遠程執行用戶名;

ask_sudo_pass = True    使用sudo,是否需要輸入密碼;

ask_pass      = True     是否需要輸入密碼;

remote_port    = 22     遠程SSH端口;

module_lang    = C    模塊和系統之間通信的語言;

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 = command     Ansible命令執行默認的模塊;

#executable = /bin/sh          執行的Shell環境,用戶Shell模塊;

#system_warnings = True     禁用系統運行ansible潛在問題警告;

#command_warnings = False         command模塊Ansible默認發出警告;

#nocolor = 1   輸出帶上顏色區別,開啟/關閉:0/1

pipelining = False 開啟pipe SSH通道優化;

1.17  Ansible性能調優

Ansible企業實戰環境中,如果管理的服務器越來越多,Ansibe執行效率會變得比較慢,可以通過優化Ansible提供工作效率,由於Ansible基於SSH協議通信,SSH連接慢會導致整個基於Ansible執行變得緩慢,也需要對Openssh進行優化,具體優化的方法如下:

(1) Ansible SSH 關閉秘鑰檢測

默認以SSH登錄遠程客戶端服務器,會檢查遠程主機的公鑰(public key),並將該主機的公鑰記錄在~/.ssh/known_hosts文件中。下次訪問相同主機時,OpenSSH會核對公鑰,如果公鑰不同,OpenSSH會發出警告,如果公鑰相同,則提示輸入密碼。

SSH對主機的public_key的檢查等級是根據StrictHostKeyChecking變量來設定的,StrictHostKeyChecking檢查級別包括:no(不檢查)、ask(詢問)、yes(每次都檢查)、False(關閉檢查)。

Ansible配置文件中加入如下代碼,即可關閉StrictHostKeyChecking檢查:

host_key_checking = False

(2) OpenSSH連接優化

使用OpenSSH服務時,默認服務器端配置文件UseDNS=YES狀態,該選項會導致服務器根據客戶端的IP地址進行DNS PTR反向解析,得到客戶端的主機名,然后根據獲取到的主機名進行DNS正向A記錄查詢,並驗證該IP是否與原始IP一致。關閉DNS解析代碼如下:

sed  -i  '/^GSSAPI/s/yes/no/g;/UseDNS/d;/Protocol/aUseDNS no' /etc/ssh/sshd_config

/etc/init.d/sshd restart

(3) SSH pipelining加速Ansible

SSH pipelining是一個加速 Ansible 執行速度的簡單方法,SSH pipelining 默認是關閉的,關閉是為了兼容不同的 sudo 配置,主要是requiretty 選項。

如果不使用Sudo建議開啟該選項,打開此選項可以減少Ansible 執行沒有文件傳輸時,SSH在被控機器上執行任務的連接數。使用Sudo操作的時候, 必須在所有被管理的主機上將配置文件/etc/sudoersrequiretty選項禁用。

sed    -i    '/^pipelining/s/False/True/g'    /etc/ansible/ansible.cfg

(4) Ansible Facts緩存優化

Ansible-playbook 在執行過程中,默認會執行Gather facts,如果不需要獲取客戶端的fact數據的話,可以關閉獲取fact數據功能,關閉之后可以加快ansible-playbook的執行效率。如需關閉fact功能,在playbook yaml文件中加入如下代碼即可:

gather_facts: no

Ansible facts組件主要用於收集客戶端設備的基礎靜態信息,這些信息可以在做配置管理的時候方便引用。Facts信息直接當做Ansible Playbook變量信息進行引用,通過定制facts以便收集我們想要的信息,同時可以通過FacterOhai來拓展facts信息,也可以將facts信息存入Redis緩存中,如下為Facts使用Redis緩存的步驟。

  1. 部署Redis服務

wget   http://download.redis.io/releases/redis-2.8.13.tar.gz

tar     zxf redis-2.8.13.tar.gz

cd redis-2.8.13

make   PREFIX=/usr/local/redis  install

cp      redis.conf     /usr/local/redis/

/usr/local/redis/bin/目錄加入至環境變量配置文件/etc/profile末尾,然后Shell終端執行source /etc/profile讓環境變量生效。

export PATH=/usr/local/redis/bin:$PATH

啟動及停止Redis服務命令:

nohup /usr/local/redis/bin/redis-server  /usr/local/redis/redis.conf  &

  1. 安裝Python Redis模塊

easy_install pip

pip install redis

  1. Ansible整合Redis配置

在配置文件/etc/ansible/ansible.cfgdefaluts段中加入代碼,如果redis密碼為admin,則開啟admin密碼行:

gathering = smart

fact_caching = redis

fact_caching_timeout = 86400

fact_caching_connection = localhost:6379

#fact_caching_connection = localhost:6379:0:admin

  1. 測試Redis緩存

Ansible-playbook執行nginx_wget.yaml劇本文件,如圖21-38所示:

ansible-playbook    nginx_wget.yaml

 

 

 

21-38 ansible playbook執行yaml

檢查Redis服務器,facts key已存入Redis中,如圖21-39所示:

 

 

 

21-39 Redis緩存服務器緩存facts主機信息

(5) ControlPersist SSH優化

ControlPersist 特性需要高版本的SSH支持,CentOS6默認是不支持的,如果需要使用,需要自行升級Openssh

ControlPersist 即持久化的Socket,一次驗證多次通信。並且只需要修改SSH客戶端配置,也即Ansible被管理主機。

可使用YUM或者源碼編譯升級OpenSSH服務,升級完畢ControlPersist的設置辦法如下,在其用戶的家目錄創建config文件,如果ansibleroot用戶登錄客戶端,至需要在客戶端的/root/.ssh/config文件中添加如下代碼即可:

Host *

  Compression yes

  ServerAliveInterval 60

  ServerAliveCountMax 5

  ControlMaster auto

  ControlPath ~/.ssh/sockets/%r@%h-%p

  ControlPersist 4h

開啟ControlPersist 特性后,SSH 在建立sockets后,節省了每次驗證和創建的時間,對Ansible執行速度提升是非常明顯的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM