1.Ansible 自动化介绍
1-Ansible 自动化介绍
Ansible 自动化介绍
手动执行任务和自动化执行任务
手动执行任务的麻烦事:
- 很容易漏掉某个步骤,或者不小心执行错步骤,而且很难验证每个步骤是不是真的按预期完成了。
- 管理一大堆服务器时,很容易出现配置不一样的情况,维护起来特别费劲,还会让整个 IT 环境变得不稳定,容易出问题。
自动化执行任务的好处:
- 通过统一的标准,能保证所有系统都能快速、正确地完成部署和配置。
- 日常那些重复做的固定任务可以自动执行,这样就能腾出时间去做更重要的事。
- 应用程序能更快地交付使用。
基础架构即代码
- 好的自动化系统能实现 “基础架构即代码” 的方法。简单说,就是用机器能读懂的自动化语言来描述 IT 基础架构应该是什么样子的。最好这种语言人也很容易看懂,这样就能轻松知道当前状态,改起来也方便。
- 如果这种自动化语言是用简单的文本文件写的,还能放到版本控制系统里管理。这样一来,每一次修改都会被记录下来,能看到随着时间推移做过哪些改动,万一出问题,还能把系统恢复到之前的配置。这就为遵循 DevOps 理念打下了基础:开发人员可以用自动化语言定义想要的配置,运维人员能轻松查看这些改动并给出反馈,然后用这个自动化方案重复操作,确保系统状态符合开发人员的预期。
Ansible (自动化) 与 DevOps (开发和运营)
百度百科:DevOps 是 Development(开发)和 Operations(运维)的组合词,指的是一系列流程、方法和系统的集合,目的是促进开发(应用程序 / 软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与融合。它是一种重视 “软件开发人员(Dev)” 和 “IT 运维技术人员(Ops)” 之间沟通合作的文化、运动或惯例。通过自动化 “软件交付” 和 “架构变更” 的流程,让构建、测试、发布软件变得更快捷、更频繁、更可靠。
DevOps 的核心就是 “沟通”。
Ansible 是第一款能在整个 IT 领域被大家读懂和编写的自动化语言,也是唯一一个能从头到尾自动化应用生命周期和持续交付流程的自动化引擎。
什么是 ANSIBLE?
Ansible 是一种简单的自动化语言,通过 Playbooks(剧本)来描述和配置 IT 基础架构。
Ansible 能处理各种复杂的自动化任务,适合不同的生产环境。而且,新手也能很快学会并用到实际生产中。
常见用途:
- 搭建和维护 OpenStack
- 搭建和维护 OpenShift
- 搭建和维护 ceph
Ansible 特点
- 简单易学:Ansible Playbooks 是文本文件,特别容易查看、理解和修改,用户不用懂复杂的编程技能。
- 功能强大:能用 Ansible 部署应用,比如做配置管理、工作流自动化、网络自动化,还能编排整个应用的生命周期。
- 无代理架构:Ansible 不需要在被管理的主机上装代理,它通过OpenSSH或者 WinRM 连接到这些主机,然后把一些小程序(Ansible 模块)推送到主机上。这些小程序用来把系统设置成我们想要的状态。任务完成后,推送的模块会被自动删除。正因为被管理的主机上不用装特殊代理,Ansible 用起来更高效、更安全。
- 跨平台支持:能管理 Linux、UNIX、Windows 系统和各种网络设备。
- 精准描述应用:Ansible Playbook 用 YAML 格式来描述生产环境的状态。
- 支持版本控制:Ansible Playbooks 和项目都是纯文本格式,可以像源代码一样存到版本控制系统里。
- 易于集成:能和 HP SA、Puppet、Jenkins、红帽卫星服务器等其他系统轻松集成。
Ansible 概念和架构
-
节点(NODES)
:Ansible 架构里有两种计算机:
- 控制节点:装了 ansible 软件的节点。
- 受管节点:被 ansible 管理的 Linux 系统、Windows 系统、网络设备等。
-
清单(INVENTORY):记录所有被管理主机的列表。
-
剧本(PLAYBOOK)
:用户只需要写好 Playbook,Ansible 就会确保主机达到预期状态。
- 每个 playbook 里可以包含多个 “剧本片段(play)”。
- 每个 play 会在一组主机上按顺序执行一系列 “任务(task)”。
- 每个 task 都要执行一个 “模块(module)”。模块是一小段代码(可能是 Python、PowerShell 或其他语言写的)。Ansible 自带几百个模块,能执行各种自动化任务,比如操作系统文件、安装软件、调用 API 等。Tasks、plays 和 Playbooks 具有 “幂等性”—— 在同一台主机上多次安全执行 Playbooks,最终主机都会处于正确状态。如果主机已经是预期状态,Playbook 就不会做任何改动。
-
插件(PLUGINS):添加到 Ansible 里的代码片段,用来扩展 Ansible 的功能。
Ansible 理念
- 复杂会降低效率:越简单越好。Ansible 的设计原则就是让工具好用、自动化脚本好写好懂,所以创建自动化时要尽量简单。
- 优先保证可读性:Ansible 自动化语言围绕简单易懂的声明性文本文件构建。写得好的 Ansible Playbook 能清晰记录工作流的自动化过程。
- 用声明式思维:Ansible 是一种 “目标状态引擎”。它解决 IT 部署自动化的思路是:你只需要说明希望系统处于什么状态,Ansible 会通过只做必要的改动,让系统达到这个状态。
Ansible 用例
- 配置管理:集中管理和部署配置文件是 Ansible 的常见用法,很多高级用户都是从这里开始了解 Ansible 自动化平台的。
- 应用部署:用 Ansible 定义应用,再结合红帽 Ansible Tower 管理部署,各个团队能更高效地管理从开发到生产的整个应用生命周期。
- 工作流管理:Ansible 和红帽 Ansible Tower 能简化系统配置流程,不管是通过 PXE 引导和 kickstart 安装裸机恢复服务器、虚拟机,还是从模板创建虚拟机或云实例,都能轻松搞定。
- 持续交付:创建 CI/CD 流水线需要多个团队配合。如果没有一个团队里所有人都能用的简单自动化平台,这很难实现。Ansible Playbook 能确保应用在整个生命周期内都被正确部署和管理。
- 安全与合规:在 Ansible Playbook 里定义安全策略后,还能把扫描和修复安全策略的操作集成到其他自动化流程中。安全应该是所有部署中必不可少的部分,而不是事后才考虑的事情。
- 编排:只配置单个部分不足以定义整个环境,还需要明确多个配置之间如何交互,确保各种分散的资源能被整体管理。
Ansible 部署
准备实验环境
实验环境的 /etc/hosts 配置
10.1.8.10 controller.bq.cloud controller
10.1.8.11 node1.bq.cloud node1
10.1.8.12 node2.bq.cloud node2
10.1.8.13 node3.bq.cloud node3
10.1.8.14 node4.bq.cloud node4
需要配置控制节点的 bq 用户能免密码登录所有节点,并且不用输入密码就能通过 sudo 获取权限执行任何命令。
# 所有节点都配置/etc/hosts
[root@all-node ~]# cat >> /etc/hosts <<EOF################# ansible #################
10.1.8.10 controller.bq.cloud controller
10.1.8.11 node1.bq.cloud node1
10.1.8.12 node2.bq.cloud node2
10.1.8.13 node3.bq.cloud node3
10.1.8.14 node4.bq.cloud node4
EOF# 所有节点添加用户
[root@all-node ~]# useradd bq
[root@all-node ~]# echo redhat | passwd --stdin bq# 所有节点配置免密提权
[root@all-node ~]# echo 'bq ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/bq# 创建密钥对
[bq@centos7 ~]$ [ -d ~/.ssh ] || mkdir -m 700 .ssh
[bq@centos7 ~]$ ssh-keygen -t rsa -f .ssh/id_rsa -N ''# 推送公钥到目标主机
[bq@centos7 ~]$ sudo yum install -y sshpass
[bq@centos7 ~]$ for host in controller node{1..4}
do sshpass -p redhat ssh-copy-id bq@$host
done# 验证免密登录
[bq@centos7 ~]$ for host in controller node{1..4}
do sshpass -p bq@$host hostname
done
控制节点
控制节点就是安装了 Ansible 软件的主机。可以有一个或多个控制节点,被 Ansible 管理的主机不需要安装 Ansible。
注意:控制节点必须是 Linux 或 UNIX 系统,不支持 Windows 作为控制节点。
安装 ansible:
[bq@centos7 ~]$ sudo yum install -y ansible
[bq@centos7 ~]$ ansible --version
ansible 2.9.27config file = /etc/ansible/ansible.cfgconfigured module search path = [u'/home/bq/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']ansible python module location = /usr/lib/python2.7/site-packages/ansibleexecutable location = /bin/ansiblepython version = 2.7.5 (default, Jun 28 2022, 15:30:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
受管节点
Linux
受管节点需要满足的条件,取决于控制节点连接它们的方式以及要运行的模块:
- Python 版本:Linux 和 UNIX 受管节点需要安装 Python,才能运行大部分模块。
- 有些模块不需要 Python:比如 raw 模块,它的参数直接通过配置的远程 shell 运行,可以在没有 Python 环境的设备上使用。不过,raw 模块很难用安全的幂等方式操作。
Windows
Ansible 自带很多专门为 Microsoft Windows 系统设计的模块,这些模块可以在 Ansible 模块索引的Windows Modules部分查到。
大部分专门为 Microsoft Windows 受管节点设计的模块,要求受管节点上:
- 安装 PowerShell 3.0 或更高版本。
- 配置 PowerShell 远程连接。
- 安装.NET Framework 4.0 或更高版本。
本课程的示例用的是基于 Linux 的受管节点,不会详细讲管理 Microsoft Windows 受管节点的具体区别和必要设置。想了解更多可以去Ansible 官网查看。
网络设备
也可以用 Ansible 来自动化配置受管网络设备,比如路由器和交换机。Ansible 包含很多专门为此设计的模块,支持 Cisco IOS、IOSXR、NX-OS,Juniper Junos,Arista EOS,以及基于 VyOS 的网络设备等。
由于大多数网络设备不能运行 Python,所以 Ansible 的网络模块是在控制节点上运行的,而不是在受管节点上。和网络设备通信会用特殊的连接方式,通常是通过 SSH 上的 CLI、SSH 上的 XML 或者 HTTP (S) 上的 API。
isco IOS、IOSXR、NX-OS,Juniper Junos,Arista EOS,以及基于 VyOS 的网络设备等。
由于大多数网络设备不能运行 Python,所以 Ansible 的网络模块是在控制节点上运行的,而不是在受管节点上。和网络设备通信会用特殊的连接方式,通常是通过 SSH 上的 CLI、SSH 上的 XML 或者 HTTP (S) 上的 API。
如涉及版权问题,请联系作者处理!!!!!!!!!