一、Ansible概述
1.1 Ansible简介
Ansible是一款自动化运维工具,通过ssh对目标主机进行配置、应用部署、任务执行、编排调度等操作。它简化了复杂的环境管理和自动化任务,提高了工作效率和一致性,同时,Ansible的剧本(playbooks)可以使用YAML语言进行编写,易于维护和扩展。
- Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。
- Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。
- Ansible是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是Ansible的模块, 比如copy模块用于拷贝文件到远程主机上,service模块用于管理服务的启动、停止、重启等。
- Ansible其中一个比较鲜明的特性是Agentless,即无Agent的存在,它就像普通命令一样,并非C/S软件,也只需在某个作为控制节点的主机上安装一次Ansible即可,通常它基于ssh连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务。
- 使用者在使用时,在服务器终端输入命令或者playbooks,会通过预定好的规则将playbook拆解为play,再组织成ansible可以识别的任务,调用模块和插件,根据主机清单通过SSH将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除
- Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。比如执行 systemctl stop xxx 命令来停止服务,当发现要停止的目标服务已经处于停止状态, 它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而 systemctl restart xxx 是非幂等的。
- Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。
1.2 Ansible的特点
- 部署简单,只需在主控端部署Ansible环境, 被控端无需做任何操作
- 默认使用SSH协议设备进行管理;
- 主从集中化管理
- 配置简单、功能强大、扩张性强;
- 支持API及自定义模块,可以通过Pyhton轻松扩展
- 通过playbooks 来定制强大的配置、状态管理
- 对云计算平台、大数据都有很好的支持
1.3 Ansible自动运维管理工具的优点
- 轻量级,更新时,只需要在操作机上进行一次更新即可;
- 采用 SSH 协议;
- 不需要去客户端安装 agent;
- 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
- 使用 python 编写的,维护更简单;
- 支持 sudo 普通用户命令;
- 去中心化管理。
二、Ansible的数据流向(工作机制)
2.1 内部
加载自己的配置文件,默认/etc/ansible/ansible.cfg
查找对应的主机配置文件,找到要执行的主机或组
加载自己对应的模块文件,如command yum ping
通过ansible将模块命令生成对应临时py文件(pyhton),并将该文件传输至远程服务器上
对应执行用户的家目录的.ansible/tmp/xxx/xxxx.py文件
给文件+执行权限
执行并返回结果,删除临时文件,sleep 0 退出
2.2 外部
三、安装Ansible
3.1安装准备
[root@localhost ~]#setenforce 0 ##关闭核心防护
[root@localhost ~]#systemctl stop firewalld #关闭防火墙
3.2 修改主机名
[root@localhost ~]#hostnamectl set-hostname ansible01
[root@localhost ~]#bash
[root@localhost ~]#hostnamectl set-hostname ansible02
[root@localhost ~]#bash
[root@localhost ~]#hostnamectl set-hostname ansible03
[root@localhost ~]#bash
3.3 给每台机器添加域名
echo "192.168.10.100 ansible01" >> /etc/hosts
echo "192.168.10.101 ansible02" >> /etc/hosts
echo "192.168.10.102 ansible03" >> /etc/hosts
cat /etc/hosts
3.4 Ansible控制端安装epel源
[root@localhost ~]#yum install epel-release.noarch -y
3.5 Ansible控制端安装Ansible
[root@ansible01 ~]#yum -y install ansible
3.6 Ansible控制端安装tree
yum -y install tree
3.7 查看ansible目录结构
ls /etc/ansible/
或是
tree /etc/ansible/
3.8 配置Ansible主机清单
[root@ansible01 ~]#cd /etc/ansible/
[root@ansible01 ansible]#ls
ansible.cfg hosts roles
[root@ansible01 ansible]#cp hosts{,.bak} ##做备份
[root@ansible01 ansible]#ls
ansible.cfg hosts hosts.bak roles
[root@ansible01 ansible]#vim hosts ##修改配置文件
3.9 设置免密登录
[root@ansible01 ansible]#ssh-keygen -t rsa
##第一次设置免密的时候是失败的
[root@ansible01 ansible]#sshpass -p '123' ssh-copy-id root@192.168.10.101
[root@ansible01 ansible]#ssh root@192.168.10.101
##此次设置免密成功
[root@ansible01 ansible]#sshpass -p '123' ssh-copy-id root@192.168.10.101
##第一次设置免密的时候是失败的
[root@ansible01 ansible]#sshpass -p '123' ssh-copy-id root@192.168.10.102
[root@ansible01 ansible]#ssh root@192.168.10.102
##此次设置免密成功
[root@ansible01 ansible]#sshpass -p '123' ssh-copy-id root@192.168.10.102
四、Ansible相关工具
- /usr/bin/ansible 主程序,临时命令执行工具
- /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字
- /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
- /usr/bin/ansible-pull 远程执行命令的工具
- /usr/bin/ansible-vault 文件加密工具
- /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
- /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
4.1 ansible
格式:
ansible <host-pattern> [-m module_name] [-a args]
命令 主机或者清单中的组 -m 指定模块 -a 执行的任务
选项:
--version #显示版本
-m module #指定模块,默认为command
-v #详细过程 -vv -vvv更详细
--list-hosts #显示主机列表,可简写 --list
-C, --check #检查,并不执行 (检查的是脚本,不是配置文件)
-T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
-k, --ask-pass #提示输入ssh连接密码,默认Key验证
-u, --user=REMOTE_USER #执行远程执行的用户,默认root
-b, --become #代替旧版的sudo 切换
--become-user=USERNAME #指定sudo的runas用户,默认为root vim /etc/sudoers 用户权限
-K, --ask-become-pass #提示输入sudo时的口令
-f FORKS, --forks FORKS #指定并发同时执行ansible任务的主机数
-v #详细过程 -vv -vvv更详细
[root@ansible01 ansible]#ansible nginx -a "touch /opt/kgc" -vv
去被管理的那两主机查看
--list-hosts #显示主机列表,可简写 --list
[root@ansible01 ansible]#ansible nginx --list
[root@ansible01 ansible]#ansible tomcat --list
[root@ansible01 ansible]#ansible all --list
[root@ansible01 ansible]#ansible 'nginx:tomcat' --list-hosts
[root@ansible01 ansible]#ansible 'nginx:&tomcat' --list-hosts
[root@ansible01 ansible]#ansible 'nginx:!tomcat' --list-hosts
4.2 ansible-doc
格式:
ansible-doc 模块 #可以看模块的详细信息
[root@ansible01 ansible]#ansible-doc
ansible-doc -l #列出所有已安装的模块,按q退出
[root@ansible01 ansible]#ansible-doc -l | wc -l
3387
[root@ansible01 ansible]#ansible-doc -s ping ##显示模块的简单信息
[root@ansible01 ansible]#ansible-doc ping ##该模块的详细信息
[root@zzzcentos1 ~]#ansible-doc file
#幂等性,安全性,自己写脚本 按q退出
4.3 ansible-console
#此工具可交互执行命令,支持tab,ansible 2.0+新增
提示符格式
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
常用子命令:
设置并发数: forks n 例如: forks 10
切换组: cd 主机组 例如: cd web
列出当前组主机列表: list
列出所有的内置命令: ?或help
root@all (4)[f:5]$ cd nginx
root@nginx (2)[f:5]$
root@nginx (2)[f:5]$ forks 1
root@nginx (2)[f:1]$
[root@ansible01 ~]#ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
root@all (4)[f:5]$ ping
#直接使用模块
4.4 playbook
此工具用于执行编写好的 playbook 任务
范例
ansible-playbook hello.yml
cat hello.yml
---
#hello world yml file
- hosts: websrvs
remote_user: root
gather_facts: no
tasks:
- name: hello world
command: /usr/bin/wall hello world
五、Ansible 模块
常用模块帮助文档参考:
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
用法:
ansible <host-pattern> [-m module_name] [-a args]
命令 主机或者清单中的组 -m 指定模块 -a 执行的任务
5.1 Command 模块
在远程主机执行命令,不支持管道,重定向等shell的特性。
ansible-doc -s command #-s 列出指定模块的描述信息和操作动作
command模块是ansible的默认模块
vim /etc/ansible/ansible.cfg
功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项
注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现
< >(重定向) |(管道符) ;(并行执行) & (后台执行)
注意:此模块不具有幂等性
[root@ansible01 ansible]#ansible nginx -m command -a "cp /etc/passwd /opt/"
验证:
注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现
[root@ansible01 ansible]#ansible nginx -a "echo hello > /opt/haha"
[root@ansible01 ansible]#ansible nginx -m shell -a "echo hello > /opt/haha"
5.2 shell 模块
功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >
shell 可以用特殊符号,可以用的命令更多
注意:此模块不具有幂等性
在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)
ansible-doc -s shell
chdir:在远程主机上运行命令的前提进入目录
creates: 判断指定文件是否存在 如果存在 不执行后面的操作
removes: 判断指定文件知否存在 如果存在 执行后面的操作
[root@ansible01 ansible]#ansible nginx -m shell -a "echo hahahaha > /opt/test1"
验证:
[root@ansible01 ansible]#ansible web -m shell -a "ifconfig ens33|awk 'NR==2{print}'"
提取出ip地址行
5.3 cron 模块
在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。
ansible-doc -s cron #按 q 退出
5.3.1 制作计划任务
##制作计划任务
[root@ansible01 ansible]#ansible nginx -m cron -a 'minute="*/5" job="/bin/echo this is kysw" name="kysw crontab"'
[root@ansible01 ansible]#ansible nginx -a 'crontab -l'
验证:
[root@ansible02 ~]#crontab -l
5.3.2 移除计划任务
[root@ansible01 ansible]#ansible nginx -m cron -a 'name="kysw crontab" state=absent'
[root@ansible01 ansible]#ansible nginx -a 'crontab -l'
5.4 user 模块
用户管理的模块
ansible-doc -s user
5.4.1 创建用户
[root@ansible01 ansible]#ansible nginx -m user -a 'name="lisan"'
[root@ansible01 ansible]#ansible nginx -m user -a 'name="lisi"'
5.4.2 查看创建的用户
[root@ansible01 ansible]#ansible nginx -a 'tail /etc/passwd'
[root@ansible02 ~]#tail -n3 /etc/passwd
5.4.3 删除创建的用户
[root@ansible01 ansible]#ansible nginx -m user -a 'name="lisan" state=absent'
[root@ansible01 ansible]#ansible nginx -m user -a 'name="lisi" state=absent remove=yes'
[root@ansible02 ~]#tail -n3 /etc/passwd
[root@ansible02 ~]#ls /home/
5.5 group 模块
用户组管理的模块
ansible-doc -s group
5.5.1 创建myzh组
[root@ansible01 ansible]#ansible nginx -m group -a 'name=myzh gid=305 system=yes'
5.5.2 查看组
[root@ansible02 ~]#tail -n5 /etc/group
5.5.3 将用户添加到组中
[root@ansible01 ansible]#ansible nginx -m user -a 'name="wangwu" uid=305 system=yes group=myzh'
5.5.4 查看用户是否加入到组中
[root@ansible02 ~]#id wangwu
5.6 copy 模块
用于复制指定主机文件到远程主机的
ansible-doc -s copy
复制到指定的路径下,并添加权限
验证:
验证:
5.7 file模块
设置文件属性
ansible-doc -s file
5.7.1 创建文件
[root@ansible01 ansible]#ansible nginx -m file -a "path=/opt/ceshi.txt state=touch"
5.7.2 删除文件
[root@ansible01 ansible]#ansible nginx -m file -a "path=/opt/ceshi.txt state=absent"
5.7.3 创建软链接
[root@ansible01 ansible]#ansible nginx -m file -a "path=/opt/fstab.link src=/opt/fstab.bak state=link"
5.8 hostname模块
用于管理远程主机上的主机名
ansible-doc -s hostname
[root@ansible01 ansible]#ansible tomcat -m hostname -a 'name=kysw'
5.9 ping 模块
检测远程主机的连通性
ansible-doc -s ping
[root@ansible01 ansible]#ansible nginx -m ping
[root@ansible01 ansible]#ansible tomcat -m ping
[root@ansible01 ansible]#ansible all -m ping
[root@ansible01 ansible]#ansible 192.168.10.101 -m ping
[root@ansible01 ansible]#ansible 192.168.10.102 -m ping
[root@ansible01 ansible]#ansible 192.168.10.103 -m ping
5.10 yum 模块
在远程主机上安装与卸载软件包
ansible-doc -s yum
5.10.1 安装tree
[root@ansible01 ansible]#ansible tomcat -m yum -a 'name=tree'
验证:
5.10.2 卸载tree
[root@ansible01 ansible]#ansible tomcat -m yum -a 'name=tree state=absent'
验证:
5.11 service/systemd 模块
用于管理远程主机上的管理服务的运行状态
ansible-doc -s service
5.11.1 安装httpd服务
[root@ansible01 ansible]#ansible tomcat -m yum -a 'name=httpd'
5.11.2开启httpd服务
[root@ansible01 ansible]#ansible tomcat -m service -a 'name=httpd enabled=true state=started'
验证:
5.11.3用Ansible查看服务状态
[root@ansible01 ansible]#ansible tomcat -a 'systemctl status httpd'
5.12 script 模块
实现远程批量运行本地的 shell 脚本
ansible-doc -s script
5.12.1 创建一个本地的shell脚本
[root@ansible01 ansible]#cd /opt/
[root@ansible01 opt]#ls
rh
[root@ansible01 opt]#vim test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
[root@ansible01 opt]#ls
[root@ansible01 opt]#chmod +x test.sh
5.12.2 给脚本添加执行权限
5.12.3 远程批量运行本地脚本
[root@ansible01 opt]#ansible tomcat -m script -a 'test.sh'
验证:
5.12.4 远程查看脚本运行后的文档
[root@ansible01 opt]#ansible tomcat -a ' cat /opt/script.txt'
5.13 setup 模块
facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取这些信息
ansible-doc -s setup
5.13.1 获取mysql组主机的facts信息
[root@ansible01 opt]#ansible tomcat -m setup
5.13.2 使用filter可以筛选指定的facts信息
[root@ansible01 opt]#ansible nginx -m setup -a 'filter=ipv4'
[root@ansible01 opt]#ansible nginx -m setup -a 'filter=*ipv4'
正在加载...
总结:
1、ansible模块
1.1 ansible命令格式
## ansible命令格式
ansible <组名> -m <模块> -a <参数列表>
ansible-doc -l 列出所有已安装的模块 按q退出
ansible-doc -s 模块名 指导模块使用方法
1.2 ansible操作模式
command ## 在远程主机执行命令,不支持管道,重定向等shell的特性。
##常用的参数
chdir: 在远程主机上运行命令前提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作
shell ## 在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)
cron ## 在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。
user ## 用户管理的模块
group ## 用户组管理的模块
copy ## 用于复制指定主机文件到远程主机的
file ## 设置文件属性
hostname ## 用于管理远程主机上的主机名
ping ## 检测远程主机的连通性
yum ## 在远程主机上安装与卸载软件包
systemd/service ## 用于管理远程主机上的管理服务的运行状态
script ## 实现远程批量运行本地的 shell 脚本
setup ## facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取这些信息