最近准在学习ansible自动化运维工具,这个ansible老厉害了,可以一条命令或者一个playbook剧本批量处理上百台服务器任务。本文和大家聊聊ansible环境搭建那些事。
一、ansible介绍
ansible是一个开源自动化运维平台,可以在Ansible playbook中在完美描述IT应用架构的简单的自动化语言。Ansible可以管理强大的自动化任务,并且可以适应许多不同的工作流和环境。同时,Ansible的新使用者可以非常快速的使用它并将其带入生产环境。ansible 特性: no agent:不需要在被管控机器上安装客户端程序 no server:无服务端,直接运行命令 modules in any languages:基于模块工作 yaml,not code:使用yaml语言定制playbook ssh by default:基于ssh strong multitier solution:可以实现多级指挥
跨平台支持:ansible的无代理特性支持Linux,Windows,Unix和网络设备,无论 物理机,虚拟机,云主机和容器环境都能支持。 二、系统环境 Red Hat Enterprise Linux release 8.2 (Ootpa)
三、操作步骤 1、安装ansible (1)首先配置yum源,包含本地源和网络源(阿里源),方法如下: RHEL8配置yum源
(2)yum安装ansible: yum install -y ansible 等待自动完成安装 2、 控制机和被管理主机devops用户sudo提权配置 (1)创建devops用户 ps:可以使用root用户配置ansible环境和执行命令,但是root权限太大了,所以专门创建devops用户来配置和使用ansible命令。为了使用devops账号可以用sudo执行管理员权限,所以要提权,控制机和被管理主机都需要配置sudo提权。
在root用户下操作: useradd devops 创建devops用户
usermod -G wheel devops 给devops用添加wheel附属组 vim /etc/sudoer文件第110行,去掉前面注释#号,最后wq!让这条命令生效。
%wheel ALL=(ALL) NOPASSWD: ALL 这样用户devops就能使用sudo命令提权了。 同理被控制的5台主机也要创建devops账号做提权配置,主机名分别改为node1.com这样,方便记忆。
3、控制机配置ssh免密登陆 (1)为了访问被管理主机方便,我们在控制节点主机做域名解析,/etc/hosts配置文件如下:
测试node1.com和node1是否可以ping通,如下图说明成功了。
(2)使用su - devops命令切换到devops用户下(shell环境变量是devops用户的,pwd命令,显示为:/home/devops)
(3)ssh-keygen命令生成私钥和公钥
ssh-keygen 直接回车、回车、回车就行。
查看公钥id_rsa.pub具体信息
(4)ssh-copy-id node1 将控制机公钥拷贝到被管理主机node1,过程中需要输入yes和node1的devops用户密码。
(5)cat .ssh/authorized_keys查看被管理主机授权信息
发现cat .ssh/authorized_keys就是控制主机公钥文件内容。
(6)测试ssh免密登陆node1情况
ps:在控制机切换到devops用户再使用下面命令测试。
ssh node1 直接登陆到node1被管理主机
ssh node1 hostname 查看的hostname是node1的主机名
4、配置ansible.cfg文件
备注:ansible的配置文件叫ansible.cfg, 默认位于/etc/ansible/ansible.cfg 。此文件定义了连接受管主机的方法、权限以及受管主机清单文件等信息。一般都是在devops用户下面创建ansible文件夹,然后创建ansible.cfg文件,根据ansible.cfg的读取顺序当前目录的配置文件优先于默认路径的,所以不用担心配置文件不生效。可以通过ansible --version查看当前配置文件路径。
如下是我的ansible.cfg文件
[defaults]
inventory = /home/devops/ansible/inventory
#定义inventory主机清单文件的位置,默认清单文件是/etc/ansible/hosts
remote_user = devops
#设置受管主机的用户,默认是root。
roles_path = /home/devops/ansible/roles
[privilege_escalation]
become=True # 在受管主机是否进行提权
become_method=sudo #提权方式为sudo ,默认是su
become_user=root #提权后的用户
become_ask_pass=False #提权时是否需要密码
5、配置inventory文件
inventory文件就是受管主机的清单,定义了哪些主机将被ansible管理。
ps:根据实际情况是否要分租,主机可以是IP地址,也可以是主机名。
6、检查ansible配置是否正确
可以使用如下命令检查:
(1) ansible all --list-hosts
(2)ansible all -m ping #ping所有被管理主机,如下图表示成功了。
7、故障排除
(1)控制主机切换到devops用户后,使用sudo ssh-keygen等命令无法执行,按Table键查询不到命令,这因为devops用户执行sudo的权限;
解决方法:参照上面第2条。
(2)控制机devops用户下执行ssh node1提示输入node1控制机devops密码一直无法成功;
解决方法:给被管理主机devops用户配置密码。
(3)ssh-copy-id node1 已经将公钥发给node1主机,但是ssh node1连接仍然需要输入node1的devops用户密码;
解决方法:说明ssh免密登陆异常,可以先通过密码登陆node1主机,查看.ssh/authorized_keys文件里是否是控制主机的公钥信息,若不是可以将authorized_keys内容清空,重新执行ssh-copy-id命令;最后一招可以将控制主机的/home/devops/.ssh/文件夹内容删了,重新按照上面第3条执行。
(4)执行ansible all --list-host提示主机列表为空
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost
does not match 'all'
解决方法:第一:有可能是ansible.cfg配置文件的inventory主机清单文件路径配置错了(或者单词拼写错了),另外就是inventory主机清单文件配置异常,查看这2个文件。
第二:执行ansible all -m ping命令时当前文件夹路径不是我们手动创建ansible.cfg的路径,默认查找/etc/ansible/ansible.cfg配置文件和主机清单文件了,将路径切换到/home/devops/ansible文件夹就可以了。
四、总结
综上所述,ansible正常工作需要满足以下几个条件:devops用户有sudo的权限、ssh免密登陆正常、ansibel.cfg配置文件和inventory主机清单文件都都配置正常。只要ansible环境搭建OK了,后面管理受控端服务器就方便了。