Linux ansible 服務
Ansible:
運維工具的分類:
agent:基于專用的agent程序完成管理功能,puppet, func, zabbix, …
agentless:基于ssh服務完成管理,ansible, fabric, …
使用agentless基于ssh服務管理時,最好使用ssh密鑰對進行認證連接。
ansible架構:
Ansible Core:ansible主架構;
Modules:模塊;
Core Modules:核心(標準模塊)
Customed Modules:自定義模塊
Host Iventory:主機清單(要管理的主機);
Files:通過文件加載要管理的主機
CMDB:通過外部設備進行管理主機
PlayBooks:劇本;
Hosts:
roles:定義要完成的任務功能
Connection Plugins:連接插件,連接至各被管控的主機,完成并發連接,ansible默認一次管控5臺主機;
ansible特性:
模塊化:調用特定的模塊,完成特定的任務;
基于Python語言研發,由Paramiko, PyYAML和Jinja2三個核心庫實現;
部署簡單:agentless基于ssh服務完成管理;
支持自定義模塊,使用任意編程語言;
強大的playbook機制;
冪等性;
安裝及程序環境:
程序:
ansible
ansible-playbook
ansible-doc
配置文件:
/etc/ansible/ansible.cfg
主機清單:
/etc/ansible/hosts
插件目錄:
/usr/share/ansible_plugins/
ansible管理獲取模塊:
獲取模塊列表:ansible-doc -l
獲取模塊列表幫助:ansible-doc -h
獲取指定模塊的使用幫助:ansible-doc -s MOD_NAME
基本使用入門:
ansible命令格式:
Usage: ansible <host-pattern> [options]
常用選項:
-m MOD_NAME -a MOD_ARGS
配置Host Inventory:
/etc/ansible/hosts
[group_id]:配置主機清單組;
HOST_PATTERN1
HOST_PATTERN2
示例:
在ansible主機清單中定義服務組:
ansible常用模塊:
ping:探測目標主機是否存活;
示例:
command模塊:在遠程主機執行命令;
shell模塊:在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等 ;
注意:command和shell模塊的核心參數直接為命令本身;而其它模塊的參數通常為“key=value”格式;
示例:
在遠端主機執行hostname命令:
示例:
在遠程各個主機上創建分別創建centos用戶:
為在各個遠程主機上創建的centos用戶設置密碼:
copy模塊:拷貝文件到遠端主機上:
用法:
(1) 復制文件
-a "src= dest= "
(2) 給定內容生成文件
-a "content= dest= "
content:直接給定內容;
mode:設置權限;
其它參數:mode, owner, group, …
示例:
拷貝content=remote 到各個遠程被控主機websrvs組的/tmp/remote.ansible;
websrvs組中的主機:192.168.3.2 192.168.3.8
驗證:copy到websrvs組主機其中192.168.3.2中的內容:
file模塊:設置文件屬性
用法:
state:定義文件目標狀態;
absent:刪除指定的文件;
director:創建目錄;
link:定義鏈接文件;
(1) 創建目錄:
-a "path= state=directory"
(2) 創建鏈接文件:
-a "path= src= state=link"
(3) 刪除文件:
-a "path= state=absent“
absent:缺席的;在此意為:刪除;
示例:
在遠端主機上創建目錄:
在遠端主機上刪除創建的目錄:
在遠端主機上創建鏈接文件:
驗證遠端主機上的link文件:
fetch模塊:從遠程某一臺主機拉取文件;
例
cron模塊:管理周期性任務計劃
-a ""
minute=
hour=
day=
month=
weekday=
job=
name=
user=
state={present|absent}
示例:
使用ansible給各遠程主機設置周期性計劃任務:
刪除各遠程主機上的周期性計劃任務可以使用 state=absent:
hostname模塊:管理遠端主機的主機名
name=
示例:
為遠端主機192.168.3.2主機設置hostname主機名:
去遠端主機192.168.3.2主機上驗證主機名是否設置成功:
yum模塊:管理遠程主機使用yum模塊安裝程序包:
注意:在遠端主機上需先配置好yum倉庫;
-a ""
(1) name= 安裝所指定的服務程序包。
state={present|latest} 默認為:present;
state=absent 刪除指定的程序包。
conf_file
disable_gpg_check
disablerepo
list
name=
state
update_cache
示例:
使用ansible的yum模塊為遠端主機安裝最新版的httpd服務:
service模塊:管理遠端主機服務`started'/`stopped' `restarted'
-a ""
name=
state=
started
stopped
restarted
enabled= 定義遠端主機開機是否自啟動;
runlevel= 定義遠端主機在那些運行級別下可以開機自啟動;
示例:
使用ansible控制遠程主機httpd服務啟動,并設置為開機自啟動:
group模塊:在遠程主機上添加/刪除組:
-a ""
name=
state=
system=
gid=
示例:
使用ansible為各遠程主機創建test組:
使用ansible刪除各遠程主機上的test組:
user模塊:在遠端主機上創建/刪除用戶:
-a ""
name= 指定要創建的用戶名
group= 指定基本組
groups= 指定附加組
comment= 備注
uid= 指定uid號
system= 指定為系統用戶
shell= 指定新建用戶使用的shell
expires= 指定過期時長
home= 指定家目錄
示例:
使用ansible為各個遠端主機創建一個用戶haha:
使用ansible刪除各個遠端主機上的用戶haha:
setup模塊:從指定的遠端主機上獲取遠端主機詳細的配置參數:
示例:
從遠端主機192.168.3.2上獲取詳細的配置參數:
YAML:YAML是一個人類易讀的數據序列化格式設計的腳本語言。
YAML is a data serialization format designed for human readability and interaction with scripting languages.
數據結構:
key:value
– item1
– item2
– item3
{name:jerry, age:21}
ansible-playbook:
核心元素:
Tasks:任務,由模塊定義的操作的列表;
Variables:變量
Templates:模板,即使用了模板語法的文本文件;
Handlers:由特定條件觸發的Tasks;
Roles:角色;
playbook的基礎組件:
Hosts:運行指定任務的目標主機;
remote_user:在遠程主機以哪個用戶身份執行;
sudo_user:非管理員需要擁有sudo權限;
tasks:任務列表
模塊,模塊參數:
格式:
(1) action: module arguments
(2) module: arguments
ansible-playbook:用法
Usage: ansible-playbook [options] playbook.yml
options:
-C, –check:測試playbook任務,但不真正的執行;
–list-hosts:列出playbook任務影響到的主機;
–list-tasks:列出playbook要執行的任務;
運行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 指明要從哪個任務標簽開始運行
示例:
定義一個playbook,創建用戶和組及安裝htpd服務并啟動:
檢查playbook user.yaml劇本語法:
為遠端主機192.168.3.7安裝httpd服務,復制配置文件并啟動服務:
注:提供的配置文件監聽的端口為:8080
handlers:由特定條件觸發的Tasks;
調用及定義方式:
tasks:
– name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
– name: HANDLER_NAME
module: arguments
示例:
在復制一份httpd服務監聽80端口的主配置文件到遠端主機192.168.3.2上,然后使其觸發handlers:
或執行reload服務:
測試:
測試:
tags:給指定的任務定義一個調用標識;
– name: NAME
module: arguments
tags: TAG_ID
多個任務可以使用同一個標簽;
執行時也可以一次調用多個任務;
示例:
指明要在遠端主機上要執行的任務標簽:
Variables:
類型:
內建:
(1) facts
自定義:
(1) 命令行傳遞;
-e VAR=VALUE
(2) 在hosts Inventory中為每個主機定義專用變量值;
(a) 向不同的主機傳遞不同的變量 ;
IP/HOSTNAME variable_name=value
(b) 向組內的所有主機傳遞相同的變量 ;
[groupname:vars]
variable_name=value
(3) 在playbook中定義
vars:
– var_name: value
– var_name: value
注意:variables變量在host inventory和 playbook中都可以定義。
(4) Inventory還可以使用參數:
用于定義ansible遠程連接目標主機時使用的屬性,而非傳遞給playbook的變量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
…
(5) 在角色調用時傳遞參數
roles:
– { role: ROLE_NAME, var: value, …}
示例:
變量調用:
{{ var_name }}
示例:
在playbook中定義變量名安裝vsftpd服務:
這時我們可以使用命令行給playbook中的pkgname變量傳遞變量值,讓其在遠端主機上安裝vsftpd服務:
注意:命令行 -e 選項給定的變量名變量值要比playbook中給定的變量名變量值要優先使用。
我們也可以在playbook中定義變量名和變量名來安裝vsftpd服務:
示例:
在hosts Inventory中為每個主機定義專用變量值:
或者向組內的所有主機傳遞相同的變量 ;
在playbook中定義任務:
Templates:模板
文本文件,內部嵌套有模板語言腳本(使用模板語言編寫)
注意:此模板不能在命令行使用,而只能用于playbook;
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.
語法:
字面量:
字符串:使用單引號或雙引號;
數字:整數、浮點數;
列表:[item1, item2, …]
元組:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布爾型:true/false
算術運算
+, -, *, /, //, %, **
比較操作:
==, !=, >, <, >=, <=
邏輯運算:and, or, not
執行模板文件中的腳本,并生成結果數據流,需要使用template模塊;
template:
-a ”“
src=
dest=
mode=
onwer=
group=
示例:
使用template模板為websrvs組的遠端主機安裝配置nginx服務:
1)拷貝本機ansible上的nginx.conf的主配置文件到/root目錄下并制定后綴名為j2:
2)編輯/root/nginx.conf.j2 文件,使nginx的worker_processes進程調用ansible的cpu個數內鍵變量來生成worker進程數:
3)編輯ansible的host inventory配置文件 :
4)編輯playbook
注意:此playbook需要在遠端主機上的/root目錄下先準備好rpm格式的軟件包。如果沒有可以使用wget下載。
測試:
when條件測試:
when語句:在tasks中使用,Jinja2的語法格式;
示例:
條件測試centos6、centos7 nginx服務啟動:
編寫playbook:
循環:迭代,需要重復執行的任務;
對迭代項的引用,固定變量名為"item”,使用with_items屬性給定要迭代的元素;
元素:列表
字符串
字典
示例:
基于字符串列表給出元素,安裝服務:
示例:
基于字典列表給出元素,創建用戶和組:
刪除用戶和組:
roles角色:
以特定的層級目錄結構進行組織的tasks、vars、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 }
實驗測試nginx使用角色調用:
在/etc/ansible/roles目錄下創建特定的目錄角色(roles):
拷貝nginx安裝包到/etc/ansible/nginx/file/目錄下:
拷貝ansible本機nginx的主配置模板和默認配置模板到/etc/ansible/roles/nginx/templates/目錄下并添加后綴名為XXXX.j2
更改nginx模板的主配置文件
更改nginx的模板默認配置文件:
編輯/etc/ansible/roles/nginx/tasks/main.yml文件:
在tasks任務中定義了,拷貝nginx安裝包到遠程主機、定義了在遠程主機上安裝nginx程序包、定義了拷貝ansible主機上的nginx主配置文件和默認配置文件的template模板文件到遠程主機上、定義了在遠程主機上啟動nginx服務并開機自啟動。
編輯/etc/ansible/roles/nginx/handlers/main.yml文件:
編輯/etc/ansible/roles/nginx/vars/main.yml
在playbook中調用nginx角色:
測試/etc/ansible/nginx.yml語法:
測試:
在playbook中使用字典調用nginx角色:
原創文章,作者:zhengyibo,如若轉載,請注明出處:http://www.www58058.com/60052