Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。
Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多 个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操住。
Ansible是基于模块工作的,它只是提供了一-种运行框架,它本身没有完成任务的能力,真正执行操作的是Ansible的模块,比如copy模块用于拷贝文件到远程主机上,service模块用于管理服务的启动、停止、重启等。
command ping copy cron yum service shell file user group
模块被认为是 Ansible 的工作单元。每个模块大多是独立的,可以用标准的脚本语言编写,如 Python、Perl、Ruby、bash 等。模块的一个重要属性是幂等性,意味着一个操作执行多次不会产生副作用。
Playbooks 是 Ansible 的配置、部署和编排语言,它是基于YAML语言编写的。他们可以描述您希望远程系统实施的策略,或者描述一般 IT 流程中的一系列步骤。
Ansible由节点和控制机器组成。 控制机器是安装Ansibles的地方,节点由这些机器通过SSH管理。 借助SSH协议,控制机器可以部署临时存储在远程节点上的模块。 控制机器使用ansible或者ansible-playbooks在服务器终端输入的Ansible命令集或者playbook后,Ansible会遵循预先编排的规则将PLAYbook逐条拆解为Play,再将Play组织成Ansible可以识别的任务tasks,随后调用任务涉及到的所有MODULES及PLUGINS,根据主机清单INVENTORY中定义的主机列表通过SSH协议将任务集以临时文件或者命令的形式传输到远程节点并返回结果,如果是临时文件则执行完毕后自动删除。
(1)特性一:
Ansible其中一个比较鲜明的特性Agentless,即无Agent的存在(无代理端,即无客户端),它就像普通命令一样, 并非c/s软件,也只需在某个作为控制节点的主机上安装一次Ansible即可,通常它基于ssh连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务。
使用者在使用时,在服务器终端输入命令或者playbooks,会通过预定好的规则将playbook拆解为play(一个play就是一个Linux操作),再组织成ansible可以识别的任务,调用模块和插件,根据主机清单通过SSH将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除。
(2)特性二:
Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。
比如执行 systemctl stop xxx
命令来停止服务,当发现要停止的目标服务已经处于停止状态,它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而systemctl restart xxx是非幂等的。
Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。
实验环境:
角色 | IP | 安装工具 |
管理端 | 192.168.6.157 | ansible |
被管理端 | 192.168.6.154 | 无需安装 |
安装部署:
#1、管理端安装ansible
yum install -y epel-release #先安装epel源
yum install -y ansible #安装ansible
#ansible目录结构
[root@yuji ~]# cd /etc/ansible
[root@yuji ansible]# tree
.
├── ansible.cfg
├── hosts
└── roles
1 directory, 2 files
#2、配置主机清单,修改/etc/ansible/hosts文件
cd /etc/ansible
vim hosts
[webservers] #配置组名
192.168.6.154 #组里包含被管理的主机IP或主机名(主机名需要先修改/etc/hosts文件)
[dbservers] #第二个组
192.168.6.188
#3、ansible默认使用ssh连接,所以管理前要设置免密登录
#配置密钥对验证
ssh-keygen -t rsa #一路回车,生成密钥文件
vim /etc/ssh/ssh_config #修改ssh客户端配置文件
StrictHostKeyChecking no #35行,取消注释,将ask修改为no,开启免交互
systemctl restart sshd #重启sshd
#使用sshpass,以免交互的方式将公钥文件传给被管理端,实现免密登录
sshpass -p 'root' ssh-copy-id [email protected]
#如果被管理端主机有很多台,可以通过sshpass和for循环写一个脚本,实现多台主机免密登录。
yum install -y epel-release #安装epel扩展源
yum install -y ansible
ansible.cfg #ansible的配置文件
hosts #ansible的主仓库,用于存储需要管理的远程主机的相关信息
roles #角色
vim /etc/ansible/hosts
[webserver] #组名
192.168.6.154 #组成员IP
... ...
命令格式:`命令格式: ansible [主机] [-m 模块] [-a 操作]`
ansible-doc -l #列出所有已安装的模块,q退出
ansible-doc -s 模块 #查看相应模块信息,q退出
ansible-doc -s yum #-s列出yum模块描述信息和操作动作,q退出
ansible 192.168.6.154 -m command- a 'ls' #指定ip执行ls
ansible mysql -m command -a 'ls' #指定组执行ls
ansible all -m command -a 'ls' #所有主机执行ls命令
ansible all -a 'ls' `#如果不加-m模块,则默认运行command模块`
两种状态(state):present表示添加(可以省略),absent表示移除。
ansible webserver -m cron -a 'day="*/1" job="/usr/bin/echo hello >> /opt/1test.txt" name="this is test"'
#指定webserver组中所有主机使用cron模块,时间是每天,工作是输出hello,计划性任务命名为this is test
ansible webserver -a 'crontab -l'
#没有-m指定模块默认使用command模块,操作是查看计划性任务
ansible webserver -m cron -a 'name="this is test" state=absent'
#移除计划任务
user模块是请求的是useradd, userdel, usermod三个指令
ansible mysql -m user -a 'name=lisi'
#创建用户lisi
ansible mysql -m command -a 'tail -1 /etc/passwd'
#查看/etc/passwd文件最后一行,看用户是否创建成功
ansible mysql -m user -a 'name=lisi state=absent'
#删除用户lisi
group模块请求的是groupadd, groupdel, groupmod三个指令。
```bash
ansible webserver -m group -a 'name=webserver1 gid=567 system=yes'
#创建组
ansible webserver -a 'tail -1 /etc/group'
#查看组信息
ansible webserver -m user -a 'name=wangwu uid=567 system=yes group=webserver1'
#创建用户并加入webserver组
ansible webserver -a 'tail -1 /etc/passwd'
#查看用户wangwu的用户id和组id信息
ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.back owner=root mode=640'
#指定mysql组中的主机使用copy模块将控制端文件/etc/fstab复制到被控制端并更名
ansible mysql -a 'ls /opt'
ansible mysql -m copy -a 'content="hello world!" dest=/opt/fstab.back'
#将hello world!写入/opt/fstab.back
ansible mysql -a 'cat /opt/fstab.back'
ansible mysql -m user -a 'name=mysql system=yes'
#创建mysql系统用户
ansible mysql -m group -a 'name=mysql system=yes'
#创建mysql组
ansible mysql -m file -a 'owner=mysql group=mysql mode=644 path=/opt/fstab.back'
#修改文件的属主属组
ansible mysql -m file -a 'path=/opt/fstab.link src=/opt/fstab.back state=link'
#mysql组中主机使用file模块,为源文件/opt/fstab.link创建一个软连接/opt/fstab.back.link
ansible mysql -a 'ls -l /opt'
ansible all -m ping
yum模块主要用于安装和卸载软件包
ansible webserver -m yum -a 'name=httpd'
#yum安装httpd
ansible webserver -a 'rpm -q httpd'
ansible webserver -m yum -a 'name=httpd state=absent'
#卸载httpd
ansible webserver -a 'rpm -q httpd'
ansible webserver -a 'systemctl status httpd'
#查看web服务器httpd运行状态
ansible webserver -m service -a 'enabled=true name=httpd state=started'
#启动httpd服务
ansible mysql -m user -a 'name=zhangsan'
ansible mysql -m shell -a 'echo 123123 | passwd --stdin zhangsan'
vim test.sh
#!/bin/bash
echo 'hello ansible from script' > /opt/script.txt
chmod +x test.sh
ansible all -m script -a 'test.sh'
Ansible facts 是远程系统的信息,主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等信息。
ansible mysql -m setup
#获取mysql组主机的facts信息