1.ansible简介
Ansible是近年越来越火的一款运维自动化工具,其主要功能是帮助运维实现IT工作的自动化、降低人为操作失误、提高业务自动化率、提升运维工作效率,一个人管理多个操作系统。常用于软件部署自动化、配置自动化、管理自动化、系统化系统任务、持续集成、零宕机平滑升级等。
常见的部署管理工具有Chef、Puppet、Ansible、SaltStack、Fabric.
Ansible完全基于Python开发,而DevOps在国内已然是一种趋势,Python被逐步普及,运维人员自己开发工具的门槛逐步降低,得益于此,方便对Ansible二次开发。Ansible内置丰富的模块,甚至还有专门为商业平台开发的功能模块,完全可以满足日常功能所需。在Ansible去中心化概念下,一个简单的复制操作即可完成管理配置中心的迁移。Agentless(无客户端),客户端无需任何配置,由管理端配置好后即可使用,这点非常诱人,使用ssh的方式。
2.ansible是如何工作的
Ansible没有客户端,因此底层通信依赖于系统软件,Linux系统下基于OpenSSH通信,Windows系统下基于PowerShell,管理端必须是Linux系统。
根据Ansible使用过程中的不同角色,将其分为:
使用者
Ansible工具集
作用对象
Ansible使用者来源于多种维度,分为以下几种方式:
CMDB存储和管理着企业IT架构中的各项配置信息,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达成的目标。
基于PUBLIC(公有云)/PRIVATE(私有云),Ansible以API调用的方式运行,Ansible提供了丰富的API语言接口:PHP、Python等。
直接使用Ad-Hoc临时命令集调用Ansible工具集来完成任务执行。
通过执行Playbooks中预先编排好的任务集按序完成任务执行。
Ansible工具集(ansible命令是Ansible的核心工具,总指挥)
INVENTORY:命令执行的目标对象配置文件
API:供第三方程序调用的应用程序编程接口
MODULES:丰富的内置模块
PLUGINS:内置和可自定义的插件
作用对象:
Ansible的作用对象,不仅仅是Linux和非Linux操作系统的主机,同样也可以作用于各类公有云/私有云,商业和非商业设备的网络设施。
2.ansible安装
系统中使用的版本和软件源版本要保持一致,我使用的是redhat8.2的版本
实验需要两台虚拟机 分别是westosa(172.25.10.100)和westosb(172.25.10.200)
westosa作主机控制节点,westosb是被控制的节点
修改westosa的hostname
写入yum源
设置IP
westosb设置IP
设置hostname 为westos_node1.westos.org
写入yum源
ansible可以下载epel源,有ansible以及各种依赖性。但是ansible除了sshpass这个依赖性在我们的yum源中没有以外,其他的python依赖性都有,所以我们只要准备ansible和sshpass两个rpm堡就行了
[root@westos_ansible mnt]# dnf install sshpass-1.06-9.el8.x86_64.rpm -y 先安装这个
[root@westos_ansible mnt]# dnf install ansible-2.9.11-1.el8.noarch.rpm -y
安装完成后可以查看ansible的版本信息
3、使用Ansible的参数
进入etc下的ansible主目录,可以看到ansible的主配置文件和默认清单hosts以及roles角色目录
使用这个命令可以查看所有被控制的主机
[root@westos_ansible ansible]# ansible all --list-hosts
编辑hosts文件,添加我们的节点虚拟机 172.25.10.200
保存退出继续查看可控制主机,节点已经加进来
当要控制这些主机中,会在ansible主机中生成python脚本,然后通过sshd服务传到被控制主机中,当被控制主机执行完这些脚本后,会自动清理python脚本。
-m表示模块,使用ping这个模块连接,连接错误,没有权限
需要加 -k参数,询问我ssh的密码,出现pong表示成功连接
给被控制用户添加一个用户,防止权力过大
做一个免密,不用那么麻烦每次都输入密码
生成密钥
将生成的公钥给到172.25.10.200的devops用户
ssh连接远程用户时,会使用被连接用户当前用户,所以我们需要指定用户
当我们远程执行shell脚本创建文件时,我们用的是devops普通用户,所以对于/mnt没有写的权限
所以下放权力给devops
在ansible主机上,我们加入-K参数输入devops的密码,错误,这是因为没有调用sudo
加入参数 --become -K 执行sudo,成功
继续在node上执行visudo,添加面免密认证
现在可以免密执行操作了,删除刚才创建的文件
4、构建Anisble清单
默认清单是用hosts文件,如果自己创建一个westos文件,无法读取,需要使用-i参数指定westos文件查看清单
查看未定义组的清单
设定单层清单,westos1,westos2
设定嵌套清单,westos大组包括westos1和westos2
指定主机IP范围简化Ansible主机清单
使用域名的方式来设定清单
使用“192*”可以列出192的组和192开头的所有的清单
测试正则表达式,列出带有172和198的清单
列出在westos2中的和192中一样的清单
列出westos2中和192中不一致的清单
列出所有以172或者192开头的清单或者清单组中的清单
5、Ansible配置文件参数详解
下表为ansible主配置文件常用配置参数的含义:
#[default] | 基本信息设定 |
---|---|
inventory= | 指定清单路径 |
remote_user= | 连接远程主机执行时使用的用户 |
ask_pass= | 是否需要输入ssh密码 |
library= | 库文件存放目录 |
local_tmp= | 本机临时脚本文件存放目录 |
remote_tmp= | 远程临时脚本文件存放目录 |
host_key_checking= | 连接被控主机时是否输入yes建立host_key |
forks= | 默认并发数量 |
sudo_user= | 默认使用sudo的用户 |
ask_sudo_pass= | 调用sudo时是否需要密码 |
module_name= | 默认模块command,可以改为shell |
log_path= | 日志文件路径 |
[privilege_escalation] | 身份信息设定 |
---|---|
become= | 连接被控主机是否需要become参数来授权 |
become_method= | 切换用户使用的方式,默认sudo |
become_user= | 在被控主机中切换的用户,默认root |
become_ask_pass | 使用become调用sudo时是否需要密码 |
配置ansible主配置文件
创建westos文件,尝试列出清单,无法列出,这是因为没有在配置文件中指定清单
编辑主配置文件ansible.cfg,在inventory中写入westoslist
再次查看,成功
remote_tmp和local_tmp是远端的本地的临时文件路径。当执行ansible后,主机生成python临时脚本,ssh发送到受控主机,受控主机执行完删除该临时文件,主机也会删除临时文件
去掉注释,测试一下,远程执行休眠命令50s
node1上有文件
ansbile主机上也有
等待50s以后会自动清除,以可以fg后Ctrl+C直接结束,文件就没有了
打开ask_pass,每次执行ansible询问我主机密码
注释ask_pass,测试不需要密码
如果误操作删除了~/.ssh/known_hosts文件,连接时,连接受控主机会询问是否接受受控主机发送过来的身份认证key,会要求输入yes或者no,但是每次都问很烦
编辑ansible主配置文件,去掉host_key_checking注释,让它不再询问我
不再询问
继续编辑主配置文件,这行指定的是使用模块,默认使用模块是command,指定使用模块是ping
直接使用ping模块
编辑配置文件
become=True打开时,执行ansbile命令不需要加become参数来调用sudo执行(在/mnt/底下建立文件需要root用户权限)
剩下三行也打开:
转换用户身份执行命令时,用sudo调用;
转换成root用户;
执行sudo指令时,不提示输入密码
编辑配置文件,这里的代码表示连接远程主机时默认使用的用户是devops
不指定用户devops也可以
6、构建用户级Ansible操作环境
ansible的主配置文件只有一个,如果每个用户的配置不一样,怎么办?
需要把配置独立出来,一个用户一个配置文件。
比如ansible主机上的lee用户,先创建lee,给密码,创建lee的snasible目录,编辑配置文件,在当前目录下,会优先找本目录的ansible.cfg文件,找不到才找/etc/ansible/ansible.cfg文件,所以用该用户的ansible的配置文件,必须在这个目录中。
创建用户lee,给密码,创建ansbile目录,创建ansbile.cfg配置文件,编辑文件
指定一些参数
ansible主机也可以是被控节点
切换到root用户
在ansible主机中创建用户devops,给密码
这时lee用户无法使用ansible操作被控主机,因为没有私钥,将root的私钥复制一份给lee用户
测试只有node1节点上的devops用户可以执行,这是因为172.25.10.100主机上的devops用户没有给ssh的公钥
将ssh公钥给devops用户
并且在visuduo中给devops用户授权
切换lee,进入ansible目录,执行命令,成功