為什么要學習ansible:
ansible是自動化運維的一種工具,使用ansible可以一次性管理多臺主機,為多臺主機安裝或這執行相同或者不同的操作,省去了一臺臺主機去重復執行相同的任務,可以使用corn選項結合本機的crontab設置本主機的任務性計劃,比如,每天導出nginx的access.log和error.log到指定的主機,我們分析相應的日志,而達到監控整個網絡架構的目的。
下圖是ansible和所有軟件,操作系統之間的關系:
1.ansible的框架:
Ansible Core:ansible的主要核心
Modules:模塊
Core Modules:內核模塊
Customed Modules:相關的模塊
Host Iventory
Files
CMDB
PlayBooks
Hosts <–> roles
Connection Plugins
2.特性:
高度模塊化:調用特定的模塊,完成特定的任務;
基于Python語言開發,由Paramiko,PyYAML和jinja2三個核心庫實現;
部署簡單:agentless;
支持自定義模塊,使用任意編程語言;
強大的playbook機制;
冪等性;
3.安裝和使用:ansible(epel源)
安裝:yum -y install ansible
程序環境:
ansible
ansible-playbook
ansible-doc
配置文件:
/etc/ansible/ansible.cfg
主機清單:
/etc/ansible/hosts
插件目錄:
/usr/share/ansible_plugins/
安裝和基本部署ansible服務:(包括遠程主機的簡單配置)
配置epel源
yum -y install ansible
ssh-keygen -t rsa -P ''
vim /etc/ansible/hosts
[web_server]
192.168.1.147
[db_server]
192.168.1.148
ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.147
ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.148
簡單測試:
ansible all -a 'who'
4.基本使用入門:
ansible命令:
Usage: ansible <host-pattern> [options]
常用選項:
-m MOD_NAME -a MOD_ARGS
配置Host Inventory
/etc/ansible/hosts
[group_id]
HOST_PATTERN1
HOAT_PATTERN2
模塊:
獲取模塊列表:ansible-doc -l
獲取指定模塊的使用幫助:ansible-doc -s MOD_NAME
常用模塊:
ping:探測目標主機是否存活;
command:在遠程主機執行命令;(不會理解管道操作)
ansible all -m command -a "useradd centos"
shell: 在遠程主機上調用shell解釋器運行命令,支持shell命令的各種功能,例如管道;
注意:command和shell模塊的核心參數直接作為命令本身;而其他模塊的參數通常為"key=value"格式;
copy:復制文件到遠程主機;(mode,owner,group,…)
用法:
(1)復制文件:-a "src= dest= "
eg:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
(2)給定內容生成文件:-a "content= dest= "
eg:ansible all -m copy -a "content='hello\nworld' dest=/tmp/test.ansible mode=640"
file:設置文件屬性;
用法:
(1)創建目錄:-a "path= state=directory"
(2)創建鏈接文件: -a "path= src= state=link"
(3)刪除文件:-a "path= state=absent"
eg:
ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
ansible all -m file -a "path=/tmp/fstab.ansible.link src=/tmp/test.ansible state=link" 為遠程主機上的/tmp/fstab.ansible設置本地的軟連接
fetch:從遠程主機上拉取文件到本地;(從遠程一臺主機上面獲取)
cron:管理日常計劃任務
-a "" (minute,hour,day,month,weekday,job,name,user,state={present|absent})
hostname:設置主機名;name=
yum:使用yum包管理器,完成包管理
-a "" name= state={present|latest} / name= state=absent
service:服務管理;
-a "" name enable runlevel state={started|stopped|restarted}
group:組管理,添加或移除組;
-a "" name state system gid
user:用戶管理,管理用戶的事項;
-a "" name group groups comment uid system shell expires home
setup:從遠程主機上面,收集關于遠程主機的信息;
5.YAML:YAML是數據序列化格式設計的可讀性與腳本語言與互動。
數據結構:key:value
– item1
– item2
– item3
eg:{name:jerry,age:21}
6.PlayBook:
核心元素:
Tasks:任務,由模塊定義的操作的列表;
Variables:變量
Templates:模板,即使用了模板語法的文本文件;
Handlers:由特定條件出發的Tasks;
Roles:角色;
playbook的基礎組件:
Hosts:運行指定任務的目標主機;
remote_user:在遠程主機以哪個用于身份執行;
sudo_user:非管理員需要用于sudo權限;
tasks:任務列表
模塊,模塊參數:
格式:
(1)action:module arguments
(2)module:aeguments
7.運行playbook,使用ansible-playbook命令:
(1)檢測語法:
ansible-playbook –syntax-check /path/to/playbook.yaml
(2)測試運行
ansible-playbook -C /path/to/playbook.yaml
–list-hosts:指明測試運行的主機
–list-tasks:指明要測試運行的任務
–list-tags:指明要測試運行的標簽
(3)運行:
ansible-playbook /path/to/playbook.yaml
-t TAGS,–tags=TAGS:指明運行指定標簽的任務
–skip-tags=SKIP_TAGS:指明運行忽略指定標簽的任務
–start-at-task=START_AT
8.Playbook核心元素詳解:
(1)handlers:由特定條件觸發的Tasks;
調用以及定義方式:
tasks:
– name:TASK_NAME
module:arguments
notify:HANDLER_NAME
handlers:
– name:HANDLER_NAME
module:arguments
(2)tags:給指定的任務定義一個調用標識;
– name:NAME
module:arguments
tags:TAG_ID
(3)Variables:變量
類型:
內建變量:facts
自定義變量:
a.命令行傳遞:
-e VAR=VALUE
b.在hosts Inventory中為每個主機定義專用變量值:
①向不同的主機傳遞不同的變量;
IP/HOSTNAME variable_name=value
②向組內的所有主機傳遞相同的變量;
[groupname:vars]
variable_name=value
c.在playbook中定義:
vars:
– var_name:value
– var_name:value
d.Inventory還可以使用參數:
用于定義ansible遠程連接目標主機時使用的屬性,而非傳遞給playbook變量:
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
…
e.在角色調用時傳遞:
roles:
– { roles: ROLE_NAME,var: value,….}
變量的調用:
{{ var_name }}
(4)Templates:模板:文本文件,內部嵌套有模板語言腳本(使用模板語言編寫)
Jinja2 is a template engine written in pure Python. It provides a Django inspired non-XML syntax but supports inline expressions and an optional sandboxed environment.
jinja2是模板引擎用純Python。它提供了一個Django啟發非XML語法但支持內聯表達式和一個可選的沙箱環境。
語法:
字面量:
字符串:使用單引號或雙引號;
數字:整數、浮點數;
列表:[item1, item2, …]
元組:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布爾型:true/false
運算類:
算術運算:+, -, *, /, //, %, **
比較操作:==, !=, >, <, >=, <=
邏輯運算:and, or, not
執行模板文件中的腳本,并生成結果數據流,需要使用template模塊;
template:
-a "" (src dest mode owner group)
注意:此模板不能在命令行使用,而只能用于playbook;
條件測試:
when語句:在tasks中使用,Jinja2的語法格式;
循環:迭代,需要重復執行的任務;
對迭代項的引用,固定變量名為"item”,使用with_item屬性給定要迭代的元素;
元素:列表(字符串 字典)
基于字符串列表給出元素示例:
– hosts: websrvs
remote_user: root
tasks:
– name: install packages
yum: name={{ item }} state=latest
with_items:
– httpd
– php
– php-mysql
– php-mbstring
– php-gd
基于字典列表給元素示例:
– hosts: all
remote_user: root
tasks:
– name: create groups
group: name={{ item }} state=present
with_items:
– groupx1
– groupx2
– groupx3
– name: create users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
– {name: 'userx1', group: 'groupx1'}
– {name: 'userx2', group: 'groupx2'}
– {name: 'userx3', group: 'groupx3'}
(5)roles:角色
以特定的層級目錄結構進行組織的tasks、variables、handlers、templates、files等;
role_name/
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的文件,用于設定默認變量;
在playbook中調用角色的方法:
– hosts: HOSTS
remote_user: USERNAME
roles:
– ROLE1
– ROLE2
– { role: ROLE3, VARIABLE: VALUE, …}
– { role: ROLE4, when: CONDITION }
原創文章,作者:sjsir,如若轉載,請注明出處:http://www.www58058.com/57130