ansible基础
一、 基礎概念
Ansible發布于2012年,當年就被評為開源項目top10。基于python語言研發,部署簡單
1. 架構
- Ansible:基礎框架核心模塊
- Core modules:核心模塊,完成最基本的系統配置、管理等相關功能
- Custom modules:自定義模塊,支持市面上大部分編程語言來開發模塊
- Plugins:可以基于插件方式完成額外的功能擴展connection plugins:鏈接插件,主要功能是鏈接各被管理的主機 host inventory:主機清單,定義被管理主機 playbooks:任務清單
2. 特性
- 平緩的學習曲線(Minimal Learning curve,auditability)
- No bootstrapping:無需用到bootstrapping功能
- No DAG ordering,Fails Fast:非有向無環圖形式,快速失敗機制
- No Agent、No Server
- No additional PKI:不依賴于額外的ssl服務
- Modules in any language:高度模塊化,通過調用特性的模塊完成特定任務
- YAML:基于yaml模板語言文件來完成批量任務的模板化
- ssh by default
- Strong multi-tier solution:強大的多層的解決方案
3. 運維工具分類
- 有agent:需要在每個被管理的節點上安裝代理工具,這個代理工具能夠跟管控端進行通信,管控端可以向代理下達指令,由代理進程在被管理節點本地完成某些管理操作
- 無agent(agentless):無agent的管理工具,一般通過ssh管理
4. 冪等性
同樣的配置文件,所需要執行的操作,運行多少遍的結果都是一樣的
二、安裝及生成文件
1. 安裝
因為ansible被收錄于EPEL源,先安裝EPEL源,再安裝ansible
- EPEL源:yum -y install epel-release
- ansible:yum install ansible -y
2. 配置文件
- /etc/ansible/ansible.cfg:主配置文件
- /etc/ansible/hosts:主機清單文件
- /etc/ansible/roles:角色配置文件
- /usr/bin/ansible:主程序
- /usr/bin/ansible-playbook:運行playbook的命令
- /usr/bin/ansible-galaxy:下載或上傳優秀代碼或Roles
三、命令
1. ansible命令
命令格式:ansible <host-pattern> [-f #] [-m module_name] [-a args]
option:-f #:每一批管理幾臺,默認為5-m m_name:調用哪個模塊做管理操作,默認為command模塊-a arg:指定模塊特有的參數-i file:指明主機清單文件-k:如果不基于秘鑰驗證,每一次登錄的密碼user模塊 name=:指明用戶名稱state={present|absent}:present為創建,absent為刪除cron模塊:向每個主機分發定期任務day=:name=:cron任務的描述state={present|absent}:present為創建,absent為刪除user=:以哪個用戶運行job=:指明執行哪個命令disabled=:啟用或禁用任務copy模塊:復制文件的模塊dest=:指定放在目標主機的絕對路徑src=:指明本地路徑,默認可遞歸復制mode=:復制后直接指定權限content=:直接寫明內容,在遠程生成follow=:如果復制的文件中包含鏈接文件,還要將源文件一并復制示例:ansible all -m copy -a 'src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/nginx.repo'fetch模塊:把遠程的文件抓取到本地,抓取到的文件會在本地保留原路徑目錄src:遠程目標路徑dest:本地路徑file:專門設置文件的屬性state=:{directory|link|present|absent}src=:創建鏈接文件時,指明在遠程主機的鏈接源文件path=:指定目標路徑ping:ping模塊是專門測試主機存活狀態示例:ansible all -m ping yum:yum模塊name=:指明程序包名稱state={present|latest|absent}示例:ansible all -m yum -a 'name=nginx state=present'service:管理服務的模塊name=:指明服務名state={started|stopped|restaretd}:enabled={yes|no}:設置開機自啟shell:一些需要管道的復雜命令,需要使用此模塊完成,使用方法同commondscript:把本地腳本在遠程運行-a /path/to/somepath:直接指明本地腳本路徑setup:命令遠程主機向ansible報告自身的屬性信息2. ansible-doc 命令
ansible-doc [option]-a:顯示所有模塊的文檔-l:查看ansible支持的可用模塊-s module_name:顯示某個模塊的在playbook中的具體用法3. ansible-playbook 命令
命令格式:ansible HOST <file.yml> [option]-e vars:額外傳遞變量-u user:指定運行用戶身份-C:檢測運行,不是真正運行-t:指定執行tags段4. ansible-galaxy 命令
此命令用于前往galaxy.ansible.com下載優秀角色文件
命令格式:ansible-galaxy <option> [file]install:拉取角色文件remove:刪除list:列出本地角色文件5. ansible-vault 命令
加密playbook的命令
ansible-vault [option] <file.yml>create:創建一個加密yml文件decrypt:解密encrypt:加密view:查看edit:編輯rekey:修改密碼四、Inventory
為了便捷的批量操作主機,可以在inventory文件中將主機歸類定義。inventory文件遵循INI文件風格,中括號中的字符為組名,下方列出組內的各個主機,同一個主機可以同時歸并到多個不同的組中。此外,當如若目標主機使用了非默認的SSH端口,可以在主機名稱之后使用冒號加端口來標明。默認的inventory file為/etc/ansible/hosts
[webservers] node1.busyops.com node2.busyops.com[dbservers] db1.busyops.com db2.busyops.com db3.busyops.com如果主機名稱遵循相似的命名格式,可以使用列表的方式標識各主機[webservers] node[01:50].busyops.com[databases] db-[a:f].busyops.com五、Playbooks
1. 基礎指令
通過一個簡單示例介紹幾個基本的指令
- hosts: groupremote_user: roottasks:- name: install httpdyum: name=httpd state=present- name: copy httpd cfgcopy: src=/tmp/httpd.conf dest=/etc/httpd/conf/httpd.conf- hosts:用于指定要執行任務的主機,此處的group即為在Inventory文件中定義的主機名或主機組,如果想定義多個主機組可以使用冒號分割
- remote_user:指明執行任務以哪個用戶的身份運行,示例中的remote_user指令是定義在hosts指令下的,其實這個指令也可以定義在task下,那么其生效范圍也就僅針對某個task
- tasks:用于指定需要執行的任務列表,列表中可以指定多個任務,ansible會指揮著全部主機完成第一個任務后,才會去執行第二個任務,運行過程中如果發生錯誤,可回滾的任務都將回滾。因此,只需更正playbook后再執行一次即可。在task中可以指定參數、執行模塊,每個模塊參數中都可以使用變量,每個task都應該有其name,用于playbook的執行結果輸出,建議其內容盡可能可以清晰描述任務執行步驟,如果未提供name,則其action的結果將用于輸出
2. notify和handlers
先看一個沒有notify和handlers的示例
示例一: - hosts: groupremote_user: roottasks:- name: install httpdyum: name=httpd state=present- name: copy httpd cfgcopy: src=/tmp/httpd.conf dest=/etc/httpd/conf/httpd.conf- name: start httpdservice: name=httpd state=started在這個示例中,如果這個playbook僅執行1次,那么其不會暴露什么問題。但是如果我們修改了配置文件(如修改了監聽端口),再次執行這個playbook時,安裝httpd和啟動服務都會和第一次運行一樣,而新的配置文件中修改的監聽端口并不會生效,因其使用的還是老的配置文件。所以notify和handlers就是為了解決這個問題出現的
示例二: - hosts: groupremote_user: roottasks:- name: install httpdyum: name=httpd state=present- name: copy httpd cfgcopy: src=/tmp/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- - name: start httpdservice: name=httpd state=startedhandlers:- name: restart httpdservice: name=httpd state=restarted在第二個示例中,復制配置文件的task新增了notify指令,作用為一旦發現這個task狀態為change時,就通知給相應的handlers,接著在最后定義相應的handlers,注意notify調用的名稱一定要和handlers的name相吻合才行。通過notify和handlers就保證了當某配置改變時,自動去重啟服務
3. vars
變量名僅能由字母、數字和下劃線組成,且只能以字母開頭
(1)facts
由正在通信的遠程目標主機發回的信息,這些信息被保存在ansible變量中,要獲取指定的遠程主機所支持的facts可使用ansible <HOST> -m setup查看
(2)通過命令行傳遞變量
在運行playbook時通過命令行傳遞變量給playbook:ansible-playbook test.yml --extra-vars "hosts=www user=busyops",那么通過命令行傳遞的變量可以在運行playbook是直接進行調用
(3)主機變量
為每個主機定義不同變量,只需要在主機名稱后跟變量即可,需要在inventory中定義
[web_server] node1.cluster.com http_port=80 node2.cluster.com http_port=8080(4)組變量
賦值給組內的所有主機,組內所有主機都可以在playbook中調用。注意vars為組變量固定關鍵字
[web_server] node1.cluster.com node2.cluster.com[web_server:vars] ntp_server=ntp1.aliyun.com port=80(5)組變量嵌套
組1:[httpd_server]httpd1.cluster.comhttpd2.cluster.com組2:[nginx_server]nginx1.cluster.comnginx2.cluster.com組嵌套固定格式:[web_servers:clildren]nginx_serverhttpd_server指定組變量:[web_servers]name=valuename=value(6) 直接指定
直接在playbook中指定需要用到的變量
- hosts: groupremote_user: rootvars:- pkg: httpd- srv: httpdtasks:- name: install httpdyum: name={{ pkg }} state=present- name: copy httpd cfgcopy: src=/tmp/httpd.conf dest=/etc/httpd/conf/httpd.conf- name: start httpdservice: name={{ srv }} state=started定義的用于此hosts指定主機用到的變量,如示例所示定義了兩個變量。后面調用時可以使用一組花括號進行調用{{ VARS }}
4. 條件測試
在playbook實現條件測試需要使用when關鍵字,見下方示例
- hosts: groupremote_user: roottasks:- name: install httpdyum: name=httpd state=presentwhen: ansible_default_ipv4.address == "192.168.60.110"此示例中利用ansible的內建變量判斷當ip地址相同時則對其安裝httpd。需要注意ansible的部分內建變量存在層級關系,引用時需要注意格式,上方示例中為一種引用方式,下方為另一種子變量的引用方式
- hosts: groupremote_user: roottasks:- name: install httpdyum: name=httpd state=presentwhen: ansible_default_ipv4[ "address" ] == "192.168.60.110"5. 迭代
當有需要重復性的任務時,可以使用迭代機制,其使用格式為將需要迭代的內容定義為item變量引用,并通過with_items語句來指明迭代的元素列表即可,如下方示例
- hosts: groupremote_user: roottasks:- name: create useruser: name={{ item }} state=present groups=wheelwith_items:- guojing- huangrong- name: create user2user: name={{ item.name}} state=present groups={{ item.groups }}with_items:- { name: 'yangguo', groups: 'wheel' }- { name: 'xiaolongnv', groups: 'root' }此示例中展示了兩種列表迭代方式完成用戶創建
6. 模板
如果需要為不同的主機提供不同的配置文件,就需要用到模板模塊,示例如下
(1)首先在主機清單文件中為不同的主機設置不同的主機變量vim /etc/ansible/hosts [group] 192.168.60.110 http_port=80 192.168.60.120 http_port=8080(2)接著在準備的配置文件中將對應的值修改為變量名稱,以httpd配置文件為例,修改其中的監聽端口及服務器名稱 vim /etc/ansible/templates/httpd.conf Listen {{ http_port }} ServerName {{ ansible_fqdn }}(3) 最后在playbook中調用template模塊,這樣template模塊會自動掃描文件中的變量,替換為主機清單中的變量值后復制至各個主機 - hosts: groupremote_user: roottasks:- name: install httpdyum: name=httpd state=present- name: copy conftemplate: src=/tmp/httpd.conf dest=/etc/httpd/conf/httpd.conf模板中還可以實現算數運算
- {{ A + B }}:加法,如果兩者是字符串則會變成字符串拼接
- {{ A - B }}:減法
- {{ A / B }}:除法,返回值是一個浮點數。如{{ 1 / 2 }}結果為0.5
- {{ A // B }}:除法,返回值是一個整數。如{{ 13 // 7 }}結果為1
- {{ A % B }}:取模運算
- {{ A * B }}:乘法,但如果想將一個字符串重復多次也可以使用{{ 'A' *10 }},則會替換為10個字符A
- {{ A ** B }}:乘方運算
7. 標簽
多次運行同一個playbook的時候,如果不需要將全部任務都執行一次,僅希望部分任務運行,即需用到tags模塊
- hosts: groupremote_user: roottasks:- name: install httpdyum: name=httpd state=present- name: copy conftemplate: src=/tmp/httpd.conf dest=/etc/httpd/conf/httpd.conftags:- conf定義好tags,在運行此playbook時需使用命令]# ansible-playbook httpd2.yaml --tags="conf",這樣就可以保證僅復制文件的task運行而不運行安裝httpd
8. 其他
如果有些操作執行時出錯,但最終結果又能滿足我們的意愿,可手動指定退出狀態碼
shell: /usr/bin/command || /bin/true
如果某個任務失敗了,還想繼續后續的操作可使用
innore_errors:True
六、Roles
roles通過分別將變量、文件、任務、模塊及處理器放置于單獨的目錄中,實現不同的主機可以通過include指令來引用它們的一種機制,一般用于主機構建服務或守護進程的場景中。使用roles必須嚴格創建目錄層次結構,接著ansible會自動裝載變量文件、tasks以及handlers等
1. Roles層級結構
- 需要在roles目錄中,分別創建以各角色名稱命名的目錄,如web、db,此處為webserver
- 在每個角色目錄下分別創建以模塊命名的目錄
2. 文件內容及功用
- tasks/:每個需要完成的任務都需要在此目錄中進行定義,至少應包含一個名為main.yml的文件
- handlers:如果定義的觸發器,則需要在此目錄中進行定義,至少包含一個main.yml
- templates:此目錄定義模板文件
- vars:此目錄中定義變量
- files:使用file模塊或copy模塊時,默認的文件搜索路徑
- roles/:此目錄為ansible的工作目錄,如果想更改的話可以在ansible的主配文件中進行修改。
- meta:至少包含一個main.yml文件,用于此角色的特殊設定及其依賴關系
- default:當前角色設定默認變量時,使用此目錄,至少包含一個main.yml文件
總結
- 上一篇: jeecg设置mysql数据库_JEEC
- 下一篇: 十分钟万台服务器部署能力,探秘阿里双十一