ansible自动化运维

ansible介绍

ansible 是一个开源的自动化运维工具,主要用于系统配置管理、应用部署、任务编排等场景。它使用 YAML 语法编写配置文件,语法简单易懂,学习曲线平缓。ansible 的任务是幂等的,意味着多次执行结果是一致的,不会产生意外结果,非常适合于持续部署和集成。

ansible 支持众多常见操作系统和中间件,具有良好的扩展性。同时它还支持自定义模块,可以满足各种复杂的自动化需求。另一个特点是 ansible 不需要在远程主机上安装任何代理,只需要有 SSH 访问权限即可,并且不需要中央控制节点,使用 SSH 协议直接连接远程主机,部署和维护相对简单。ansible 使用 SSH 进行远程连接和命令执行,保证了数据传输的安全性。

ansible由python开发,集合了众多自动化运维工具的优点,实现了批量系统部署、批量程序部署,批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署能力的是ansible运行的模块,ansible只是提供一个框架。

核心组件

1572239-20220628171055036-2027660252

ansible:ansible核心程序。 HostInventory:记录由ansible管理的主机信息,包括端口、密码、ip等。 Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。 CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。 CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。 ConnectionPlugins:连接插件,ansible和Host通信使用

任务执行方式

特点

执行过程

ansible部署

说明:ansible只是一个工具,不需要启动,安装好以后,直接使用即可。并且只有服务端需要安装,客户端不需要安装....

参数说明

快速开始

实验环境:四台Linux虚拟机,HOSTNAME分别为:ansible、server1、server2、server3

其中,ansible做为服务端,其他server均作为客户端

  1. 免密登录

常用工具

主要配置文件

配置主机清单

编辑/etc/ansible/hosts文件,再最后面添加上被管理端

执行状态

ansible的执行状态

常用模块

ping模块

测试与主机的连通性

示例:

Group模块

用户创建和修改用户组

示例:对node1主机组的成员创建一个IT组,组ID为111

User模块

用于对用户的创建,修改和删除等操作

示例:在主机组node1上创建一个系统用户张三,家目录为/home/zhangsan,uid为111,附加组为IT,以及给一个注释

Command模块

command模块是ansible默认使用的模块。不支持管道,变量及重定向等

示例:

Shell模块

在远程主机上执行bash命令

相对于command而言,支持性更好一点,但是对于某些复杂的命令,也可能会执行失败

解决方法:可以把命令卸载脚本中,使用script模块执行脚本到远程主机

Script模块

可以发送shell脚本到远程主机上并执行

示例:

Copy模块

用于向复制文件到主机组中

参数解释:

示例:

File模块

用于对文件进行相关操作

参数解释:

示例:

Yum模块

用于远程操作主机下载软件包

参数说明:

示例:

Service模块

用于远程管理主机上的service服务类

参数说明:

示例:

Selinux模块

用于管理远程主机的selinux设置

参考说明:

示例:

Playbook(剧本)

介绍

Ansible playbook是一种可执行的YAML文件,用于描述如何部署和配置一个系统或应用程序。一个playbook由一个或多个play组成,每个play都针对特定的主机或主机组执行一系列任务。

一个playbook的基本结构如下:

在上面的例子中,我们定义了以下几个主要字段:

执行playbook剧本:

ansible-playbook xxxxx.yaml即可

快速开始

案例:服务安装

安装nginx并且修改配置文件

  1. 先编写一个nginx的子配置文件
  1. 编写playbook,要求是为目标机器安装nginx并且拷贝配置文件到该机器上,然后启动nginx。

image-20240817140758729

高级配置

fact(事实变量)

Ansible 内置了大量的事实(fact)变量,可以在 Playbook 中使用。这些事实变量可以帮助我们更好地了解目标主机的环境和配置信息,从而编写更加智能和动态的自动化脚本。

常用的内置事实变量包括:

  1. 操作系统信息:

    • ansible_distribution: 操作系统发行版名称,如 "CentOS"、"Ubuntu"
    • ansible_distribution_version: 操作系统版本号
    • ansible_os_family: 操作系统家族,如 "RedHat"、"Debian"
    • ansible_kernel: 内核版本
  2. 硬件信息:

    • ansible_processor: CPU 型号
    • ansible_processor_vcpus: 虚拟 CPU 核数
    • ansible_memtotal_mb: 内存总量(MB)
    • ansible_architecture: CPU 架构,如 "x86_64"
  3. 网络信息:

    • ansible_default_ipv4: 默认 IPv4 地址和网关
    • ansible_all_ipv4_addresses: 所有 IPv4 地址
    • ansible_interfaces: 所有网络接口名称
    • ansible_hostname: 主机名
  4. 其他信息:

    • ansible_user_id: 当前执行 Ansible 的用户 ID
    • ansible_date_time: 主机当前日期和时间
    • ansible_env: 主机环境变量
    • ansible_play_hosts: 当前 play 中涉及的所有主机

这些事实变量可以帮助我们编写出更加智能和定制化的 Playbook。比如,我们可以根据操作系统的不同,执行不同的软件包安装任务;根据 CPU 架构,选择合适的软件包版本;根据内存大小,调整应用程序的配置等。

循环迭代

在playbook中,可以使用循环进行数据的迭代。这样一个模块就可以执行多次任务,因为往往我们部署一个服务的时候,都需要安装多个软件包的。

示例:使用yum循环安装软件包

或者:

这样就可以实现一个yum安装多个软件包了,避免了playbook过于臃肿。

RHCE真题讲解(2023-10)

