1. 程式人生 > 實用技巧 >自動化運維工具之ansible

自動化運維工具之ansible

一、什麼樣的情形需要批量部署

1、作業系統的安裝

常見的有collber,red hat satelite(redhat)系統專用。

2、作業系統的配置

常見的有cfengine,puppet,chef,func。其中puppet最受歡迎

3、批量程式的部署

4、批量命令的執行檢視狀態資訊

二、ansible介紹

ansible的架構大致如下

1

ansible是新出現的運維工具是基於Python研發的糅合了眾多老牌運維工具的優點實現了批量作業系統配置、批量程式的部署、批量執行命令等功能。

運維工具常見的工作模式1、agent模式:基於ssl實現。代理工作在被監控端。像puppet。2、agentless模式:基於ssh服務實現工作在被監控端。監控端是ssh的客戶端。

ansible是工作在agentless模式下具有冪等性。ansible在控制端只需要告訴監控端的期望狀態就可以實現批量部署。

名詞解釋冪等性不會重複執行相同的指令。例如不會重複安裝軟體期望狀態只需要告訴被監控端的期望狀態

ansible是基於模組工作的ansible本身沒有批量部署的能力。真正具有批量部署的是ansible所執行的模組ansible只是提供一種框架。架構包括

  • 連線外掛connection plugins負責和被監控端實現通訊。

  • Host Inventory:指定操作的主機,是一個配置檔案裡面定義監控的主機

  • 各種模組核心模組command模組自定義模組

  • 藉助於外掛完成記錄日誌郵件等功能

  • PlayBooks:劇本執行多個任務時。並非必需可以讓節點一次性執行多個任務

三、ansible的基本使用

安裝軟體yuminstallansible-y#對應的軟體在epel倉庫中也可自己手動編譯#原始碼地址https://pypi.python.org/packages/source/a/ansible/ansible-1.5.tar.gz

2

2、定義HostInventory#vim/etc/ansible/hosts[webhosts]172.16.10.22ansible_ssh_user=rootansible_ssh_pass=guoting172.16.10.33ansible_ssh_user=rootansible_ssh_pass=guoting解釋#ansible_ssh_user=root是ssh登陸使用者#ansible_ssh_pass=guoting是ssh登陸密碼3、測試各個模組#注意每個模組的用法可以使用ansible-docMOD來檢視例如ansible-doccopyansible命令最常用的用法ansible<Host-partten>-mMOE-a'MOD_ARV'所支援的模組可以使用ansible-doc-l來檢視

ansible示例

1、檢視時間資訊。command、shell模組

3

2、在控制端新增新增使用者。user模組

4

3、實現ssh祕鑰認證。shell、copy模組

6


此時就可以實現基於ssh祕鑰通訊了此時/etc/ansible/hosts可以修改如下

######/etc/ansible/hosts[webhosts]172.16.10.22172.16.10.33

7

4、安裝軟體和啟動服務。yum、service模組

8

9

5、支援管道的命令。raw模組,類似於shell模組

wKioL1QaeV6QK9YUAACu77PB1cY454.jpg

四、YAML語言介紹

1、YAML簡介

YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言包括XML、C語言、Python、Perl以及電子郵件格式RFC2822等。ClarkEvans在2001年在首次發表了這種語言另外IngydtNet與OrenBen-Kiki也是這語言的共同設計者。YAMLAin'tMarkupLanguage即YAML不是XML。不過在開發的這種語言時YAML的意思其實是"YetAnotherMarkupLanguage"仍是一種標記語言。其特性YAML的可讀性好YAML和指令碼語言的互動性好YAML使用實現語言的資料型別YAML有一個一致的資訊模型YAML易於實現YAML可以基於流來處理YAML表達能力強擴充套件性好更多的內容及規範參見http://www.yaml.org。##########################YAML語法YAML的語法和其他高階語言類似並且可以簡單表達清單、散列表、標量等資料結構。其結構Structure通過空格來展示序列Sequence裡的項用"-"來代表Map裡的鍵值對用":"分隔。YAML副檔名通常為.yaml或者.yml。下面是一個示例。name:JohnSmithage:41gender:Malespouse:name:JaneSmithage:37gender:Femalechildren:-name:JimmySmithage:17gender:Male-name:JennySmithage13gender:FemaleYAML2個重要的結構組成部分list和directory#################################list列表的所有元素均使用“-”打頭例如#Alistoftastyfruits-Apple-Orange-Strawberry-Mango##############################dictionary字典通過key與valuef進行標識例如---#Anemployeerecordname:ExampleDeveloperjob:Developerskill:Elite也可以將key:value放置於{}中進行表示例如---#Anemployeerecord{name:ExampleDeveloper,job:Developer,skill:Elite}多個對映關係組成一個字典一個列表可以包含多個字典。

