ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能
注: ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架
Ansible是一个配置管理和配置工具,类似于Chef,Puppet或Salt。这是一款很简单也很容易入门的部署工具,它使用SSH连接到服务器并运行配置好的任务,服务器上不用安装任何多余的软件,只需要开启ssh,所有工作都交给ansible端去负责,减少了大量的时间
ansible(主体):ansible的核心程序,提供一个命令行接口给用户对ansible进行管理操作;
Host Inventory(主机清单):为Ansible定义了管理主机的策略。一般小型环境下我们只需要在host文件中写入主机的IP地址即可,但是到了中大型环境我们有可能需要使用静态inventory或者动态主机清单来生成我们所需要执行的目标主机
Core Modules(核心模块):Ansible执行命令的功能模块,多数为内置的核心模块。
Custom Modules(拓展模块):如何ansible自带的模块无法满足我么你的需求,用户可自定义相应的模块来满足自己的需求
Connection Plugins(连接插件):模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
Playbook(任务剧本):编排定义ansible任务集的配置文件,由ansible顺序依次执行,通常是JSON格式的* YML文件
API:供第三方程序调用的应用程序编程接口
管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块
可以按应用类型等方式进行HostInventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc
管理节点可以通过playbooks
实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件
环境:
master:20.0.0.3
node1:20.0.0.4
node2:20.0.0.5
注:这里用主从好区分,严格来说,ansible不区分master节点和slave节点,它只有deploy(管理员)节点
安装目录如下:
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/
注:我们需要先安装一个epel-release包,然后再安装我们的 ansible 即可。
yum -y install epel-release
yum –y install ansible
'分类名字 IP'
[root@master ~]# vi /etc/ansible/hosts
[master]
20.0.0.3
[node]
20.0.0.4
20.0.0.5
免密认证
[root@master ~]# ssh-keygen -t rsa '一直空格没有设置密码'
ssh-copy-id root@20.0.0.4
ssh-copy-id root@20.0.0.5
'免交互代理'
ssh-agent bash
ssh-add //生成密钥时设置的密码 我没有设置
测试连接
[root@master ~]# ansible node -m ping
20.0.0.5 | SUCCESS => {
....
20.0.0.4 | SUCCESS => {
....
//尝试用ansible命令 获取节点的时间
[root@master ~]# ansible node -m command -a 'date'
20.0.0.4 | CHANGED | rc=0 >>
2021年 01月 13日 星期三 11:09:50 CST
20.0.0.5 | CHANGED | rc=0 >>
2021年 01月 13日 星期三 11:09:50 CST
[root@master ~]# ansible node -m ping
注:命令模块 适合使用简单的命令 无法支持"<",">","|",";","&"等符号
命令格式:ansible [主机] -m 模块 -a ‘date’
'指定IP执行date'
ansible 20.0.0.5 -m command -a 'date'
'指定分类执行date 这里设置的分类有master与node上面'
ansible node -m command -a 'date'
'所有hosts主机执行 all'
ansible all -m command -a 'date'
'不加-m模块 则默认运行command模块'
ansible all -a 'date'
每分钟添加字段到/opt/aaa.txt里
[root@master ~]# ansible node -m cron -a 'minute="*/1" job="/usr/bin/echo hello >> /opt/aaa.txt" name="test cron aaa"'
'查看node任务'
[root@master ~]# ansible node -a 'crontab -l'
#Ansible: test cron aaa
*/1 * * * * /usr/bin/echo hello >> /opt/aaa.txt
'取消node任务'
ansible node -m cron -a 'name="test cron aaa" state=absent'
注:copy模块在复制数据时,如果数据为软链接文件,会将链接指定源文件进行复制
[root@master ~]# ansible node -m copy -a "src=/etc/fstab dest=/root"
[root@node1 ~]# cat fstab
....
'content在文件中添加信息'
[root@master ~]# ansible node copy -a "content={
{ansible_all_ipv4_addresses}} dest=/opt/a.txt"
[root@node1 opt]# cat a.txt
["192.168.122.1", "20.0.0.4"][root@node1 opt]# cd
注:可以使用"<",">","|",";","&"等符号特殊符号
在node2下面安装httpd服务,给apache配置一个页面
[root@master ~]# ansible 20.0.0.5 -m shell -a 'chdir=/var/www/html echo this is node2 > index.html'
20.0.0.5 | CHANGED | rc=0 >>
[root@master ~]# ansible node -m shell -a 'chdir=/var/www/html ls'
20.0.0.5 | CHANGED | rc=0 >>
index.html
'就指定了node2所以node1报错'
20.0.0.4 | FAILED | rc=-1 >>
Unable to change directory before execution: [Errno 2] 没有那个文件或目录: '/var/www/html'
user模块请求的是useradd,userdel,usermod三个指令
'节点创建用户wxy'
ansible node -m user -a 'name=wxy'
'查看wxy用户生成密钥'
ansible node -m command -a 'tail /etc/passwd'
20.0.0.5 | CHANGED | rc=0 >>
....
20.0.0.5 | CHANGED | rc=0 >>
....
wxy:x:1001:1001::/home/wxy:/bin/bash
'删除用户 name=" " '
[root@master ~]# ansible node -m user -a 'name="wxy" state=absent'
注:可以远程批量创建用户组信息
'创建一个指定的用户组'
ansible 20.0.0.4 -m group -a 'name=pig gid=1024 system=yes'
20.0.0.4 | CHANGED => {
'删除一个指定的用户组'
[root@master ~]# ansible 20.0.0.4 -m group -a "name=pig gid=1024 state=absent"
'把用户lisi添加到ping组'
ansible node -m user -a 'name=lisi uid=1050 system=yes group=ping'
'查看node1的id lisi'
[root@master ~]# ansible 20.0.0.4 -a 'id lisi'
20.0.0.4 | CHANGED | rc=0 >>
uid=1050(lisi) gid=1020(ping) 组=1020(ping)
主要实现创建/删除文件信息 对数据权限进行修改
注:node的aaa.txt是创建的文件
修改文件的属主属组权限
ansible 20.0.0.4 -m file -a 'owner=lisi group=mysql mode=600 path=/opt/aaa.txt'
[root@node1 opt]# ll
总用量 16
-rw-------. 1 lisi mysql 2394 1月 13 18:49 aaa.txt
添加软连接
ansible 20.0.0.4 -m file -a 'src=/opt/aaa.txt path=aa.txt state=link'
'path=aa.txt 默认在root目录'
[root@node1 ~]# ll
lrwxrwxrwx. 1 root root 12 1月 13 18:49 aa.txt -> /opt/aaa.txt
删除文件
[root@master ~]# ansible 20.0.0.4 -m file -a ' path=aa.txt state=absent'
创建文件
[root@master ~]# ansible 20.0.0.4 -m file -a "path=test state=touch"
[root@node1 ~]# ll
总用量 16
w-r--r--. 1 root root 0 1月 13 18:56 test
使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。
'安装httpd服务'
root@master ~]# ansible node -m yum -a 'name=httpd'
'卸载httpd服务'
[root@master ~]# ansible node -m yum -a 'name=httpd state=absent'
注:用于管理服务运行状态
'启动http'
[root@master ~]# ansible node -m service -a 'enabled=true name=httpd state=started'
'关闭http'
[root@master ~]# ansible node -m service -a 'name=firewalld state=stopped'
注:在指定的被控制节点上执行控制节点上的脚本
[root@master ~]# cat test.sh '管理端创建脚本'
.....
[root@master ~]# ansible node -m script -a 'test.sh'
获取node组主机的facts的信息
[root@master ~]# ansible node -m setup
....
注:抓取文件到管理机上
a.txt是node2里面直接创建的,方便实现抓取
[root@master ~]# ansible 20.0.0.5 -m fetch -a 'src=/root/a.txt dest=/root'
20.0.0.5 | CHANGED => {
[root@master 20.0.0.5]# cd root/
[root@master root]# ll
总用量 0
-rw-r--r--. 1 root root 0 1月 13 16:19 a.txt