1、What's the Asible?
Ansible是新出現(xiàn)的自動(dòng)化運(yùn)維工具,基于Python開發(fā),集合了眾多運(yùn)維工具(puppet、cfengine、chef、func、fabric)的優(yōu)點(diǎn),實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能。
1.1、Ansible's structure
- Inventory
- Modules
- Ad Hoc Commands
- Playbooks
- Tasks
- Variables
- Templates
- Handlers
- Roles

Host Inventory : 主機(jī)庫(kù),用于存放管控的主機(jī)列表。
Core Modules : 核心模塊
Custom Modules : 自定義模塊
Ad Hoc Commands :
Playbooks : 劇本,按照設(shè)定的順序執(zhí)行完成任務(wù)。
??Tasks : 任務(wù)
??Variables : 變量
??Templates : 模板
??Handlers : 處理器
??Roles : 角色,用于調(diào)度不同的playbooks.
2、How to use Ansible?
安裝環(huán)境 :?CentOS7
所需軟件包 :?Ansible(epel源)
2.1、Ansible's configuration files
-
主配置文件
- /etc/ansible/ansible.cfg
-
Host Inventory
[webserver] 192.168.0.14 192.168.0.15 [dbserver] 192.168.0.14
2.2、ansible命令
ansible <host-pattern> [-m module_name] [-a args] [options]
- <host-pattern> : 事先定義在hosts文件中的主機(jī)列表
-m module_name : 指定模塊的名稱
-a args : 指定模塊的參數(shù)
[options] : 命令的其它參數(shù)
使用實(shí)例
ansible webserver -m shell -a "ss -tnl" #查看webserver主機(jī)列表中的主機(jī)的TCP端口是否處于監(jiān)聽狀態(tài)
ansible webserver -m yum -a "name=httpd state=present" #安裝httpd服務(wù)
2.3、ansible-doc命令
ansible-doc [-l] [-s] [module...]
- -l : 列出可用的模塊
- -s Module : 查看指定模塊的用法
2.4、ansible常用模塊
2.4.1 command模塊
-
功能
- 在遠(yuǎn)程主機(jī)上運(yùn)行一個(gè)命令,直接給出要執(zhí)行的命令,但不能運(yùn)行管理
類命令。
- 在遠(yuǎn)程主機(jī)上運(yùn)行一個(gè)命令,直接給出要執(zhí)行的命令,但不能運(yùn)行管理
-
使用示例
-
ansible all -a "ls /home" (默認(rèn)模塊,可以省略模塊名稱)[root@localhost ~]# ansible all -a "ls /home" 192.168.0.15 | SUCCESS | rc=0 >> Packages test test1 test2 test3 testfile 192.168.0.14 | SUCCESS | rc=0 >> Packages test test1 test2 test3 testfile
-
2.4.2 shell模塊
-
功能
- 啟動(dòng)一個(gè)shell進(jìn)程來執(zhí)行命令,支持管道傳送。
-
使用示例
ansible 192.168.0.14 -m shell -a "ss -tnl | grep 80"
[root@localhost ~]# ansible 192.168.0.14 -m shell -a "ss -tnl | grep 80"
192.168.0.14 | SUCCESS | rc=0 >>
LISTEN 0 128 *:80 *:*
LISTEN 0 128 :::80 :::*
2.4.3、copy模塊
-
功能
- 復(fù)制文件,把管理端的文件復(fù)制到遠(yuǎn)程主機(jī)上
-
使用格式
- src : 管理端文件路徑
- dest : 目標(biāo)主機(jī)文件存放路徑
- mode : 文件的權(quán)限
- owner : 文件的屬主
-
使用示例
ansible 192.168.0.14 -m copy -a "src=/etc/ansible/ansible.file/httpd.conf dest=/etc/httpd/conf/httpd.conf"
2.4.4、cron模塊
-
功能
- 定義cron任務(wù)
-
使用格式
-a "name= state= minute= hour= day= month= weekday= job= state={present|absent"
-
使用示例
ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &> /dev/null' name='sync time' state=present"
2.4.5、file模塊
-
功能
- 文件的創(chuàng)建和刪除
-
使用格式
-a "path= mode= owner= group= state={directory|link|hard|touch|file|absent} src= "
-
使用示例
ansible 192.168.0.14 -m file -a "path=/home/test1 state=directory"ansible webserver -m file -a "src=/etc/fstab path=/home/fstab state=link"
2.4.6、yum模塊
-
功能
- 程序包的管理
-
使用格式
-a "name= conf_file= state={present|latest|absent} enablerepo= disablerepo= "
-
使用示例
ansible webserver -m yum -a "name=httpd state=absent"
2.4.7、service模塊
-
功能
- 管理服務(wù)
-
使用格式
-a "name= state={started|stoped|restarted} enabled= runlevel= "
-
使用示例
ansible webserver -m service -a "name=httpd state=started"
2.4.8、user模塊
-
功能
- 管理用戶
-
使用格式
ansible all -m user -a "name= state={present | absent} force= system= uid= shell= home= "
-
使用示例
ansible webserver -m user -a "name=jrc system=true shell=/sbin/nologin uid=333"
2.4.9、group模塊
-
功能
- 管理組
-
使用格式
-a "name= state={present|absent} gid= system="
-
使用示例
ansible webserver -m group -a "name=jrcgroup state=present system=true"
2.4.10、ping模塊
-
功能
- 測(cè)試與被管理主機(jī)的連通性
-
使用示例
-
ansible all -m ping[root@localhost ~]# ansible all -m ping 192.168.0.14 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.0.15 | SUCCESS => { "changed": false, "ping": "pong" }
-
2.4.11、script模塊
-
功能
- 指定本地的腳本文件,到遠(yuǎn)程主機(jī)上執(zhí)行一次
-
使用示例
ansible webserver -m script -a "/root/useradd.sh"
2.4.12、setup模塊
-
功能
- 收集指定遠(yuǎn)程主機(jī)上的facts信息,將其收集的信息保存在各變量當(dāng)中。
-
使用示例
ansible webserver -m setup
3、Playbooks劇本
??Playbooks是ansible更為強(qiáng)大的配置管理組件,實(shí)現(xiàn)基于文本文件編排執(zhí)行的多個(gè)任務(wù),而且可以多次執(zhí)行。Playbooks使用YAML,類似于半結(jié)構(gòu)化語(yǔ)言,聲明式配置,可讀性很高,易于與腳本語(yǔ)言交互。
3.1核心組件
- Tasks : 任務(wù)
-
Variables : 變量
- facts : 可直接調(diào)用
- 自定義變量 : 通過命令行傳遞
- -e VARS, --extra-vars=VARS
- 主機(jī)變量 : 定義在Inventory中的主機(jī)之后的變量,直接傳遞給當(dāng)個(gè)主機(jī)變量
- IP/HOSTNAME varaiable=value var2=value2
- 主機(jī)組變量 : 定義在主機(jī)組上的變量
- [groupname:vars]
variable=value
- [groupname:vars]
-
Templates : 模板
- 包含了模板的文本文件
-
Handlers : 處理器
- 在特定條件下觸發(fā)
- 任務(wù)可通過"tags"打標(biāo)簽,而后可在ansible-playbook命令上使用-t指定進(jìn)行調(diào)用
- 接收到其它任務(wù)的通知時(shí)觸發(fā)
- 某任務(wù)的狀態(tài)在運(yùn)行為change時(shí),可通過"notify
- 在特定條件下觸發(fā)
- Roles : 角色
Playbooks的基本示例
- hosts: webserver
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: start nginx
service: name=nginx state=started
- name: change nginx
template: src=/etc/ansible/ansible.file/nginx.conf.j dest=/etc/nginx/nginx.conf
tags: change_conf
notify: restart nginx
handlers:
- name: restart nginx
service: name=nginx state=restarted
3.2、Playbook的條件測(cè)試
?在某個(gè)tasks后面添加when子句,即可實(shí)現(xiàn)條件測(cè)試功能,when語(yǔ)句支持jinja2語(yǔ)法。
示例
- hosts: webserver
remote_user: root
tasks:
- name: install_httpd
yum: name=httpd state=present
when: ansible_os_family == "CentOS7"
- name: start_nginx
service: name=nginx state=started
3.2、Playbook的迭代
?在task中調(diào)用內(nèi)置的item變量,在某task后面使用with_items語(yǔ)句來定義元素列表。
示例
- hosts: webserver
remote_user: root
tasks:
- name: install some packages
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm
- hosts: webserver
remote_user: root
tasks:
- name: add some groups
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: 'user11',group: 'group11' }
- { name: 'user12',group: 'group12' }
- { name: 'user13',group: 'group13' }
3.3、Roles 角色
??roles實(shí)現(xiàn)了"代碼復(fù)用",讓playbook中的各元素組織起來,roles是以特定的層級(jí)結(jié)構(gòu)組織起來的playbook元素。
注意 : 在/etc/ansible目錄下,有roles的目錄,在此目錄下為每個(gè)不同的服務(wù)提供不同的目錄,每一個(gè)服務(wù)相當(dāng)于一個(gè)角色,這樣就能實(shí)現(xiàn)管理的標(biāo)準(zhǔn)化和便捷化。
-
webserver/
- file/ : 用于存放文件,此角色用到的文件都應(yīng)該放在此目錄下。
- templates/ : jinja2模板文件存放位置。
- task/ : 存放任務(wù)列表文件,至少有一個(gè)main.yml的文件。
- handlers/ : 存放處理器列表文件,至少有一個(gè)叫做main.yml的文件。
- vars/ : 變量字典文件,至少有一個(gè)叫做main.yml的文件。
- meta/ : 元數(shù)據(jù),用于定義角色的特殊設(shè)定及依賴關(guān)系。
dbserver/
....nginxserver/
....
示例 :
[root@localhost nginx]# vi tasks/main.yml
- name: install_nginx
yum: name=nginx state=present
- name: start_nginx
service: name=nginx state=started
- name: change_conf
template: src=nginx.conf dest=/etc/nginx/nginx.conf
notify: restart_nginx
[root@localhost nginx]# vi handlers/main.yml
- name: restart_nginx
service: name=nginx state=restarted
[root@localhost nginx]# vi vars/main.yml
user: daemon
group: daemon
將nginx.conf文件復(fù)制到templates目錄下,作為模板,并將其中的 user nginx
改為 user {{ user }} {{ group }} ,作為一個(gè)變量使用。
在roles同級(jí)目錄下創(chuàng)建 nginx.yml,調(diào)用角色nginx
- hosts: webserver
remote_user: root
roles:
- nginx