Ansible & Ansible-playbook使用详解
自动化类别:
OS Provisioning(系统安装部署)
PEX,cobbler(PEX的升级版)
OS config(主机的配置文件修改)
cfengine,puppet,saltstack,chef
Deployment(多台主机的部署方式)
func(ssl)
fabric(ssh)
ansible(ssh)
__Ansible模块__
Core Modules(核心模块)
Custom Modules(自定义模块)
Plugins(email,logging,other)(执行完毕后通过邮件或记录的日志方式存档)
Playbook(任务剧本)
Connection Plugins
Host Inventory(主机池、分组)
Ansible安装____
安装环境如下:
服务器2台
操作系统:centos6.8 x64
ip地址分配情况:
ansible分发端:172.18.119.102
被部署端:172.18.119.112
软件下载:
https://pkgs.org/centos-6/epel-i386/ansible1.9-1.9.6-2.el6.1.noarch.rpm.html
Ansible install:
注意:Ansible是基于python开发的,有很多的以来的包需要安装,这边我们使用epel的yum的方式安装
1、Download the latest epel-release rpm from
http://dl.fedoraproject.org/pub/epel/6/i386/
2、Install epel-release rpm:
# rpm -Uvh epel-release*rpm
3、Install ansible1.9 rpm package:
# yum install ansible1.9
————————————————
设置ssh免密钥分发到client
1、#ssh-keygen -t rsa -P ''
2、ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.18.119.112
Ansibled 配置文件
/etc/ansible/host
注释已有的主机列表示例,行添加一行主机或者主机组的方式:
[clients]
172.18.119.112
______________
Ansible使用手册及案例
基本语法格式:
——————————————————
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
基本案例使用
————————————————
1、探测指定主机或者所有主机是否在线:
ansible 172.18.119.112 -m ping或者ansible all -m ping
.参数m:指定使用的模块(命令:ansible-doc -l可查看ansible支持的所有模块)
eg:
[iyunv@server ansible]# ansible 172.18.119.112 -m ping
172.18.119.112 | success >> {
"changed": false,
"ping": "pong"
}
2、探测指定主机或者所有主机的时间是否一致:
ansible all -a 'date'
eg:
[iyunv@server ansible]# ansible all -a 'date'
172.18.119.112 | success | rc=0 >>
Tue Dec 20 17:01:56 CST 2016
3、检查指定主机的nginx服务的运行状态:
eg:
[iyunv@server ansible]# ansible all -a 'service nginx status'
172.18.119.112 | FAILED | rc=3 >>
nginx 已停
[iyunv@server ansible]# ansible all -a 'service nginx status'
172.18.119.112 | success | rc=0 >>
nginx (pid 26668) 正在运行...
4、把本地安装包复制到被部署的服务器的opt目录上去:
ansible-doc -s copy可以查看模块可以使用的参数;
eg:
[iyunv@server opt]# ansible 172.18.119.112 -m copy -a "src=/opt/ansible1.9-1.9.6-2.el6.1.noarch.rpm dest=/opt/"
172.18.119.112 | success >> {
"changed": true,
"checksum": "3f900edf50b32f557bf4286b47ecf0fa64fd4a67",
"dest": "/opt/ansible1.9-1.9.6-2.el6.1.noarch.rpm",
"gid": 0,
"group": "root",
"md5sum": "e84e5001b0718336f3834ce38c86f08b",
"mode": "0644",
"owner": "root",
"size": 1844424,
"src": "/root/.ansible/tmp/ansible-tmp-1482227767.15-125559515403616/source",
"state": "file",
"uid": 0
}
检查是否copy成功:
[iyunv@server opt]# ansible 172.18.119.112 -a 'ls /opt'
172.18.119.112 | success | rc=0 >>
ansible1.9-1.9.6-2.el6.1.noarch.rpm
5、为所有的主机设置个定时任务(每3分钟执行一次时间同步):
eg:
[iyunv@server opt]# ansible all -m cron -a 'name="custom jobs" minute=*/3 hour=* month=* weekday=* job="/usr/sbin/ntpdate 172.18.119.1"'
172.18.119.112 | success >> {
"changed": true,
"jobs": [
"custom jobs"
]
}
检查一下定时任务是否添加成功:
[iyunv@server opt]# ansible all -a 'crontab -l'
172.18.119.112 | success | rc=0 >>
#Ansible: custom jobs
*/3 * * * * /usr/sbin/ntpdate 172.18.119.1
6、为所有主机添加一个mysql的系统组:
eg:
[iyunv@server ~]# ansible all -m group -a 'name="mysql" gid=700 system=yes'
172.18.119.112 | success >> {
"changed": true,
"gid": 700,
"name": "mysql",
"state": "present",
"system": true
}
7、使用yum方式为所有主机安装程序包;
eg:
172.18.119.112 | success >> {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror, security\nSetting up Install Process\nLoading mirror speeds from cached hostfile\n ....信息该多省略;
检查是否安装成功:
[iyunv@server opt]# ansible all -a "rpm -qa corosync"
172.18.119.112 | success | rc=0 >>
corosync-1.4.7-5.el6.x86_64
8、设置主机上的nginx服务为开机启动:
eg:
[iyunv@server ~]# ansible all -m service -a 'state="started" name="nginx" enabled="yes"'
172.18.119.112 | success >> {
"changed": true,
"enabled": true,
"name": "nginx",
"state": "started"
}
检查nginx开机启动是否设置成功:
[iyunv@server ~]# ansible all -a 'chkconfig --list nginx'
172.18.119.112 | success | rc=0 >>
nginx 0:off1:off2:on3:on4:on5:on6:off
以上的使用方式,在生产环境尽然,我们有时候需要安装软件同时配置其配置文件 并设置计划任务等等,混合部署
那么这样单一的去一条一条执行命令比较繁琐,也不太现实,这里我们引入了一个叫 ansible中playbook的插件,我们称之为ansbilbe任务剧本
或者叫 剧本队列。
Playbook详解:
————————————
依赖的语言YAML
YAML是一个可读性高的用来表达资料序列的格式,YAML参考了其他的多重语言,它不是xml。
YAML的特点:
可读性好
脚本语言交互性好
基于流来处理
扩展性号
有一个一致的信息模型
YAM的语法
eg:
name:kuaiwenwu
age:41
gender:Male
spouse:
name:Yaru.wang
age:37
gender:sales
children:
-name:kuaixiaoduo
age:weichusheng
gender:baby
-name:kuaianqi
age:weichusheng
gender:baby
Ansible playbooks实例:
——————————|———————————
- hosts:webserver
vars:
http_port: 256
max_clients: root
remote_user: root
tasks:
- name:ensure nginx is at the latest version
yum:name=nginx state=latest
name:ensure nginx is running
service:name=nginx state=started
handlers:
- name: restart nginx
service:name=nginx state=restarted
接下来我们写个ansible-paly方式的yaml脚本来感受下;
脚本的名称:test.yaml
脚本代码:
- hosts: all (指定的主机为所有的主机,这里也可以写上我们之前hosts配置文件定义的主机组名称,- 和hosts;和面的all 必须是有空格)
remote_user: root (指定远程主机以root用户执行任务)
tasks: (注意这里不能写host而是hosts)
- name: add a group任务名称
group: gid=800 name=testgroup system=no添加组的参数 不需要加""
- name: excute a command任务描述或者名称
command: /bin/date执行的命令
看看执行后返回的状态:
[iyunv@server ansible]# ansible-playbook test.yaml (YAML脚本的执行方式)
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [172.18.119.112]
TASK: [add a group] ***********************************************************
changed: [172.18.119.112]
TASK: [excute a command] ******************************************************
changed: [172.18.119.112]
PLAY RECAP ********************************************************************
172.18.119.112 : ok=3 changed=2 unreachable=0 failed=0
注意:
remote_user字段可以用于tasks的任务列表中
eg:
- hosts:webserver
remote_user:eason
task:
- name:test connection
ping:
remote_user:eason
sudo:yes |