背景
公司計划在年底做一次大型市場促銷活動,全面沖刺下交易額,為明年的上市做准備。公司要求各業務組對年底大促做准備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試,運維老大為了在年底有所表現,要求運維部門同學盡快實現,當你接到這個任務時,有沒有更快的解決方式?
技術說明
隨着信息時代的持續發展,IT運維已經成為IT服務內涵中重要的組成部分。面對越來越復雜的業務,面對越來越多樣化的用戶需求,不斷擴展的IT應用需要越來越合理的模式來保障IT服務能靈活便捷、安全穩定地持續保障,這種模式中的保障因素就是IT運維(其他因素是更加優越的IT架構等)。從初期的幾台服務器發展到龐大的數據中心,單靠人工已經無法滿足在技術、業務、管理等方面的要求,那么標准化、自動化、架構優化、過程優化等降低IT服務成本的因素越來越被人們所重視。其中,自動化最開始作為代替人工操作為出發點的訴求被廣泛研究和應用。IT運維從誕生發展至今,自動化作為其重要屬性之一已經不僅僅只是代替人工操作,更重要的是深層探知和全局分析,關注的是在當前條件下如何實現性能與服務最優化,同時保障投資收益最大化。自動化對IT運維的影響,已經不僅僅是人與設備之間的關系,已經發展到了面向客戶服務驅動IT運維決策的層面,IT運維團隊的構成,也從各級技術人員占大多數發展到業務人員甚至用戶占大多數的局面。
因此,IT運維自動化是一組將靜態的設備結構轉化為根據IT服務需求動態彈性響應的策略,目的就是實現IT運維的質量,降低成本。可以說自動化運維一定是IT運維高層面的重要屬性之一。
項目上線過程
場景說明
目前多數公司遇到的運維問題現狀:
理想狀態下的運維部門:
日常運維工作中的重要事件:
技術說明
所謂的運維自動化實際上就是某些運維過程的自動化,比如初始化自動化、測試/部署自動化,加監控自動化,簡單報警處理自動化,業務降級/恢復自動化....集腋成裘,慢慢的讓系統可以承擔更多的重復勞動,減少人力投入和學習成本。
自動化運維常用工具
工具 |
用途 |
|
安裝系統 |
pxe/cobber |
安裝系統 |
虛擬化系統 |
kvm/xen/vmware |
虛擬機 |
應用部署 |
puppet/ansible/saltstack |
中大型規模 |
命令執行 |
ansible/fabric/func |
中小型規模 |
ansible聚集以上部署和命令執行於一身,能夠完整輕易的實現應用部署和批量命令功能,適用於主機數量中型規模,再大的用puppet。
作為運維工程師,對於命令執行的工具要掌握ansible,fabric,func或者shell其中的一種
ansible是什么
ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
ansible是基於 paramiko 開發的,並且基於模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不需要在遠程主機上安裝client/agents,因為它們是基於ssh來和遠程主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。
ansible特點
1、部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
7、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
8、提供一個功能強大、操作性強的Web管理界面和REST API接口——AWX平台。
ansible架構圖
Ansible:Ansible核心程序。
HostInventory:記錄由Ansible管理的主機信息,包括端口、密碼、ip等。
Playbooks:"劇本"YAML格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能。
CoreModules:核心模塊,主要操作是通過調用核心模塊來完成管理任務。
CustomModules:自定義模塊,完成核心模塊無法完成的功能,支持多種語言。
ConnectionPlugins:連接插件,Ansible和Host通信使用
ansible任務執行
ansible任務執行模式
Ansible系統由控制主機對被管節點的操作方式可分為兩類,即adhoc和playbook:
ad-hoc模式使用單個模塊,支持批量執行單條命令。 ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。就相當於bash中的一句話shell。
playbook模式是Ansible主要管理方式,也是Ansible功能強大的關鍵所在。playbook通過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。可以簡單地把playbook理解為通過組合多條ad-hoc操作作的配置文件。
ansible執行流程
簡單理解就是Ansible在運行時,首先讀取ansible.cfg中的配置,根據規則獲取Inventory中的管理主機列表,並行的在這些主機中執行配置的任務,最后等待執行返回的結果。
Ansible命令執行過程
1、加載自己的配置文件 默認/etc/ansible/ansible.cfg
4、通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的
5、對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件
ansible安裝方式
1使用yum安裝
2 使用pip(python的包管理模塊)安裝
ansible程序結構
安裝目錄
Lib庫依賴目錄:/usr/lib/pythonX.X/site-packages/ansible/
Help文檔目錄:/usr/share/doc/ansible-X.X.X/
ansible配置文件的查找順序
(1).檢查環境變量ANSIBLE_CONFIG指向的路徑文件(export ANSIBLE_CONFIG=/etc/ansible.cfg)
(2).~/.ansible.cfg,檢查當前目錄下的ansible.cfg配置文件
(3)./etc/ansible.cfg 檢查etc目錄的配置文件
Ansible配置文件
設置ansible.cfg配置參數,ansible有許多參數,下面列出常用的參數:
inventory: #這個參數表示資源清單inventory文件的位置,資源清單就是一些Ansible需要連接管理的主 機列表。這個參數的配置實例如下:
inventory = /etc/ansible/hosts
library:Ansible的操作動作,無論是本地或遠程,都使用一小段代碼來執行,這小段代碼稱為模塊,這個library參數就是指向存放Ansible模塊的目錄。配置實例如下:
Ansible支持多個目錄方式,只要用冒號(:)隔開就可以,同時也會檢查當前執行playbook位置下的./library目錄。
forks: 設置默認情況下Ansible最多能有多少個進程同時工作, 從Ansible 1.3開始,fork數量默認自動設置為主機數量或者潛在的主機數量,默認設置最多5個進程並行處理。具體需要設置多少個,可以根據控制主機的性能和被管節點的數量來確定,可能是 50或100。默認值5是非常保守的值,配置實例如下:
這是設置默認執行命令的用戶,也可以在playbook中重新設置這個參數。配置實例如下:
這是指定連接被管節點的管理端口,默認是22。除非設置了特殊的SSH端口,不然這個參數一般是不需要修改的(如果需要修改,則還需修改ssh的配置文件,更改端口)。
這是設置是否檢查SSH主機的密鑰。可以設置為True或False,關閉后第一次連接沒有提示(就是第一次連接不在提示yes或者no)
log_path:Ansible系統默認是不記錄日志的,如果想把Ansible系統的輸出記錄到日志文件中,需要置log_path
log_path = /var/log/ansible.log
另外需要注意,執行Ansible的用戶需要有寫入日志的權限,模塊將會調用被管節點的syslog來記錄
Ansible主機清單
1、直接指明主機地址或主機名:
2、定義一個主機組[組名]把地址或主機名加進去
#組成員可以使用通配符來匹配,如下 192.168.2.[1:6] #表示匹配從192.168.2.1——192.168.2.6的主機
Ansible常用命令
Ansible命令集
/usr/bin/ansible # Ansibe AD-Hoc 臨時命令執行工具,常用於臨時命令的執行
/usr/bin/ansible-doc # Ansible 模塊功能查看工具
/usr/bin/ansible-galaxy # 下載/上傳優秀代碼或Roles模塊 的官網平台,基於網絡的
/usr/bin/ansible-playbook # Ansible 定制自動化的任務集編排工具
/usr/bin/ansible-pull # Ansible遠程執行命令的工具,拉取配置而非推送配置(使用較少,海量機器時使用,對運維的架構能力要求較高)
/usr/bin/ansible-vault # Ansible 文件加密工具
/usr/bin/ansible-console # Ansible基於Linux Consoble界面可與用戶交互的命令執行工具
Ansible-doc命令
ansible-doc -s MOD_NAME 獲取指定模塊的使用幫助
ansible-doc 選項:
-M MODULE_PATH, --module-path=MODULE_PATH 指定模塊的路徑
-s, --snippet 顯示playbook制定模塊的用法
--version 顯示ansible-doc的版本號查看模塊列表
Ansible命令詳解
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-m module_name 指定模塊 執行模塊的名字,默認使用 command 模塊,所以如果是只執行單一命令可以不用 -m參數module name to execute (default=command)
-k, --ask-pass登錄密碼,提示輸入SSH密碼而不是假設基於密鑰的驗證
-K, --ask-sudo-pass ask for sudo password 提示密碼使用sudo,sudo表示提權操作
--ask-vault-pass ask for vault password
-B SECONDS, --background=SECONDS 后台運行超時時間
-C, --check don't make any changes; instead, try to predict some of the changes that may occur
只是測試一下會改變什么內容,不會真正去執行;相反,試圖預測一些可能發生的變化
-c CONNECTION, --connection=CONNECTION 連接類型使用。
-i INVENTORY, --inventory-file=INVENTORY 指定庫存主機文件的路徑,默認為/etc/ansible/hosts
-M MODULE_PATH, --module-path=MODULE_PATH 要執行的模塊的路徑,默認為/usr/share/ansible/
specify path(s) to module library (default=/usr/share/ansible/)
-o, --one-line condense output 壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。
-P POLL_INTERVAL, --poll=POLL_INTERVAL 調查背景工作每隔數秒。需要- b
set the poll interval if using -B (default=15)
-S, --su run operations with su 用 su 命令
-R SU_USER, --su-user=SU_USER 指定SU的用戶,默認是root用戶
run operations with su as this user (default=root)
-s, --sudo run operations with sudo (nopasswd)(使用sudo需要配置sudo的配置文件)
-U SUDO_USER, --sudo-user=SUDO_USER sudo到哪個用戶,默認為 root
desired sudo user (default=root)
-T TIMEOUT, --timeout=TIMEOUT 指定SSH默認超時時間, 默認是10S
-t TREE, --tree=TREE log output to this directory 將日志內容保存在該輸出目錄,結果保存在一個文件中在每台主機上。
-u REMOTE_USER, --user=REMOTE_USER 遠程用戶, 默認是root用戶 connect as this user (default=root)
--vault-password-file=VAULT_PASSWORD_FILE vault password file
-v, --verbose verbose mode (-vvv for more, -vvvv to enable 詳細信息
--version show program's version number and exit 輸出ansible的版本
ansible all --lists-hosts 列出所有主機組里面主機
ansible web --lists-hosts 列出指定主機組里面的主機
Ansible配置公私鑰
配置ansible使用公鑰驗證
雖然ansible支持其他主機認證方式,但是我們最常用的的還是基於秘鑰的認證
1、首先生成秘鑰
2、然后向主機分發秘鑰:
ssh-copy-id root@ #@后面跟主機名或者IP地址
例如:ssh-copy-id root@192.168.10.190
3.然后測試,使用ssh連接,不用密碼就可登陸
4、如果出現以下情況:
# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.6.72
-bash: ssh-copy-id: command not found請嘗試:
yum -y install openssh-clientsansible
Ansible常用模塊
我在/etc/ansible/hosts中配置了主機組,如圖:
1、主機連通性測試:
2、command:在遠程主機執行命令;不支持|管道命令
ansible all|web -m command -a 'ifconfig'
命令模塊接受命令名稱,后面是空格分隔的列表參數。給定的命令將在所有選定的節點上執行。它不會通過shell進行處理,比如$HOME和操作如"小於"<",">", "|", ";","&"' 工作(需要使用(shell)模塊實現這些功能)。
ansible web -a "chdir=/app ls"
creates # 一個文件名,當這個文件存在,則該命令不執行,可以用來做判斷
ansible web -a "creates=/app/111 chdir=/app ls" 因為192.168.10.187主機上存在/app/111所以跳過,不列出
executable # 切換shell來執行命令,需要使用命令的絕對路徑
free_form # 要執行的Linux指令,一般使用Ansible的-a參數代替。
removes # 一個文件名,這個文件不存在,則該命令不執行,與creates相反的判斷
因為192.168.10.190主機上沒有/app/111,所以跳過,不列出
3、shell模塊在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等
例如:ansible web -m shell -a 'cat /etc/passwd|grep root'
4、copy:復制文件到遠程主機,可以改權限等用法:
(1) 復制文件
例如:ansible web -m copy -a "src=/app/111 dest=/app/test.sh"
(2) 給定內容生成文件
例如:ansible web -m copy -a "content='hello word' dest=/app/test.ansible mode=666"源是給定的內容hello word,目標是/app/test.ansible,拷貝過去的文件權限為666
backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no backup=yes備份
content:用於替代"src",可以直接設定指定文件的值
dest:必選項。要將源文件復制到的遠程主機的絕對路徑,如果源文件是一個目錄,那么該路徑也必須是個目錄
directory_mode:遞歸設定目錄的權限,默認為系統默認權限
force:如果目標主機包含該文件,但內容不同,如果設置為yes,則強制覆蓋,如果為no,則只有當目標主機的目標位置不存在該文件時,才復制。默認為yes
src:被復制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸復制。在這種情況下,如果路徑使用"/"來結尾,則只復制目錄里的內容,如果沒有使用"/"來結尾,則包含目錄在內的整個內容全部復制,類似於rsync。
5、file 設置文件屬性:
創建目錄:-a "path= state=directory"
創建鏈接文件:-a "path= src= state=link"
force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之后會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然后創建新的軟鏈,有兩個選項:yes|no
group:定義文件/目錄的屬組 mode:定義文件/目錄的權限
owner:定義文件/目錄的屬主 path:必選項,定義文件/目錄的路徑
recurse:遞歸設置文件的屬性,只對目錄有效 src:被鏈接的源文件路徑,只應用於state=link的情況
dest:被鏈接到的路徑,只應用於state=link的情況
state:
touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最后修改時間
ansible web -m file -a "path=/data/webapps state=directory" 創建目錄
ansible web -m file -a "path=/data/webapps/111 state=touch"創建文件
ansible web -m file -a "path=/data/webapps/111.link src=/data/webapps/111 state=link" 創建軟鏈接
或者ansible web -m file -a "dest=/data/webapps/111.link src=/data/webapps/111 state=link"
ansible web -m file -a "path=/data/webapps state=absent"刪除目錄
6、fetch從遠程某主機獲取文件到本地:
dest:用來存放文件的目錄,例如存放目錄為backup,源文件名稱為/etc/profile在主機pythonserver中,那么保存為/backup/pythonserver/etc/profile
Src:在遠程拉取的文件,並且必須是一個file,不能是目錄
例如:ansible web -m fetch -a "src=/app/111 dest=/root/test"
已經用遠程主機IP給你建好了目錄結構,讓你知道是從哪台主機拷過來的文件,非常貼心
7、cron 管理cron計划任務:
action: cron backup= # 如果設置,創建一個crontab備份 【yes|no】
cron_file= #如果指定, 使用這個文件cron.d,而不是單個用戶
day= #日應該運行的工作( 1-31, *, */2, )
weekday # 周 ( 0-6 for Sunday-Saturday,, )
reboot # 任務在重啟時運行,不建議使用,建議使用special_time
special_time #特殊的時間范圍,參數:reboot(重啟時),annually(每年),monthly(每月),weekly
state #指定狀態,present表示添加定時任務,也是默認設置,absent表示刪除定時任務
例如:ansible web -m cron -a "name='ntp update every 5' minute=*/5 job='/sbin/ntpdate 172.17.0.1 &> /dev/null'"
再添加計划任務,但是name注釋不能和之前設置的name注釋一樣,否則將會覆蓋之前的計划任務
ansible web -m cron -a "name='ntp update every 5' minute=*/5 job='/sbin/ntpdate 172.17.0.1 &> /dev/null' state=absent"
ansible web -m cron -a "name='ntp update every 5' special_time=hourly job='/sbin/ntpdate 172.17.0.1 &> /dev/null'"
8、yum安裝軟件
conf_file #設定遠程yum安裝時所依賴的配置文件。如配置文件沒有在默認的位置。
disable_gpg_check #是否禁止GPG checking,只用於`present' or `latest'。
disablerepo #臨時禁止使用yum庫。 只用於安裝或更新時。
enablerepo #臨時使用的yum庫。只用於安裝或更新時。
state= #present安裝, latest安裝最新的, absent 卸載軟件。
例如:ansible web -m yum -a "name=vsftpd state=present disable_gpg_check=yes" 安裝包
ansible web -m yum -a "name=vsftpd state=absent"卸載包
ansible web -m copy -a "src=/root/mha4mysql-node-0.56-0.el6.noarch.rpm dest=/root"
ansible web -m yum -a "name=/root/mha4mysql-node-0.56-0.el6.noarch.rpm state=present disable_gpg_check=yes"
ansible web -m yum -a "name=mha4mysql-node state=absent"
9、service: 服務程序管理
sleep #在重啟服務的過程中,是否等待。如在服務關閉以后等待2秒再啟動。
state#started啟動服務, stopped停止服務, restarted重啟服務, reloaded重載配置啟動nginx服務並設置范圍自啟動:
ansible web -m yum -a "name=nginx state=present disable_gpg_check=yes"
ansible web -m service -a "name=nginx state=started enabled=yes"
ansible web -m service -a "name=nginx state=stopped"
10、user模塊管理
force # 在使用state=absent是, 行為與userdel –force一致.
groups # 指定附加組,如果指定為(groups=)表示刪除所有組
move_home # 如果設置為home=時, 試圖將用戶主目錄移動到指定的目錄
non_unique # 該選項允許改變非唯一的用戶ID值(可以多個 用戶共用一個ID)
remove # 在使用state=absent時, 行為是與userdel –remove一致
shell # 指定默認shell(例如:不讓用戶登錄的shell是/sbin/nologin)
state # 設置帳號狀態,不指定為創建,指定值為absent表示刪除
system # 當創建一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶(centos6是0-500是系統用戶,centos7 0-1000是系統用戶)
例如:創建一個用戶ansible web -m user -a "name=magedu01 password=magedu uid=10001 shell=/bin/sh" (注意:這里指定的密碼在/etc/shadow里面是明文的,所以密碼還需要通過openssl去加密一下)
刪除用戶ansible web -m user -a "name=magedu01 state=absent"
11、group
state # 指定組狀態,默認為創建,設置值為absent為刪除
ansible web -m group -a 'name=tom state=present'
12、script在指定節點運行服務端的腳本
ansible web -m script -a '/root/test.sh'
13、setup模塊
facts組件是Ansible用於采集被管機器設備信息的一個功能,我們可以使用setup模塊查機器的所有facts信息,可以使用filter來查看指定信息。整個facts信息被包裝在一個JSON格式的數據結構中,ansible_facts是最上層的值
facts就是變量,內建變量 。每個主機的各種信息,cpu顆數、內存大小等。會存在facts中的某個變量中。調用后返回很多對應主機的信息,在后面的操作中可以根據不同的信息來做不同的操作。如redhat系列用yum安裝,而debian系列用apt來安裝軟件。
setup模塊,主要用於獲取主機信息,在playbooks里經常會用到的一個參數gather_facts就與該模塊相關。setup模塊下經常使用的一個參數是filter參數,具體使用示例如下(由於輸出結果較多,這里只列命令不寫結果):
absible web -m setup 獲取所有的主機信息
ansible web -m setup -a 'filter=ansible_*_mb' //查看主機內存信息
ansible web -m setup -a 'filter=ansible_eth[0-2]' //查看地接口為eth0-2的網卡信息
ansible all -m setup --tree /tmp/facts //將所有主機的信息輸入到/tmp/facts目錄下,每台主機的信息輸入到主機名文件中(/etc/ansible/hosts里的主機名)
Ansible playbook簡介
playbook是ansible用於配置,部署,和管理被控節點的劇本。
通過playbook的詳細描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀態。playbook就像Ansible控制器給被控節點列出的的一系列to-do-list,而被控節點必須要完成。
也可以這么理解,playbook 字面意思,即劇本,現實中由演員按照劇本表演,在Ansible中,這次由計算機進行表演,由計算機安裝,部署應用,提供對外服務,以及組織計算機處理各種各樣的事情。
Ansible playbook使用場景
(1)執行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個設施過於復雜,需要大量的操作時候,執行的ad-hoc命令是不適合的,這時最好使用playbook。
(2)就像執行shell命令與寫shell腳本一樣,也可以理解為批處理任務,不過playbook有自己的語法格式。
(3)使用playbook你可以方便的重用這些代碼,可以移植到不同的機器上面,像函數一樣,最大化的利用代碼。在你使用Ansible的過程中,你也會發現,你所處理的大部分操作都是編寫playbook。可以把常見的應用都編寫成playbook,之后管理服務器會變得十分簡單。
Ansible playbook格式
playbook由YMAL語言編寫。YAML( /ˈjæməl/ )參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822,Clark Evans在2001年5月在首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者。
YMAL格式是類似於JSON的文件格式,便於人理解和閱讀,同時便於書寫。首先學習了解一下YMAL的格式,對我們后面書寫playbook很有幫助。以下為playbook常用到的YMAL格式。
文件的第一行應該以 "—" (三個連字符)開始,表明YMAL文件的開始。
在同一行中,#之后的內容表示注釋,類似於shell,python和ruby。
YMAL中的列表元素以"-"開頭然后緊跟着一個空格,后面為元素內容。就像這樣
- apple - banana - orange等價於JSON的這種格式
[ "apple", "banana", "orange" ]
同一個列表中的元素應該保持相同的縮進。否則會被當做錯誤處理。
play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以":"分隔表示,":"后面還要增加一
hosts部分:使用hosts指示使用哪個主機或主機組來運行下面的tasks,每個playbook都必須指定hosts,hosts也可以使用通配符格式。主機或主機組在inventory清單中指定,可以使用系統默認的
/etc/ansible/hosts,也可以自己編輯,在運行的時候加上-i選項,指定清單的位置即可。在運行清單文件的時候,–list-hosts選項會顯示那些主機將會參與執行task的過程中
remote_user:指定遠端主機中的哪個用戶來登錄遠端系統,在遠端系統執行task的用戶,可以任意指定,也可以使用sudo,但是用戶必須要有執行相應task的權限。
tasks:指定遠端主機將要執行的一系列動作。tasks的核心為ansible的模塊,前面已經提到模塊的用法。tasks包含name和要執行的模塊,name是可選的,只是為了便於用戶閱讀,不過還是建議加上去,模塊是必須的,同時也要給予模塊相應的參數。
使用ansible-playbook運行playbook文件,得到如下輸出信息,輸出內容為JSON格式。並且由不同顏色組成,便於識別。一般而言
執行有三個步驟:1、收集facts 2、執行tasks 3、報告結果
注意:shell和command模塊后面直接跟命令,而非key=value類的參數列表;
(1) 某任務的狀態在運行后為changed時,可通過"notify"通知給相應的handlers;
(2) 任務可以通過"tags"打標簽,而后可在ansible-playbook命令上使用-t指定進行調用;
handlers:
先做一個簡單的劇本,安裝個samba,然后再開啟服務,劇本內容如圖:
但是現在我只想開啟服務,不想再次安裝samba(因為已經安裝過了),此時就可以給啟動服務打個標簽,這樣執行劇本就只開啟服務了
ansible web -m service -a "name=smb state=stopped"
然后再去執行劇本,使用-t調用我們剛才打的標簽,如圖:沒有再去安裝samba,只啟動服務
現在有一個需求,當nginx的配置文件發生變化時,就restarted,劇本如下圖所示:
現在改變nginx的配置文件,也就是修改/app/nginx.conf,然后就可以觸發handlers
variables:
(1) facts:可直接調用;
注意:可使用setup模塊直接獲取目標主機的facters;ansible web -m setup 來獲取主機的信息,里面有各種變量
{{ ansible_eth0['ipv4']['address'] }} centos6的IP地址變量
{{ ansible_ens33['ipv4']['address'] }} centos7的IP地址變量
(2) 用戶自定義變量:
-e VARS, --extra-vars=VARS 也就是在命令中指定變量是什么
ansible-playbook nginx.yml -e rpmname=vsftpd
再去改一下/app/nginx.conf,再改變一個端口如:9999
IP/HOSTNAME varaiable=value var2=value2
運行playbook的方式:
ansible-playbook --check 只檢測可能會發生的改變,但不真正執行操作;
ansible-playbook --list-hosts 列出運行任務的主機;
模板:templates
Jinja2:Jinja2是python的一種模板語言,以Django的模板語言為原本
字典:{key1:value1, key2:value2, ...}
使用模板示例:
1.將/app/nginx.conf改名為/app/nginx.conf.j2 這個配置文件就變成模板配置文件了
mv /app/nginx.conf /app/nginx.conf.j2
2.然后將模板配置文件里面的監聽端口寫成變量,cpu顆數也寫成變量
變量ansible_processor_vcpus是用ansible命令獲取的ansible web -m setup |grep cpu
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6"
判斷ansible_distribution_major_version這個變量等於6還是7,如果是6,說明是centos6系統,就執行template: src=files/nginx.conf.c6.j2,如果是7,說明是centos7的系統,就執行 template: src=files/nginx.conf.c7.j2
循環:迭代,需要重復執行的任務;對迭代項的引用,固定變量名為"item"而后,要在task中使用with_items給定要迭代的元素列表;
Ansible playbook字典
yum: name={{ item }} state=present
group: name={{ item }} state=present
user: name={{ item.name }} group={{ item.group }} state=present
- { name: 'user11', group: 'group11' }
- { name: 'user12', group: 'group12' }
- { name: 'user13', group: 'group13' }
企業級應用:
角色定制:roles
對於以上所有的方式有個弊端就是無法實現復用假設在同時部署Web、db、ha 時或不同服務器組合不同的應用就需要寫多個yml文件。很難實現靈活的調用。
roles 用於層次性、結構化地組織playbook。roles 能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用
roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量(vars)、文件(file)、任務(tasks)、模塊
(modules)及處理器(handlers)放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。
roles目錄結構
files/:存儲由copy或script等模塊調用的文件;
tasks/:此目錄中至少應該有一個名為main.yml的文件,用於定義各task;其它的文件需要由main.yml進行"包含"調用;
handlers/:此目錄中至少應該有一個名為main.yml的文件,用於定義各handler;其它的文件需要由main.yml進行"包含"調用;
vars/:此目錄中至少應該有一個名為main.yml的文件,用於定義各variable;其它的文件需要由main.yml進行"包含"調用;
templates/:存儲由template模塊調用的模板文本;
meta/:此目錄中至少應該有一個名為main.yml的文件,定義當前角色的特殊設定及其依賴關系;其它的文件需要由main.yml進行"包含"調用;
default/:此目錄中至少應該有一個名為main.yml的文件,用於設定默認變量;
實驗:角色定制:roles
1、在roles目錄下生成對應的目錄結構
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
2、定義tasks/main.yml的配置文件
vim /etc/ansible/roles/nginx/tasks/main.yml
copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm
yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
service: name=nginx state=started enabled=true
3.將最新版本的nginx rpm包下載到/etc/ansible/roles/nginx/files下
cd /etc/ansible/roles/nginx/files
cd /pub/Sources/7.x86_64/nginx
get nginx-1.10.2-1.el7.ngx.x86_64.rpm
4.在/etc/ansible/roles/nginx/templates中配置模板文件
cp /etc/nginx/nginx.conf /etc/ansible/roles/nginx/templates/nginx.conf.j2
5.在/etc/ansible/roles/nginx/vars目錄下配置變量文件mian.yml
cd /etc/ansible/roles/nginx/vars
cd /etc/ansible/roles/nginx/handlers
service: name=nginx state=restarted
7.定義/etc/ansible/roles.yml的playbook文件
ansible-playbook roles.yml 執行成功