一. 架構: 組成
ansible core:
modules:
Core Module
Custom Module
Host Inventory: 主機清單
File
CMDB
Playbooks : 定義對每個主機的操作任務, 定義了host和role的對應關系
hosts:
roles: 任務
Connection plugin: 連接插件
二. 特性
模塊化: 調用特定的模塊, 完成特定的任務;
基于Python語言研發, 由paramiko,pyYAML和jinja2三個核心庫實現;
部署簡單: agentless, 無代理;
支持自定義模塊, 使用任意編程語言;
強大的playbook機制;
冪等性: 多次執行同一命令, 結果相同;
三. 安裝及程序環境
ansible: 主程序
ansible-playbook: 執行腳本文件程序
ansible-doc: 獲取幫助文檔
配置文件:
/etc/ansible/ansible.cfg
主機清單:
/etc/ansible/hosts
插件目錄:
/usr/share/ansible_plugins/: 連接插件
ansible命令:
ansible命令是以ssh通信連接的, 前提要在主機之間建立ssh公鑰認證;
ssh-keygen -t rsa -P '' #生成公鑰; ssh-copy-id -i .ssh/id_rsa.pub root@NODE #將公鑰發送給客戶端;
為了手動完成管理功能
前提: 配置/etc/ansible/hosts
[GROUP_NAME] HOST_IP_1 HOST_IP_2 ...
基本語法:
ansible <host-pattern> [options]
host-pattern : 需要管理的主機
options:
-m MOD_NAME : 指明調用的模塊;
-a MODULE_ARGS: 指明模塊參數;
基本格式:
ansible GRP_NAME -m MOD_NAME -a MOD_ARGS "ARGS"
ansible 模塊:
ansible-doc [options] [module…]
-l, –list: 獲取模塊列表
-s MOD_NAME: 獲取模塊的簡單用法
四. 常用模塊
1. ping : 嘗試連接主機, 驗證一個可用的python并且成功返回"pong";
ansible GRP_NAME -m ping
2. command : 在遠程節點上執行命令;
示例:
ansible websrv -m command -a "ifconfig"
注意: command模塊不能接受管道等符號, 若需要使用, 需要調用shell模塊;
3. shell : 在節點上啟動腳本執行命令, 支持shell的高級功能;
注意: command和shell模塊的核心參數直接為命令本身, 而其它模塊的參數通常為"key=value"格式;
示例:
ansible websrv -m command -a "useradd centos" ansible websrc -m shell -a "echo 'magedu' | passwd --stdin centos"
4. copy : 復制ansible上的文件到遠程主機上;
參數:
content: 直接給定內容, 保存在遠程主機上;
src= : 要復制到遠程服務器的文件的本地路徑, 可以是相對路徑, 也可以是絕對路徑. 所以, 在一般使用中, 會將需要的各種文件, 放置到同一的ansible的目錄下進行存放, 方便以后的命令的整體移動使用;
dest= : 指明遠程路徑, 必須為目錄;
mode : 指明目標文件的權限;
group : 指明目標文件的屬組;
owner : 指明目標文件的屬主;
示例:
ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600" ansible all -m copy -a "content='hello\nworld\n' dest=/tmp/fstab mode=640"
5. file : 設置文件的屬性;
參數:
group : 設置文件的屬組;
owner : 設置文件的屬主;
path= : 指明要修改哪個文件的屬性;
state : 定義目標文件屬性; 如果是directory, 不存在, 將被創建; 如果是file, 不存在, 不會創建, 請使用copy或template模塊; 如果是link, 將創建或更改符號鏈接; 硬鏈接使用hard; state默認為present;
示例:
ansible all -m file -a "path=/tmp/fstab.ans owner=centos" #修改文件屬主 ansible all -m file -a "path=/tmp/fstab.ans state=absent" #刪除文件, absent表示刪除; ansible all -m file -a "path=/tmp/dir.ansible state=directory" #創建空目錄; ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible state=link" #創建符號鏈接文件, 其中path指明 #要創建的符號鏈接文件路徑, src指明符號鏈接的源文件, state指明創建的為符號鏈接;
6.fetch : 從遠程節點獲取文件, 通常從遠程某一臺主機上獲取文件, 同時從多臺遠程主機獲取文件, 會發生紊亂;
7. cron : 管理cron.d和crontab任務條目;
參數:
name= : crontab條目的描述, 如果設置了env,則為環境變量的名稱. 如果state=absent, 則為必須;
job : 要執行的命令, 或者如果設置了env, 則為環境變量的值; 如果state=present, 則為必須;
state : whether to ensure the job or environment variable is present or absent;
示例:
ansible all -m cron -a "minute='*/5' job='/usr/sbin/ntpdate 10.1.0.1 &> /dev/null name='sync time'" #每5分鐘與服務器同步一次時間; 其中, name必須指定, 不能省略; ansible all -m cron -a "name='sync time' state=absent" #刪除name指定的計劃任務;
crontab -l : 查看本機的計劃任務;
8. hostname :設定主機名稱;
參數:
name= : 指明要設置的主機名稱, 屬于必須給的選項;
9. yum : 使用yum管理軟件包;
參數:
state={present|installed|latest|absent|removed} :
安裝 : present或installed或latest;
刪除 : absent或removed;
disable_gpg_check={true|false} : 安裝過程中禁止gpg密鑰檢查;
disablerepo= : 安裝過程中臨時禁用某個repo;
enablerepo= : 安裝過程中, 臨時啟用某個repositories;
示例:
ansible all -m yum -a "name=httpd" #安裝httpd; ansible all -m yum -a "name=httpd state=absent" #刪除httpd;
10. service : 管理服務;
參數:
name= : 指明要管理的服務;
state={started|stopped|restarted|reloaded} : 指明服務的動作; 'started'/'stopped'是冪等動作,除非必要,否則不會運行命令; 'restarted'將始終退回服務; 'reloaded'將總是重新加載; *至少一個狀態和啟用.
enabled={true|false} : 是否開機自動啟動;
arguments= : 傳遞其他參數;
示例:
chkconfig –list httpd
ansible all -m service -a "name=httpd state=started enable=true" # 啟動httpd服務, 并且開機啟動; systemctl is-enabled *.service #查看服務是否開機啟動;
11. group : 添加或刪除用戶組;
參數:
gid= : 指明組的gid
name= : 指明創建的組名
state={present|absent} : 添加或刪除組;
system=[yes] : 如果指明為yes則創建系統組;
12. user : 管理用戶賬戶;
參數:
name= : 指明要創建的用戶名;
groups= : 指明要添加到的組;
shell= : 指明默認shell;
uid= : 指明id號;
system= : 創建用戶是, 如果為'yes', 則會創建系統用戶;
createhome= : 如果指明為no, 則不創建家目錄;
comment= : 指明用戶的注釋信息;
expires= : 指明用戶的過期時間;
13. setup : 收集遠程主機的系統景況;
當需要用到一些系統的信息的時候, 需要首先收集主機的信息, 將其報告為ansible, 然后才能使用;
示例:
ansible 10.1.52.2 -m setup #此處的IP地址必須是/etc/ansible/hosts中定義了的主機IP地址; 未定義無法獲取;
部分獲取的主機信息參數:
ansible_distribution : 系統的發行版本;
ansible_distribution_major_version : 系統的主版本號;
ansible_hostname : 主機名;
ansible_processor_core : 每顆CPU的核心數;
ansible_processor_count : 共有幾顆CPU;
ansible_processor_vcpus: 虛擬CPU數量;
ansible_processor_threads_per_code : 每個CPU核心的線程數量;
YAML格式的存儲文件 : python常用的模板語言;
yum info PyYAML
序列化格式
數據格式:
鍵值對 key:value
列表 : 有序數組
– item1
– item2
…
字典 : 關聯數組
{name:jerry,age:21}
playbook :
語法結構:
tasks : 任務, 由模塊定義的操作列表;
variables : 變量
templates : 模板, 即使用模板語法的文本文件;
handlers : 由特定條件觸發的task;
roles : 角色;
五. playbook的基礎組件
Hosts : 運行指定任務的目標主機;
remote_user : 在遠程主機上以哪個用戶的身份執行; 建議使用root用戶; 非root賬戶, 要使用sudo_user
tasks : 任務列表;
模塊, 模塊參數
格式:
(1) action:module arguments
(2) module:arguments
1. tasks 基本語法格式 – 如何定義 tasks
示例一:
- name: deploy web server user: foouser sudo: true hosts: all tasks: - name: install apache apt: pkg=apache2-mpm-prefork state=latest (其中apt指明使用的模塊)
示例二:
在hosts中的用戶上創建組, 創建用戶并指定組
首先創建的playbook腳本要以".yaml"結尾
- hosts: all remote_user: root tasks: - name: install a group group: name=mygrp system=true - name: install a user user: name=user1 group=mygrp system=true - hosts: remote_user: root tasks: - name: install httpd yum: name=httpd - name: start httpd.service service: name=httpd state=started
ansible-playbook命令 – 運行.yml或.yaml腳本
語法:
ansible-playbook [options] PLAYBOOK.yml
options:
-C, –check: 測試模式, 不做任何更改, 而是嘗試運行, 進行檢查;
–list-hosts: 輸出匹配的主機列表, 不執行其他操作;
–list-tags : 列出所有可用的標簽
–list-tasks: 列出所有將要執行的任務;
-t TAGS, –tags=TAGS : 只運行tags標識的任務
–skip-tags=SKIP-TAGS : 只運行tags沒有標記的任務;
–syntax-check: 對劇本執行語法檢查, 但是不執行;
示例三:
要求: 在遠程主機上安裝httpd服務, 并且能夠監聽8080端口.
方法:
(1) 安裝httpd;
(2) 提供配置文件;
(3) 啟動httpd服務;
playbook文件
- hosts: dbsrv remote_user: root tasks: - name: install httpd yum: name=httpd state=latest - name: install conf file copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf - name: start httpd.service service: name=httpd state=started
2. handlers :
playbook文件 :
- hosts: dbsrv remote_user: root tasks: - name: install httpd yum: name=httpd state=latest - name: install conf file copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: restart httpd service - name: start httpd.service service: name=httpd state=started handlers: - name: restart httpd service service: name=httpd state=restarted
handlers: 由特定條件觸發的Tasks;
在某個tasks中觸發, 當notify存在位置的上一個動作如果發生改變, 就會觸發handlers定義的動作; 使用notify來調用, 調用的為handlers中name定義的名字;
此方法在服務類程序中使用較多, 當可以reload生效時, 可以使用command和shell進行定義;
handlers:
– name: reload httpd
shell: systemctl reload httpd.service
3. tags : 給指定的任務定義一個調用標識;
ansible-playbook -t TAGS PLAYBOOK.yaml
ansible-playbook –skip-tags TAGS PLAYBOOK.yaml
在 tasks 或 handlers 中定義, 必須放置在 – name: 段當中, 對存在 tags 的程序段進行操作; 其他全部不進行操作;
4. variables :
類型 :
內建 : 可直接調用
(1) facts : 可以使用 setup模塊獲取的變量
用戶自定義 :
(1) 通過命令行傳遞
-e VAR1=VALUE1 -e VAR2=VALUE2 …
(2) 在hosts Inventory中為每個主機定義專用變量值;
(a) 向不同的主機傳遞不同的變量;
IPhone/HOSTNAME variable_name=value
(b) 向組內的所有主機傳遞相同的變量;
[group_name:VARS]
variable_name=value
調用 :
{{ var_name }}
示例:
- hosts: dbsrv remote_user: root vars: - pkgname: httpd tasks: - name: install a packet yum: name={{ pkgname }} state=present
使用vars記性變量的定義, 格式如下
vars:
– VAR_NAME1: VALUE1
– VAR_NAME2: VALUE2
…
若沒指定, 可以使用 -e 選項, 并且命令行中給定的 -e VAR_VALUE 的優先級更高;
ansible-playbook -e VAR_VALUE PLAYBOOK.yaml
組變量 :
可以在/etc/ansible/hosts中單獨向主機傳遞變量
方式一:
[websrv] 10.1.52.2 pkgname=naginx 10.1.52.3 pkgname=httpd
方式二:
[websrv] 10.1.52.2 10.1.52.3 [websrv:vars] pkgname=memcached
Inventory還可以使用參數
用于定義ansible遠程連接目標主機時使用的屬性, 而非傳遞給playbook;
[websrv]
10.1.52.2 ansible_ssh_user=USER ansible_shh_pass=PASSWORD ansible_sudo_pass=SUDO_PASSWD
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
5. templates : 模板
文本文件, 內部嵌套有模板語言腳本(使用模板編程語言)
語法 :
字面量:
字符串 : 使用單引號或雙引號;
數字 : 整數, 浮點數
列表 : [item1, item2,…]
元組 : (item1,item2,…)
字典 : {key1:value1,key2:valuse2,…}
布爾值 : true/false
算數運算 :
+, -, * , /, //, %, **
比較操作 :
邏輯運算 : and, or, not
執行模板文件中的腳本, 并生成結果數據流, 需要使用template模塊;
template :
-a ""
src=
dest=
mode=
owner=
group=
注意 : 此模塊不能在命令行中使用, 只能在playbook中使用, 別模板語言一般為了表示使用 .j2 結尾;
示例:
- hosts: all remote_user: root tasks: - name: install nginx.conf template: src=/root/nginx.conf.j2 dest=/tmp/nginx.conf
并且要在需要使用template解析的文件中, 添加引用的參數, 例如: nginx.conf中添加
worker_processes {{ ansible_processor_vcpus }}
可以調用setup模塊中的變量名, 使用template將其解析為 value的值
完整安裝nginx并提供配置文件, 示例:
- hosts: ngxsrvs remote_user: root tasks: - name: install nginx yum: name=nginx state=latest - name: install nginx.conf template: src=/root/nginx.conf.j2 dext=/tmp/nginx.conf tags: ngxconf notify: reload nginx service - name: start nginx service service: name=nginx state=started enabled=true handlers: - name: reload nginx service shell: "/usr/sbin/nginx -s reload"
6. 條件測試
when語句 : 在tasks中使用, jinja2的語法格式;
可以調用 setup 模塊的變量, 判斷后面的值是否符合條件;
示例 :
- hosts: all remote_user: root tasks: - name: install nginx yum: name=nginx state=latest - name: service nginx.service restart service: name=nginx state=started when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6" - name: systemctl start nginx shell: systemctl start nginx.service when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" - name: install nginx.conf template: src=/root/nginx.conf.j2 dest=/tmp/nginx.conf tags: ngxconf notify: reload nginx handlers: - name: relaod nginx shell: "/usr/sbin/nginx -s reload"
7. 循環 : 迭代, 需要重復執行的任務;
對迭代項的引用, 固定變量名 "item", 使用with_items屬性給定要迭代的元素, 通過遍歷元素, 完成所有執行;
元素 : 列表, 字典
示例一: 基于字符串列表給出元素
- hosts: websrv remote_user: root tasks: - name: install packages yum: name={{ item }} state=latest with_items: - httpd - php - mariadb-server - php-mysql - sariadb-devel - php-devel - php-gd - php-mbstring
示例二: 基于字典列表給出元素
- hosts: websrv remote_user: root tasks: - name: create groups group: name={{ item }} state=present with_items: - group1 - group2 - group3 - name: create users user: name={{ item.name }} group={{ item.group }} state=present with_items: - { name: user1, group: group1 } - { name: user2, group: group2 } - { name: user3, group: group3 }
示例三: 在CentOS6 和CentOS 7上分別安裝lamp;
- hosts: websrv remote_user: root tasks: - name: install lamp on CentOS 7 when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" yum: name={{ item }} state=latest with_items: - httpd - mariadb-server - php - php-mysql - php-gd - php-mbstring - name: install lamp on CentOS 6 when: ansible_distribution == "CnetOS" and ansible_distribution_major_version == "6" yum: name={{ item }} state=latest with_items: - httpd - mysql-server - php - php-mysql - php-gd - php-mbstring
8. 角色 : roles
以特定的層級目錄結構進行組織的tasks, variables, handlers, templates, files等;
role_NAME/
files/ : 存放于copy或script等模塊調用的文件;
tasks/ : 此目錄中至少應該有一個名為main.yml的文件, 用于定義各tasks; 其他的文件需要由main.uml進行"包含(include)"調用;
handlers/ : 此目錄中至少應該有一個名為main.yml的文件, 用于定義各handlers; 其他的文件需要由main.uml進行"包含(include)"調用;
vars/ : 此目錄中至少應該有一個名為main.yml的文件, 用于定義各variables; 其他的文件需要由main.uml進行"包含(include)"調用;
templates/ : 存儲由templates模塊調用的模板文件;
meta/ : 此目錄中至少應該有一個名為main.yml的文件, 定義當前角色特殊設定及其依賴關系; 其他的文件需要由main.uml進行"包含(include)"調用;
default/ : 此目錄中至少應該有一個名為main.yml的文件, 用于定義默認變量;
路徑按照結構, 進行自包含, 不需要指定路徑, 程序會自動根據相對路徑進行查找文件;
示例:
(1) 在/etc/ansible/roles目錄下創建httpd, nginx, mariadb目錄, 在目錄下創建 files, tasks, handlers, vars, templates, meta, default目錄
mkdir -pv /etc/ansible/roles/{httpd,nginx,mariadb}/{files,tasks,handlers,vars,templates,meta,default}
(2) 在tasks目錄下創建任務文件
- name: copy nginx package copy: src=nginx.rpm dest=/tmp/nginx.rpm tags: cppkg - name: install nginx yum: name=nginx.rpm state=latest - name: install conf file templates: src={{ item.ngxconfj2 }} dest={{ item.ngxconf }} with_items: - { ngxconfj2: nginx.conf.j2, ngxconf: /etc/nginx/nginx.conf } - { ngxconfj2: default.conf.j2, ngxconf: /etc/nginx/conf.d/default.conf } tags: ngxconf notify: reload nginx service - name: start nginx service shell: /usr/bin/systemctl start nginx
(3) 在files文件下存放nginx.rpm文件
(4) 在templates目錄下放置nginx.conf.j2和default.conf.j2文件
(5) 在vars目錄下新建main.yml文件, 存放templates目錄下放置配置文件中的變量和值
(6) 在/etc/ansible目錄下新建nginx.yml的playbook文件
- hosts: websrv remote_user: root roles: - nginx
(7) 檢查語法和試運行
ansible-playbook –syntax-check nginx.yml
ansible-playbook –check nginx.yml
ansible-playbook nginx.yml
原創文章,作者:black_fish,如若轉載,請注明出處:http://www.www58058.com/57470