運維之ansible

運維工作:系統安裝(物理機、虛擬機)–> 程序包安裝、配置、服務啟動 –> 批量操作 –> 程序發布 ?–> 監控
穩定可用 ? ? ——- ? ? ?標準化 ? ? ? ? ? ?——— ? ? ? ?自動化
系統安裝:
1、物理機:PXE、Cobbler
2、虛擬機:Image Templates
程序配置Configration:
1、puppet (ruby語言研發)
2、saltstack (python語言研發)
3、chef
4、cfengine
5、ansible
批量操作Command and Control:
1、fabric(python語言研發)
2、func
3、ansible
程序發布:
1、人工智能(手動發布)
2、腳本
3、發布程序(運維程序)
程序發布的標準要求:
1、不能影響用戶體驗;
2、系統不能停機;
3、不能導致系統故障或造成系統完全不可用;
發布路徑:
/webapps/tuangou
/webapps/tuangou-1.1
/webapps/tuangou-1.2
灰度模型:
主機
用戶
在調度器上下線一批主機(標記為維護模式) ? —– ? ? 關閉服務 ? —— ? ?部署新版本 ? ?——- ? ? ?啟動服務 ? ?——- ? 在調度器上啟用這一批主機;
運維工具的分類:
1、agent:puppet,func
2、agentless(ssh):ansible、fabric
ansible:可以實現系統安裝(研發中)、程序配置、批量操作、發布程序(需自定義)
模塊化,調用特定的模塊,完成特定的任務;
基于Python語言實現,由Paramiko、PyYAML和Jinja2三個關鍵模塊;
部署簡單,agentless;
主從模式;
支持自定義模塊;
支持Playbook;
冪等性;執行一次跟多次結果一致;
安裝ansible:epel,ansible
配置文件:/etc/ansible/ansible.cfg
主機清單:/etc/ansible/hosts
主程序:
ansible
ansible-playbook
ansible-doc
ansible的簡單使用格式:
ansible ? ?HOST-PATTERN ? ? -f ?forks ? -m MOD_NAME ? ?-a ?MOD_ARGS
使用前提:
1、各節點先寫入/etc/ansible/hosts里
2、各節點基于ssh密鑰認證通信
控制端(即ansible主機)
# ssh-keygen -t rsa -P ”
# ssh-copy-id ?-i ?~/.ssh/id_rsa.pub ? ?root@各節點
常用模塊:
獲取模塊列表:ansible-doc ?-l
獲取指定模塊的幫助:ansible-doc ?-s ?MOD_NAME
1、command模塊:在遠程主機運行命令;
2、shell模塊:在遠程主機在shell進程下運行命令,支持shell特性,例如管道、重定向等;
3、copy模塊:復制ansible主機的文件到各遠程節點;
用法:
(1)src= ?dest=
(2)content= ? dest=
owner,group,mode
4、cron模塊:管理各遠程節點的cron任務;
用法:
name= ?job= ? state=present(創建)|absent(刪除)
minute,hour,day,month,weekday,user
5、fetch模塊:從各遠程節點拉取文件到ansible本機;
6、file模塊:設定遠程各節點的文件屬性;
用法:
(1)創建鏈接文件:path= ? src= ?state=link
(2)修改屬性:path= owner= ? group= mode=
(3)創建目錄:path= ? state=directory
7、hostname模塊:管理遠程各節點主機名
8、pip模塊:安裝遠程各節點的python所需的庫
9、yum模塊:管理各節點的yum程序;
name=:程序包名,可以帶版本號;
state=:安裝(present|lastest),卸載(absent);
10、service模塊:管理遠程各節點的服務
name=:
state=:started啟動,stopped停止,restarted重啟
enabled=0|1:開機是否啟動
runlevel=
11、ping模塊:ping遠程各節點;
12、user模塊:管理遠程各節點的用戶
name=
system=yes|no
uid=
shell=
state=present|absent
home=:家目錄
group=:基本組
groups=:額外組
remove:刪除用戶,同時刪除家目錄
13、uri模塊:訪問遠程各節點的http|https服務
14、setup模塊:收集遠程各節點的facts信息;
15、group模塊:添加或刪除組
name=
state=present|absent
gid=
system=:是否系統組
16、script模塊:把一個本地script傳遞到遠程各節點執行
-a “/path/to/script_file”
17、template模塊:基于模板方式生成一個文件復制到遠程主機
src=
dest=
YAML語法:YAML的語法和其他高階語言類似,并且可以簡單表達清單、散列表、標量等數據結構。其結構(Structure)通過空格來展示,序列(Sequence)里的項用”-“來代表,Map里的鍵值對用”:”分隔。下面是一個示例。

