ansible是自动化运维工具,基于Python开发,分布式,无需客户端,轻量级,实现了批量系统配置、批量程序部署、批量运行命令等功能,ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
Ansible特性
1)、no agents:不需要在被管控主机上安装任何客户端,更新时,只需在操作机上进行一次更新即可(不用安装客户端。分布式的)
2)、no server:无服务器端,使用时直接运行命令即可
3)、modules in any languages:基于模块工作,可使用任意语言开发模块
4)、yaml,not code:使用yaml语言定制剧本playbook
5)、ssh by default:基于SSH工作
6)、strong multi-tier solution:可实现多级指挥
connection plugins:连接插件,负责和被监控端实现通信,默认使用SSH连接。
host inventory:主机清单,是一个配置文件里面定义监控的主机。
modules : 模块,核心模块、command模块、自定义模块等。
plugins : modules功能的补充,包括连接插件,邮件插件等。
playbook:编排,定义 Ansible 多任务配置文件,非必需。
工作原理
Ansible由节点和控制机器组成。 控制机器是安装Ansibles的地方,节点由这些机器通过SSH管理。 借助SSH协议,控制机器可以部署临时存储在远程节点上的模块。
控制机器使用ansible或者ansible-playbooks在服务器终端输入的Ansible命令集或者playbook后,Ansible会遵循预先编排的规则将PLAYbook逐条拆解为Play,再将Play组织成Ansible可以识别的任务tasks,随后调用任务涉及到的所有MODULES及PLUGINS,根据主机清单INVENTORY中定义的主机列表通过SSH协议将任务集以临时文件或者命令的形式传输到远程节点并返回结果,如果是临时文件则执行完毕后自动删除。
ansible的安装很简单,yum安装即可
[root@master ~]# yum install -y epel-release
[root@master ~]# yum -y install ansible
[root@master ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
查看版本
1.配置文件
/etc/ansible/ansible.cfg #主要设置一些ansible初始化的信息,比如日志存放路径、模块、等配置信息
2.主机清单文件
默认位置/etc/ansible/hosts
清单详解
语法:
1.添加主机或者主机组:
[root@ansible-server ~]# vim /etc/ansible/hosts #在最后追加被管理端的机器
ansible-web1 #单独指定主机,可以使用主机名称或IP地址
2.添加主机组:
[webservers] #使用[]标签指定主机组 ----标签自定义
192.168.126.140 #如果未解析添加ip
ansible-web2 #解析添加主机名
3.组可以包含其他组:
[webservers1] #组一
ansible-web1
[webservers2] #组二
ansible-web2
[weball:children] #children-照写 #weball包括两个子组
webservers1 #组一
webservers2 #组二
4.为一个组指定变量,组内每个主机都可以使用该变量:
[weball:vars] #设置变量,vars--照写
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_private_key_file=/root/.ssh/id_rsa
#ansible_ssh_pass=test #也可以定义密码,如果没有互传秘钥可以使用密码。
我们需要三台机器,控制机器master 192.168.126.140
被控制机器web1 192.168.126.133 web2 192.168.126.139
控制机器要先安装ansible,然后给三台机器配置解析,三台机器都要配置
[root@master ~]# vim /etc/hosts
192.168.126.140 ansible-master
192.168.126.133 ansible-web1
192.168.126.139 ansible-web2
配置ssh公钥认证:控制节点需要发送ssh公钥给所有被控制节点
[root@master ~]# ssh-keygen #一直回车即可
[root@master ~]# ls /root/.ssh/
id_rsa id_rsa.pub
[root@master ~]# ssh-copy-id -i 192.168.126.133 #发送公钥给web1
[root@master ~]# ssh-copy-id -i 192.168.126.139 #发送公钥给web2
所有机器都要关闭防火墙和selinux
[root@master ~]# vim /etc/ansible/hosts
ansible-web1 #这里配置过解析可以写解析名,也可以写ip
ansible-web2
[webservers] #可以自定义组名
ansible-web1
ansible-web2
[webserver1]
192.168.126.133
[webserver2]
192.168.126.139
[weball:children]
webserver1
webserver2
[weball:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_private_key_file=/root/.ssh/id_rsa
查看组内列表
[root@master ~]# ansible weball --list-hosts
hosts (2):
192.168.126.133
192.168.126.139
手动测试一下连通
可以看到连通性正常,可以正常控制web1 web2
语法:ansible 组名或者ip或者解析名 -m 模块 -a '命令'
[root@master ~]# ansible ansible-web1 -m shell -a uptime
ansible-web1 | CHANGED | rc=0 >>
11:14:04 up 2:43, 3 users, load average: 0.00, 0.01, 0.05
给节点添加用户
[root@master ~]# ansible webservers -m shell -a 'useradd alan'
ansible-web1 | CHANGED | rc=0 >>
ansible-web2 | CHANGED | rc=0 >>
然后去web1 web2 查看
[root@web1 ~]# id alan
uid=1002(alan) gid=1003(alan) 组=1003(alan)
[root@web2 ~]# id alan
uid=1000(alan) gid=1000(alan) 组=1000(alan)
重定向输出到本地文件中
显示的的web1的磁盘状态
[root@master ~]# ansible ansible-web1 -m shell -a 'df -Th' > /opt/a.txt
[root@master ~]# cat /opt/a.txt
ansible-web1 | CHANGED | rc=0 >>
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 17G 7.1G 10G 42% /
devtmpfs devtmpfs 478M 0 478M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm
tmpfs tmpfs 489M 13M 476M 3% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 125M 890M 13% /boot
tmpfs tmpfs 98M 0 98M 0% /run/user/0
模块参数详解:
src=:指定源文件路径
dest=:目标地址(拷贝到哪里)
owner:指定属主
group:指定属组
mode:指定权限,可以以数字指定比如0644
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
先在本机创建一个测试文件
[root@master ~]# vim /opt/ceshi.txt
[root@master ~]# cat /opt/ceshi.txt
112233
[root@master ~]# ansible ansible-web1 -m copy -a 'src=/opt/ceshi.txt dest=/opt owner=alan group=alan mode=644'
在web1上查看
[root@web1 ~]# ll /opt/
总用量 4
-rw-r--r--. 1 alan alan 7 9月 2 11:28 ceshi.txt
[root@web1 ~]# cat /opt/ceshi.txt
112233
详解
state= #状态是什么,干什么
state=absent 用于remove安装包
state=latest 表示最新的:安装
state=removed 表示卸载
给web1安装httpd
[root@master ~]# ansible ansible-web1 -m yum -a 'name=httpd state=latest'
卸载httpd
[root@master ~]# ansible ansible-web1 -m yum -a 'name=httpd state=removed'
[root@master ~]# ansible webservers1 -m service -a "name=httpd state=started" #启动
[root@master ~]# ansible webservers1 -m service -a "name=httpd state=stopped" #停止
[root@master ~]# ansible webservers1 -m service -a "name=httpd state=restarted" #重启
[root@master ~]# ansible webservers1 -m service -a "name=httpd state=started enabled=yes" #开机启动
[root@master ~]# ansible webservers1 -m service -a "name=httpd state=started enabled=no" #开机关闭
模块参数详解:
owner:修改属主
group:修改属组
mode:修改权限
path=:要修改文件的路径
recurse:递归的设置文件的属性,只对目录有效
yes:表示使用递归设置
state:
touch:创建一个新的空文件
directory:创建一个新的目录,当目录存在时不会进行修改
创建一个文件
[root@master ~]# ansible ansible-web1 -m file -a 'path=/opt/b.txt mode=777 state=touch'
创建目录
[root@master ~]# ansible ansible-web1 -m file -a 'path=/opt/file1 mode=777 state=directory'
在web1查看
[root@web1 ~]# ll /opt/
总用量 4
-rwxrwxrwx. 1 root root 0 9月 2 11:43 b.txt
-rw-r--r--. 1 alan alan 7 9月 2 11:28 ceshi.txt
drwxrwxrwx. 2 root root 6 9月 2 11:45 file1
ansible-playbook(剧本)看下篇文章