Ansible自动化运维介绍与安装
Ansible 的介绍与安装
一、自动化与 Linux 系统管理(为什么要学习自动化运维)
大多数系统管理和基础架构管理任务依赖于通过图形界面或命令行手动执行。系统管理员通常依赖检查清单、文档或记忆中的流程来执行标准任务,这种方式容易出错,例如遗漏步骤或执行错误操作,并且对执行结果的验证通常有限。
自动化可以有效避免手动管理带来的问题。作为系统管理员,我们可以利用自动化工具确保系统快速、准确地完成部署与配置,自动执行日常重复性任务,从而节省时间,专注于更重要的运维工作。
二、什么是 Ansible?
Ansible 是一款基于 Python 开发的自动化运维工具,集成了众多运维工具的优良特性,支持批量系统配置、程序部署和运行命令等功能。
Ansible 是一个开源的自动化平台,它既是一种简洁的自动化语言,能够通过 Ansible Playbook 清晰描述 IT 应用架构,也是一个运行这些剧本的自动化引擎。其功能强大,可用于应用部署、配置管理、工作流自动化及网络自动化,甚至协调整个应用生命周期。
Ansible 采用无代理架构,通常通过 OpenSSH 或 WinRM 连接被管理主机,并通过推送小型模块程序来执行任务,使系统达到预期状态。任务完成后,这些模块会自动删除。
Ansible 基于 paramiko 开发,以模块化方式工作,本身不具备批量部署能力,实际部署功能由其所运行的模块提供。它无需在远程主机安装客户端(代理),直接通过 SSH 进行通信。目前,Ansible 已被红帽(Red Hat)官方收购。
三、Ansible 的优点
- 跨平台支持:支持 Linux、Windows、Unix 及网络设备,无代理管理,适用于物理机、虚拟机、云环境和容器。
- 人类可读的自动化:Playbook 采用 YAML 格式编写,易于阅读和理解。
- 完美描述应用:可通过 Playbook 完成每一次变更,清晰记录应用环境的各个方面。
- 易于版本控制:Playbook 和项目文件为纯文本,可纳入现有版本控制系统(如 Git)进行管理。
- 支持动态清单:可从外部来源动态更新管理主机列表,实时获取准确清单,不受基础架构或位置的影响。
- 强大的编排与集成能力:可与现有系统(如 HP SA、Puppet、Jenkins、红帽卫星等)轻松集成,并且集成到您的ansible工作中。
四、Ansible 的管理方式
Ansible 是一个模型驱动的配置管理工具,支持多节点发布和远程任务执行。默认使用 SSH 进行远程连接,无需在被管节点安装额外软件,并支持多种编程语言扩展。
Ansible 管理系统由控制主机和一组被管节点组成。控制主机通过 SSH 直接管理被管节点,并通过资源清单(inventory)对主机进行分组管理。
五、Ansible 系统架构
控制主机通过 Host Inventory(主机清单)识别和管理网络中的主机。
这就需要一个Host Inventory(主机清单),用于记录ansible可以控制网络中的哪些主机。另外,要配置和管理这些主机,可以采用两种方式,一种是单一的命令实现,另外一种也可以使用palybook实现。单一的命令模式是采用不同的模块进行管理,一个模块类似于一些管理的命令,如top,ls,ping等等,适用于临时性的操作任务。如果需要执行一些例行性或经常性的操作,则需要采用playbook的方式,playbook类似于一个脚本,将多个模块按一定的逻辑关系进行组合,然后执行。ansible还支持一些插件,如邮件、日志等,在和远程主机通信时,也会采用类似的连接插件,这里使用则是SSH协议的插件进行通信。
Ansible 的核心组成包括:
- Core Modules:自带模块
- Custom Modules:用户自定义扩展模块
- Plugins:支持日志、邮件等扩展功能
- Playbooks:剧本,YAML 格式任务定义文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
- Connection Plugins:ansible基于连接插件连接到各个主机上,默认使用 SSH 连接主机
- Host Inventory:记录Ansible管理主机的信息(如 IP、端口、密码等)
六、Ansible 任务执行模式
Ansible 支持两种任务执行模式:
- ad-hoc 模式(点对点模式):使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。(快速执行单条命令,适合临时操作)
- playbook 模式(剧本模式):是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。(通过组合多个任务完成复杂操作,是 Ansible 的核心管理方式)
七、Ansible 工作流程
八、Ansible 部署步骤
-
安装 RHEL 9 虚拟机,配置 IP 信息。
-
配置本地 yum 源:
mount /dev/cdrom /mnt vim /etc/yum.repos.d/server.repo
写入以下内容:
[aa] name=aa1 baseurl=file:///mnt/BaseOS enabled=1 gpgcheck=0[bb] name=bb1 baseurl=file:///mnt/AppStream enabled=1 gpgcheck=0
-
安装虚拟化软件包组:
yum group install "Virtualization Client" "Virtualization Hypervisor" "Virtualization Tools" -y
-
重启并启用 libvirtd 服务:
systemctl restart libvirtd systemctl enable libvirtd
-
上传 RHEL 9.2 镜像至虚拟机。
-
使用 virt-manager虚拟监视器 安装系统。
-
克隆 5 台主机,共 6 台,IP 规划如下:
192.168.122.100 master.example.com 192.168.122.10 node1.example.com 192.168.122.20 node2.example.com 192.168.122.30 node3.example.com 192.168.122.40 node4.example.com 192.168.122.50 node5.example.com
-
所有主机需删除网卡配置文件中的 UUID。
-
所有主机编辑
/etc/hosts
,添加如下内容:192.168.122.1 ansible.example.com ansible 192.168.122.100 master.example.com master 192.168.122.10 node1.example.com node1 192.168.122.20 node2.example.com node2 192.168.122.30 node3.example.com node3 192.168.122.40 node4.example.com node4 192.168.122.50 node5.example.com node5
-
配置 master 主机的 SSH 免密登录(root 和 student 用户均需配置)使用su - student进入student用户:
ssh-keygen for i in node{1..5}; do ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i; done for i in node{1..5}; do ssh-copy-id -i ~/.ssh/id_rsa.pub student@$i; done
-
在宿主机(ansible)中配置 HTTP 本地 yum 仓库,安装 httpd,上传包文件至
/var/www/html/
,重启 httpd,关闭防火墙和 SELinux。 -
在 master 主机中配置 yum 仓库:
vim /etc/yum.repos.d/server.repo
写入以下内容:
[aa] name=aa1 baseurl=http://ansible.example.com/rhel9/BaseOS enabled=1 gpgcheck=0[cc] name=cc1 baseurl=http://ansible.example.com/rhel9/AppStream enabled=1 gpgcheck=0[dd] name=dd1 baseurl=http://ansible.example.com/ansible-automation-platform enabled=1 gpgcheck=0
测试安装:
yum -y install vim
-
为 student 用户配置提权:
echo "student ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/student for i in node{1..5}; do scp /etc/sudoers.d/student root@$i:/etc/sudoers.d/; done
-
安装 Ansible(使用 student 用户):
su - student sudo yum -y install ansible-core ansible-navigator
-
配置 Ansible:
-
创建 ansible 目录:
mkdir /home/student/ansible
-
创建主机清单 inventory:
[test01] node1[test02] node2[web] node3 node4[test05] node5[webtest:children] web
-
创建 roles 和 collections 目录:
mkdir roles collections
-
生成并修改 ansible.cfg:
ansible-config init --disabled > ansible.cfg vim ansible.cfg
修改为以下内容(注意将
alice
替换为student
):[defaults] inventory = /home/student/ansible/inventory remote_user = student roles_path = /home/student/ansible/roles host_key_checking = False collections_path = /home/student/ansible/collections[privilege_escalation] become = True become_ask_pass = False become_method = sudo become_user = root
-
测试连接:
ansible all -m ping
成功如图
-