2、ymal中的變數

##################################變數命名變數名僅能由字母、數字和下劃線組成且只能以字母開頭。##################################factsfacts是由正在通訊的遠端目標主機發回的資訊這些資訊被儲存在ansible變數中。要獲取指定的遠端主機所支援的所有facts可使用如下命令進行#ansiblehostname-msetup這個命令可以獲得被監控端主機的各種資訊將這些資訊得到後儲存到變數中。################################自定義變數在yaml中可以使用vars關鍵字來定義變數vars:var_name:value#############################變數的引用{{var_name}}###########################特殊的變數迭代當有需要重複性執行的任務時可以使用迭代機制。其使用格式為將需要迭代的內容定義為item變數引用並通過with_items語句來指明迭代的元素列表即可。#######################################示例例如在被控端新增2個使用者方式1一般做法-name:addusertestuser1user:name=testuser1state=presentgroups=wheel-name:addusertestuser2user:name=testuser2state=presentgroups=wheel方式2使用變數方式-name:addseveralusersvars:user1:testuser1user2:testuser2user:name={{user1}}state=presentgroups=wheeluser:name={{user2}}state=presentgroups=wheel方式3使用迭代方式-name:addseveralusersuser:name={{item}}state=presentgroups=wheelwith_items:-testuser1-testuser2事實上with_items中可以使用元素還可為hashes例如-name:addseveralusersuser:name={{item.name}}state=presentgroups={{item.groups}}with_items:-{name:'testuser1',groups:'wheel'}-{name:'testuser2',groups:'root'}

3、Inentory檔案的格式

inventory檔案遵循INI檔案風格中括號中的字元為組名。可以將同一個主機同時歸併到多個不同的組中此外當如若目標主機使用了非預設的SSH埠還可以在主機名稱之後使用冒號加埠號來標明。[webservers]www1.magedu.com:2222www2.magedu.com[dbservers]db1.magedu.comdb2.magedu.comdb3.magedu.com如果主機名稱遵循相似的命名模式還可以使用列表的方式標識各主機例如[webservers]www[01:50].example.com[databases]db-[a:f].example.com####################主機變數可以在inventory中定義主機時為其新增主機變數以便於在playbook中使用。例如[webservers]www1.magedu.comhttp_port=80maxRequestsPerChild=808www2.magedu.comhttp_port=303maxRequestsPerChild=909###################組變數組變數是指賦予給指定組內所有主機上的在playbook中可用的變數。例如[webservers]www1.magedu.comwww2.magedu.com[webservers:vars]ntpntp_server=ntp.magedu.comnfsnfs_server=nfs.magedu.com##################組巢狀inventory中組還可以包含其它的組並且也可以向組中的主機指定變數。不過這些變數只能在ansible-playbook中使用而ansible不支援。例如[apache]httpd1.magedu.comhttpd2.magedu.com[nginx]ngx1.magedu.comngx2.magedu.com[webservers:children]apachenginx[webservers:vars]ntpntp_server=ntp.magedu.com#########################inventory引數ansible基於ssh連線inventory中指定的遠端主機時還可以通過引數指定其互動方式常用的引數如下所示ansible_ssh_host#要連線的主機名ansible_ssh_port#埠號預設是22ansible_ssh_user#ssh連線時預設使用的使用者名稱ansible_ssh_pass#ssh連線時的密碼ansible_sudo_pass#使用sudo連線使用者是的密碼ansible_ssh_private_key_file#祕鑰檔案如果不想使用ssh-agent管理時可以使用此選項ansible_shell_type#shell的型別預設sh#########################################################################################ansible的迴圈機制還有更多的高階功能具體請參見官方文件http://docs.ansible.com/playbooks_loops.html。


4、playbooks