name: John Smith
age: 41
gender: Male
spouse:
name: Jane Smith
age: 37
gender: Female
children:
– name: Jimmy Smith
age: 17
gender: Male
– name: Jenny Smith
age 13
gender: Female

YAML文件擴展名通常為.yaml,如example.yaml。

playbook的核心元素:
hosts:
tasks: 任務
variables: 變量
templates: 模板(包含了模版語法的文本文件)
handlers: 處理器(由特定條件觸發的任務)
roles: 角色
案例:
heartbeat.yaml
– hosts: hbhosts
?remote_user: root
?tasks:
? ?– name: ensure heartbeat latest version
? ? ?yum: name=heartbeat state=present
? ?– name: authkeys configure file
? ? ?copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys
? ?– name: authkeys mode 600
? ? ?file: path=/etc/ha.d/authkeys mode=600
? ? ?notify:
? ? ? ?– restart heartbeat
? ?– name: ha.cf configure file
? ? ?copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf
? ? ?notify:
? ? ? – restart heartbeat
?handlers:
?– name: restart heartbeat
? ?service: name=heartbeat state=restarted
playbook的基礎組件:
hosts:運行指定任務的目標主機;
remote_user:在遠程主機上執行任務的用戶;
sudo_user:在需要用到sudo時指定的用戶;
tasks:任務列表,自上而下
(1)action:module arguments
(2)module:arguments
注意:shell和command模塊后面直接跟命令,而非key=value類的參數列表
handlers:任務,在特定條件下觸發,接收到其他任務的通知時被觸發;
(1)某任務的狀態在運行后為changed時,可通過“notify”通知給相應的handlers;
(2)任務可以通過“tags”打標簽,而后在ansible-playbook命令上使用-t指定進行調用;
運行playbook的方式:
(1)測試
ansible-playbook ?–check:只檢測可能發生的改變,但不真正執行操作;
ansible-playbook ?–list-hosts:列出運行任務的主機;
(2)運行
variables: 變量;調用 ?{{ ? variable ? }}
1、facts:setup模塊提供的;可直接調用
2、ansible-playbook命令的自定義變量:通過雙括號進行調用:{{ ? 變量名 ?}};
3、通過roles傳遞變量;
4、Host Incentory:
(1)向不同的主機傳遞不同的變量;在/etc/ansible/hosts文件下,IP/HOSTNAME ? variable=value ? var2=value2
(b)向組中的主機傳遞相同的變量;在/etc/ansible/hosts文件下,[groupname:vars] ? var=value
在playbook中定義變量的方法:
vars:
– var1: ?value1
– var2: ?value2
inventory參數:用于定義ansible遠程連接目標主機時使用的參數,而非傳遞給playbook的變量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
模板:templates;文本文件,嵌套有腳本(使用模板編程語言編寫)
jinjar2:
1、字面量:
(1)字符串:使用單引號或雙引號;
(2)數值:整數,浮點數;
(3)列表:[item1,item2];
(4)元組:(item1,item2);
(5)字典:{key1:value1,key2:value2,…};
(6)布爾型:true|false
2、算術運行:
+,-,*,/,//,%,**
3、比較操作:
==,!=,>,>=,<,<=
4、邏輯運算:
and,or,not
案例:nginx.yaml:在websrvs組安裝nginx,并根據模板nginx.j2,啟動nginx服務;
# vim nginx.yaml
1
其中nginx.j2 ? 傳遞了2個變量
worker_processes {{ ansible_processor_vcpus-1 }}; ? ? ? ? ? ? ? ? ?#由setup模塊提供的變量;
listen {{ http_port }} default_server;
http_port變量是由/etc/ansible/hosts文件傳遞;如下
2
條件測試:
when語句:在tasks中使用,jinja2的語法格式;