创建一个名为 /home/student/ansible/packages.yml的 playbook:

  1. 将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上
  2. 将 Development Tools 软件包组安装到 dev 主机组中的主机上
  3. 将 dev 主机组中主机上的所有软件包更新为最新版本

案例:循环创建用户

循环创建用户,用户信息如下 名称、组、家目录、shell、描述信息 zhangsan xsb /home/xsb/zhangsan /bin/bash 销售 lisi xsb /home/xsb/lisi /bin/bash 销售 wangwu jsb /home/jsb/wangwu /bin/sh java工程师 maliu jsb /home/jsb/maliu /bin/sh linux工程师 zhaoqi cwb /home/cwb/zhaoqi /bin/sh 会计

循环创建出以上用户并指定用户信息:

 

条件判断

在 Ansible Playbook 中,我们可以使用条件判断语句来根据不同的条件执行不同的任务。

when 语句:

when 语句是最常用的条件判断语句。它可以根据变量的值、事实(facts)或者 Jinja2 表达式来决定是否执行某个任务。

在这个例子中:

  1. 第一个任务会在 CentOS 7 系统上安装 httpd 和 mariadb-server 软件包。when 语句确保了只有在 ansible_distribution 等于 'CentOS' 且 ansible_distribution_major_version 等于 7 时,这个任务才会执行。
  2. 第二个任务会在 CentOS 8 系统上安装 nginx 和 mysql-server 软件包。同样的,when 语句确保了只有在 ansible_distribution 等于 'CentOS' 且 ansible_distribution_major_version 等于 8 时,这个任务才会执行。

RHCE真题讲解(2023-10-)

考试原题(第八题):

创建一个名为/home/student/ansible/parted.yml 的playbook,它将在dev主机组上运行下列任务

  1. 如果磁盘/dev/vdd存在,则创建1500m分区
  2. 如果无法创建请求的分区大小,应显示错误消息 Could not create partition of that size,并且应改为使用大小 800m。
  3. 如果磁盘/dev/vdd不存在 ,应显示错误消息 disk /dev/vdd does not exist。
  4. 如果磁盘/dev/vdb存在,则创建1500m分区
  5. 如果无法创建请求的分区大小,应显示错误消息 Could not create partition of that size,并且应改为使用大小 800m。
  6. 最后分区都要格式化为ext4文件系统,并挂载在/mnt/fs01上

简化题目:在所有机器上创建sdb1分区,大小为1Gib,前提是sdb存在,如果不存在,请提示.......

验证:

Jinjia2模板

Jinja2是一个功能强大的Python模板引擎,它被广泛应用于Ansible的playbook中。Jinja2模板语法提供了丰富的功能,使得在playbook中插入动态内容变得更加容易和灵活。

简单来讲,就是将原本静态的playbook转变为动态的。

RHCE真题讲解(2023-10)

原题(第九题):生成主机文件

  1. 编写模板文件/home/student/ansible/hosts.j2 ,针对每个清单主机包含一行内容,其格式与 /etc/hosts 相同。
  2. 创建名为 /home/student/ansible/hosts.yml 的playbook,它将使用此模板在 dev 主机组中的主 机上生成文件 /etc/myhosts。
  3. 该 playbook 运行后,dev 主机组中主机上的文件/etc/myhosts 应针对每个受管主机包含一行内 容。

题目变更如下:

我们使用jinjia2和ansible内置变量动态的生成hosts文件,并且发送给远程主机

  1. 编写模板文件
  1. 编写hosts.yaml剧本来渲染并且发送该模板文件到目标主机,使之替换原本的hosts
  1. 检查并验证:

案例:生成nginx配置文件

我们可以在playbook中自定义变量,然后更具自定义的变量使用jinjia2模板渲染nginx的配置文件

  1. 先编写nginx.yaml剧本,在里面定义变量
  1. 编写nginx子配置文件site.conf,子配置文件中使用jinjia2语法进行渲染
  1. server1上验证配置文件是否渲染成功

Role(角色)

Ansible 中的 Role 是一种组织和重用代码的强大方式。角色可以帮助你将相关的任务、变量、文件等集中管理,使得代码更加模块化和可重用。

如果将所有的play都写在一个playbook中,很容易导致这个playbook文件变得臃肿庞大,且不易读。因此,可以将多个不同任务分别写在不同的playbook中,然后使用include将其包含进去即可。而role则是整合playbook的方式。无论是include还是role,其目的都是分割大playbook以及复用某些细化的play甚至是task。

目录结构

在角色中,将task,templates,handlers,files等内容都分开存放,然后再playbook中直接调用角色即可.....

初始化自定义Role

可以使用ansible-galaxy工具通过init选项初始化一个角色

案例:使用Role安装httpd

  1. 初始化httpd角色
  1. 编写角色中的task
  1. 编写角色中的file
  1. 编写一个playbook剧本调用该角色
  1. 验证

image-20240817160722766

RHCE真题讲解(2023-10)

题目(第六题):

根据下列要求,在 /home/student/ansible/roles中创建名为 apache 的角色:

  1. httpd软件包已安装,设为在系统启动时启用
  2. 防火墙已启用并正在运行,并使用允许访问 Web 服务器的规则
  3. 模板文件 index.html.j2 已存在,用于创建具有以下输出的文件 /var/www/html/index.html: Welcome to HOSTNAME on IPADDRESS 其中,HOSTNAME 是受管节点的完全限定域名,IPADDRESS 则是受管节点的 IP 地址。
  4. 按照下方所述,创建一个使用此角色的 playbook /home/student/ansible/newrole.yml: 该 playbook 在 webservers 主机组中的主机上运行

#