playbook是由一個或多個“play”組成的列表。play的主要功能在於將事先歸併為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來講所謂task無非是呼叫ansible的一個module。將多個play組織在一個playbook中即可以讓它們聯同起來按事先編排的機制同唱一臺大戲。###########################playbook基礎元件1、Hosts和Usersplaybook中的每一個play的目的都是為了讓某個或某些主機以某個指定的使用者身份執行任務。hosts用於指定要執行指定任務的主機其可以是一個或多個由冒號分隔主機組。remote_user則用於指定遠端主機上的執行任務的使用者。不過remote_user也可用於各task中。也可以通過指定其通過sudo的方式在遠端主機上執行任務其可用於play全域性或某任務。此外甚至可以在sudo時使用sudo_user指定sudo時切換的使用者。-hosts:webnodesremote_user:mageedutasks:-name:testconnectionping:remote_user:mageedusudo:yes2、任務列表和actionplay的主體部分是tasklist。tasklist中的各任務按次序逐個在hosts中指定的所有主機上執行即在所有主機上完成第一個任務後再開始第二個。在執行自下而下某playbook時如果中途發生錯誤所有已執行任務都將回滾因此在更正playbook後重新執行一次即可。task的目的是使用指定的引數執行模組而在模組引數中可以使用變數。模組執行是冪等的這意味著多次執行是安全的因為其結果均一致。每個task都應該有其name用於playbook的執行結果輸出建議其內容儘可能清晰地描述任務執行步驟。如果未提供name則action的結果將用於輸出。定義task的可以使用“action:moduleoptions”或“module:options”的格式推薦使用後者以實現向後相容。如果action一行的內容過多也中使用在行首使用幾個空白字元進行換行。tasks:-name:makesureapacheisrunningservice:name=httpdstate=running在眾多模組中只有command和shell模組僅需要給定一個列表而無需使用“key=value”格式例如tasks:-name:disableselinuxcommand:/sbin/setenforce0如果命令或指令碼的退出碼不為零可以使用如下方式替代tasks:-name:runthiscommandandignoretheresultshell:/usr/bin/somecommand||/bin/true或者使用ignore_errors來忽略錯誤資訊tasks:-name:runthiscommandandignoretheresultshell:/usr/bin/somecommandignore_errors:True3、handlers用於當關注的資源發生變化時採取一定的操作。“notify”這個action可用於在每個play的最後被觸發這樣可以避免多次有改變發生時每次都執行指定的操作取而代之僅在所有的變化發生完成後一次性地執行指定操作。在notify中列出的操作稱為handler也即notify中呼叫handler中定義的操作。-name:templateconfigurationfiletemplate:src=template.j2dest=/etc/foo.confnotify:-restartmemcached-restartapachehandler是task列表這些task與前述的task並沒有本質上的不同。handlers:-name:restartmemcachedservice:name=memcachedstate=restarted-name:restartapacheservice:name=apachestate=restarted

5、tags

tags用於讓使用者選擇執行或路過playbook中的部分程式碼。ansible具有冪等性因此會自動跳過沒有變化的部分即便如此有些程式碼為測試其確實沒有發生變化的時間依然會非常地長。此時如果確信其沒有變化就可以通過tags跳過此些程式碼片斷。示例基於playbooks實現web服務的部署1、提供好Inventory檔案#/etc/ansible/hosts基於祕鑰認證[webhosts]172.16.10.22172.16.10.332、編輯palybooks劇本#vim/root/web.yaml-name:webserviceremote_user:roothosts:webhostsvars:packages:httpdtasks:-name:installhttpdyum:name={{packages}}state=presenttags:install-name:configurationhttpdcopy:src=/root/httpd.confdest=/etc/httpd/conf/httpd.conftags:confnotify:-restarthttpd-name:servicehttpdstartservice:name=httpdenabled=nostate=startedtags:start-name:addcentosandhadoopuseruser:name={{item}}state=absenttags:adduserwith_items:-centos-hadoophandlers:-name:restarthttpdservice:name=httpdstate=restarted3、準備好配置檔案將web的配置放到指定目錄src=/root/httpd.conf4、開始部署ansible-playbooks/root/web.yml

結果示例

11

檢視埠

12

此時如果配置檔案發生變化

13

至此基本使用配置完成。

博文地址:http://guoting.blog.51cto.com/8886857/1553446


轉載於:https://blog.51cto.com/lucifer119/1557303