在tasks后添加when子句即可使用條件測試;when語句支持jinja2表達式語法。例如:

tasks:
– name: “shutdown Debian flavored systems”
command: /sbin/shutdown -h now
when: ansible_os_family == “Debian”

循環:迭代,需要重復執行的任務;
對迭代項的引用,固定變量名為“item”;而后在tasks中,使用with_items給定要迭代的元素列表;a、字符串,2、字典
a、例如:
– name: install some package
? ?yum: name={{ ?item ?}} ? ?state=present
? ?with_items:
? ?– ? ?nginx
? ?– ? ?memcached
? ?– ? ?php-fpm
b、例如
– name: ?add some group
? ?group: ? name={{ ? item ? }} ? state=present
? ?with_items:
? ? – ?group1
? ? – ?group2
? ? – ?group3
– ?name: ?add ?some users
? ? user:name={{ ? item.name ? }} ? group={{ item.group ? }} ? ? state=present
? ? with_items:
? ? ?– ? { ?name: ?“user1” ? ?group: ? “group1” ? }
? ? ?– ? { ?name: ?“user2” ? ?group: ? “group2” ? }
? ? ?– ? { ?name: ?“user3” ? ?group: ? “group3” ? }
角色roles:roles就是通過分別將變量、文件、任務、模板及處理器放置于單獨的目錄中,并可以便捷地include它們的一種機制。角色一般用于基于主機構建服務的場景中,但也可以是用于構建守護進程等場景中。

roles模塊的路徑可以在配置文件/etc/ansible/ansible.cfg里roles_path定義.

1
2
vim??/etc/ansible/ansible.cfg
roles_path??=?/etc/ansible/roles:/usr/share/ansible/roles

role內各目錄中可用的文件:

tasks目錄:至少應該包含一個名為main.yml的文件,其定義了此角色的任務列表;其他的文件需要在此文件中通過include進行包含;
files目錄:存放由copy或script等模塊調用的文件;
templates目錄:template模塊查找所需要模板文件的目錄;
handlers目錄:至少應該包含一個名為main.yml的文件,用于定義此角色用到的各handler;在handler中使用include包含的其它的handler文件也應該位于此目錄中;
vars目錄:至少應該包含一個名為main.yml的文件,用于定義此角色用到的變量;
meta目錄:至少應該包含一個名為main.yml的文件,用于定義此角色的特殊設定及其依賴關系;ansible 1.3及其以后的版本才支持;
default目錄:為當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件;
創建role的步驟
(1) 創建以roles命名的目錄;
(2) 在roles目錄中分別創建以各角色名稱命名的目錄,如webservers等;
(3) 在每個角色命名的目錄中分別創建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創建為空目錄,也可以不創建;
(4) 在playbook文件中,調用各角色;
示例:創建nginx角色

#設置任務文件,注意,配置模板文件的src使用相對路徑即可,目錄的相對路徑是:/usr/share/ansible/roles/nginx/templates/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
vim?/usr/share/ansible/roles/nginx/tasks/main.yml?
-?name:?install?nginx?package
??yum:?name=nginx?state=latest
-?name:?copy?nginx?conf?file
??tempalte:?src=web.conf.j2?dest=/etc/nginx/conf.d/web.conf
??notify:?reload?nginx
??tags:?cpfile
-?name:?create?docroot?dir
??file:?path={{?ngx_doc_root?}}?state=directory
??tags:?cpfile
-?name:?start?nginx?service
??service:?name=nginx?enabled=true?state=started
#設置變量,在vars目錄下定義變量,變量不需要橫桿引導
vim?/usr/share/ansible/roles/nginx/vars/main.yml
ngx_port:?8888
ngx_server_name:?www.sunny.com
ngx_doc_root:?/webdata
#設置觸發后執行的操作
vim?/usr/share/ansible/roles/nginx/handlers/main.yml
-?name:?reload?nginx
??service:?name=nginx?state=reloaded
#設置模板文件
vim?/usr/share/ansible/roles/nginx/templates/web.conf.j2
????listen?{{?ngx_port?}};?
????server_name?{{?ngx_server_name?}};?
????location?/?{?
????????root?{{?ngx_doc_root?}};?
????}???
}

