Ansible基礎模塊和功能
自動化運維工具
運維發展歷程:手動 --> 標准化 --> 工具化 --> 自動化 --> 智能化
自動化系統安裝工具:bare metal:pxe、cobbler
批量Configuration配置工具:puppet (ruby)、saltstack (python)、chef、cfengine等
批量Command and Control工具:fabric、func
自動化批量運維流程:在調度器上下線一批主機(標記為維護模式)--> 關閉服務 --> 部署新版本 --> 啟動服務 --> 在調度器上啟用這一批主機;
ansible:可實現批量Configuration、Command and Control部署和管理的自動化運維工具
運維工個的分類:(根據客戶端和調度器端是否都要配置該工具)
- agent:puppet, func, ...
- agentless(ssh,):ansible, fabric
Ansible基本配置和架構
Ansible特性:
- 模塊化:調用特定的模塊,完成特定任務;
- 基於Python語言實現,由Paramiko, PyYAML和Jinja2三個關鍵模塊;
- 部署簡單:agentless;
- 支持自定義模塊;
- 支持playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。;
-
連接插件connection plugins:負責和被監控端實現通信;
-
host inventory:指定操作的主機,是一個配置文件里面定義監控的主機;
-
各種模塊核心模塊、command模塊、自定義模塊;借助於插件完成記錄日志郵件等功能;
- 冪等性;
ansible安裝:epel源, ansible包
配置文件:/etc/ansible/ansible.cfg
主機清單:/etc/ansible/hosts
主程序:
- ansible
- ansible-playbook
- ansible-doc
ansible的簡單使用格式:
ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS -f FORKS -C -u USERNAME -c CONNECTION
其中HOST-PATTERN主機匹配可用all(全部),IP地址匹配或hosts組匹配等
FORKS 指每次批量執行主機數量,默認5
ansible的常用模塊
獲取主機列表:ansible all --list-host(s)
主機狀態檢查:ansible 主機匹配 -m ping (狀態正常為綠色,否則為紅色)
獲取模塊列表:ansible-doc -l
獲取某模塊使用選項和用法:ansible-doc -s module
command模塊:在遠程主機運行命令;
例:chdir 執行命令前切換某個目錄
creates
removes與creates相反,存在則執行,刪除,不存在則不執行
shell模塊:在遠程主機在shell進程下運行命令,支持shell特性,如管道等,command不支持管道等操作;例如下:
excutable=PATH 可指定運行命令時的shell類型
shell模塊很多與command相似。
group模塊 管理組賬號
例:system默認為no,state有present與absent(缺席)兩種狀態。黃色表示發生改變
user模塊:管理用戶賬號,可用選項很多,常用選項如下:
- *name=
- system=
- uid=
- shell=
- group=
- groups=
- comment=
- home=
- generate_ssh_key
- generate_ssh_key
copy模塊: Copies files to remote locations.
用法:
(1) src= dest=
(2) content= dest= (直接生成文件內容)
owner, group, mode
file模塊: Sets attributes of files只能創建文件,不能像copy那樣生成文件內容
用法:
(1) 創建鏈接文件:*path= src= state=link
(2) 修改屬性:path= owner= mode= group=
(3) 創建目錄:path= state=directory
state狀態值:file、directory、link、hard、touch、touch、absent
fetch模塊:Fetches a file from remote nodes
get_url模塊:Downloads files from HTTP, HTTPS, or FTP to node
cron 模塊:Manage cron.d and crontab entries.
- minute=
- day=
- month=
- weekday=
- hour=
- *job=
- *name=
- state= present or absent
hostname模塊:Manage hostname
name=
pip模塊:Manages Python library dependencies.
yum模塊:Manages packages with the `yum' package manager
- name=:程序包名稱,可以帶版本號;
- state= present, latest,installed(安裝)、absent,removed(卸載)
其他包管理工具apt(debian)、zypper(suse)、dnf(fedora)、prm、apk等
service模塊:管理服務
- *name=
- state=started、stopped、restarted
- enabled=
- runlevel=
git模塊:Deploy(部署) software (or files) from git checkouts
- repo=
- dest=
- version=
setup模塊:獲取各主機facts的各個變量、網絡配置、硬件信息等 ansible HOST -m setup ,如:
Ansible自動化運維進階
Playbook命令文件和使用方法
Playbook:YAML(可讀性高,用來表達數據序列的格式)格式,任務(task)
可以用YAML腳本批量執行計划好的命令,從而實現運維自動化,避免重復運維配置等工作
基本數據結構:標量、數組、關聯數組
Playbook的核心元素:
- Hosts:主機
- Tasks:任務列表
- Variables
- Templates:包含了模板語法的文本文件;
- Handlers:由特定條件觸發的任務;
Roles(非核心)
playbook的基礎組件:
- Hosts:運行指定任務的目標主機;
remoute_user: 在遠程主機上執行任務的用戶;
sudo_user:
- tasks:任務列表
模塊,模塊參數;
格式:(1) action: module arguments
(2) module: arguments
注意:shell和command模塊后面直接跟命令,而非key=value類的參數列表;
(1) 某任務的狀態在運行后為changed時,可通過“notify”通知給相應的handlers;
(2) 任務可以通過tags打標簽,而后可在ansible-playbook后使用-t進行調用,且多個任務可使用同一個標簽,一個任務也可用多個標簽;
playbook的使用方法:
(1) 測試
- ansible-playbook --check 或 -C file.yml 只檢測可能會發生的改變,但不真正執行操作;
- ansible-playbook --list-hosts file.yaml 查看任務主機
- ansible-playbook --list-tasks file.yaml 查看所有任務
- ansible-playbook --syntax-check file.yml 檢查配置文件語法是否有錯
(2) 運行 ansible-playbook file.yaml
簡單示例:
handlers:任務,在特定條件下觸發;接收到其它任務的通知時被觸發;
notify: HANDLER TASK NAME

- hosts: webservers remote_user: root tasks: - name: install nginx yum: name=nginx state=latest - name: start nginx service : name=nginx enabled=true state=started - hosts: webservers remote_user: root tasks: - name: install redis yum : name=redis state=latest - name: connfig redis copy: src=/date/redis.conf dest=/etc/redis.conf owner=redis group=root tags: confredis notify: restartredis - name: start redis service : name=redis state=started tags: startredis handlers: - name: restartredis service : name=redis state=restartes
variables:
(1) facts:可直接調用;
注意:可使用setup模塊直接獲取目標主機的facters;
(2) 用戶自定義變量:
- (a) ansible-playbook命令的命令行中的 -e VARS(如,“packname=tree”), --extra-vars=VARS
- (b) 在playbook中定義變量的方法:
vars:
- var1: value1
- var2: value2
變量引用:{{ variable }}
(3) 通過roles傳遞變量;
(4) Host Inventory
(a) 用戶自定義變量
(i) 向不同的主機傳遞不同的變量;IP/HOSTNAME varaiable=value var2=value2
(ii) 向組中的主機傳遞相同的變量;[groupname:vars] variable=value,直接在/etc/ansible/hosts的主機下定義組變量
(b) invertory參數:用於定義ansible遠程連接目標主機時使用的參數,而非傳遞給playbook的變量,在ansible的hosts組的主機后定義;
- ansible_ssh_host =
- ansible_ssh_port =
- ansible_ssh_user =
- ansible_ssh_pass =
- ansbile_sudo_pass =
template模塊:基於模板方式生成一個文件復制到遠程主機
- *src=
- *dest=
- owner=
- group=
- mode=
模板:templates為文本文件,嵌套有腳本(使用模板編程語言Jinja2編寫)
示例: (用ansible-playbook調用此文件,ansible不能直接用templates調用)
- hosts: websrvs remote_user: root tasks: - name: install nginx yum: name=nginx state=present - name: install conf file template: src=files/nginx.conf.jj2 dest=/etc/nginx/nginx.conf notify: restart nginx tags: instconf - name: start nginx service service: name=nginx state=started handlers: - name: restart nginx service: name=nginx state=restarted
模板配置文件 :nginx.conf.jj2
worker_processes {{ ansible_processor_vcpus }}; listen {{ http_port }};
條件測試:復雜環境的批量判斷操作
when語句:在task中使用,jinja2的語法格式
tasks: - name: install conf file to centos7 template: src=files/nginx.conf.c7.jj2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == "7" - name: install conf file to centos6 template: src=files/nginx.conf.c6.jj2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == "6"
循環:迭代,需要重復執行的任務;
對迭代項的引用,固定變量名為”item“,而后,要在task中使用with_items給定要迭代的元素列表;例:
- name: install some packages yum: name={{ item }} state=latest with_items: - nginx - memcached - php-fpm
- name: add some groups group: name={{ item }} state=present with_items: - group11 - group12 - group13
- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: 'user11', group: 'group11' }
- { name: 'user12', group: 'group12' }
- { name: 'user13', group: 'group13' }
就是利用item和with_items相當與一個數組,一次完成多個重復的、屬性相同指令,加版本號的方法也類似,如下:

- hosts: webserves remote_user: root vars: - jdk_version: 1.8.0 tasks: - name : install { { item } } package yum : name= {{ item }} state =installed with_items: - nginx - java-{ { jdk_version }}-openjdk - tomcat - tomcat-webapps - tomcat-docs_webapp - tomcat-admin-webapps - name : config tomcat copy : src ={{ item.file }} dest={{ item.conf }} with_items: - { file: '/data/tomcat-users.xml', conf: '/etc/tomcat-user.xml' } - { file: '/data/server.xml', conf: '/etc/server.xml' }
角色(roles):分類組織調用各個應用各個模塊
角色集合:/etc/ansible/roles/下可有多個按應用分類的角色,如:
- mysql/
- httpd/
- nginx/
- memcached/
每個角色,以特定的層級目錄結構進行組織:如 mysql/下
- files/ :存放由copy或script模塊等調用的文件;
- templates/:template模塊查找所需要模板文件的目錄;
- tasks/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
- handlers/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
- vars/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
- meta/:至少應該包含一個名為main.yml的文件,定義當前角色的特殊設定及其依賴關系;其它的文件需要在此文件中通過include進行包含;
- default/:設定默認變量時使用此目錄中的main.yml文件;
在playbook調用角色方法1:
- hosts: webservers
remote_user: root
roles:
- mysql
- memcached
- nginx
在playbook調用角色方法2:傳遞變量給角色
- hosts:
remote_user:
roles:
- { role: nginx, username: nginx等變量 }
鍵role用於指定角色名稱;后續的k/v用於傳遞變量給角色;
還可以基於條件測試實現角色調用;
roles:
- { role: nginx, when: "ansible_distribution_major_version == '7' " }
關於更多ansible的介紹和查看ansible官網:http://www.ansible.com.cn