#調用模塊

1
2
3
4
5
vim?/root/ansible/nginxrole.yml
-?hosts:?dbsrvs
??remote_user:?root
??roles:
??-?nginx

?測試模塊

1
ansible-playbook??-C?/root/ansible/nginxrole.yml

注意,由于測試沒有實際安裝nginx模塊,因此測試時,啟動服務會失敗

執行模塊

1
ansible-playbook??/root/ansible/nginxrole.yml

執行tag cpfile對應的代碼,如果文件web.conf.j2 發生變化,包括定義變量的文件發送變化,就會重新服務該文件到對應機器,同時,notify生效,重啟nginx服務

1
ansible-playbook?-t?cpfile?/root/ansible/nginxrole.yml

在執行命令中執行變量,注意,命令里的變量優先級比配置再模塊vars下的優先級高

1
ansible-playbook?-t?cpfile?-e?"ngx_port=8899"?/root/ansible/nginxrole.yml
在playbook調用角色方法1:
– hosts: ?websrvs
? ?remote_user: root
? ?roles:
? ?– ?nginx
? ?– ?memcached
在playbook調用角色方法2:傳遞變量給角色
– hosts: ?websrvs
? ?remote_user: root
? ?roles:
? ?– ?{ ?role: nginx, ?username: nginx } ? ? ?鍵role用于指定角色名稱,后續的K/V用于傳遞變量給角色
還可以基于條件測試實現角色調用3;
roles:
? – ?{ ? role: ?nginx, ?when: ?ansible_distribution_major_version == ‘7’ ?}
參考文檔:www.ansible.com.cn

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/103105

(2)
N26-深圳-城市蝸牛N26-深圳-城市蝸牛
上一篇 2018-07-16
下一篇 2018-07-16

相關推薦

  • Linux中 profile、bashrc、bash_profile三配置文件之間的區別和聯系

    在上課中有關注到王老師,對于環境配置參數的修改,由于不太懂,在網上搜索得到的結果,分享給大家

    Linux筆記 2018-07-30
  • linux基礎3

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@localhost ~]# who | cut -d ‘ ‘ -f1 | sort -u root 2、取出最后登錄到當前系統的用戶的相關信息。 [root@localhost ~]# last -1 | id uid=0(root…

    Linux筆記 2018-07-08
  • 第一周作業-Linux Basic

    ? Linux 入門基礎 計算機組成及功能 一般而言,計算機的組成應該分為兩部分: 一部分指的是硬件部分。根據馮諾伊曼提出的計算機體系架構,一臺計算機主要分為五個部分:控制器、運算器、存儲器、輸入設備、輸出設備 運算器: 包含算數邏輯單元(ALU)、累加器、狀態寄存器、通用寄存器組等,主要作用如下 算數邏輯單元(ALU):進行二位元的算術運算,如加減乘(不包…

    Linux筆記 2018-06-24
  • Linux系統上命令的使用格式;及常用命令的簡易使用說明

    命令的基本格式為:? ?命令? ? [選項]? ?[參數] ifconfig? 命令??ifconfig – configure a network interface 配置網絡接口??其中inet addr 為本地ip地址。目前階段命令僅限于查看本地ip地址。   echo 命令?echo – display a line…

    2018-06-27
  • vim編輯

    簡要介紹了編輯文本工具中的vim,了解其強大功能,帶你認識全新的vim。

    2018-04-07
  • yum配置

    本節簡要介紹本地yum配置以及網絡yum源的配置

    Linux筆記 2018-04-22
欧美性久久久久