|
以下所使用的环境为:
虚拟化软件:VMware Workstation 17 Pro
麒麟系统版本:Kylin-Server-V10-SP3-2403-Release-20240426-x86_64
一、自动化运维工具
Ansible:基于Python开发,分布式无需客户端、轻量级,配置语言采用YAML
SaltStack:基于Python开发,采用C/S架构,现对于puppet更加轻量化,配置语法采用YMAL,配置脚本更为简单
Puppet:基于Ruby开发,采用C/S架构,扩展性强,基于SSL认证
1. Ansible概述
Ansible 是一个开源的自动化平台,用于配置管理、应用部署和IT任务自动化。它使用YAML(一种易于阅读和编写的数据序列化格式)来编写自动化脚本,这些脚本被称为“playbooks”。Ansible 旨在通过SSH(Secure Shell)协议与远程节点(无论是物理机还是虚拟机)进行通信,从而无需在远程节点上安装任何客户端软件(即Ansible是agentless的)。这种设计使得Ansible的部署和管理变得非常简单和灵活。
Ansible这个名称最初并非直接来源于某个具体的科幻小说,但它与科幻作品中的超光速通讯装置有着紧密的联系。据多个来源提及,Ansible的命名受到了科幻作家们笔下超光速通讯工具的影响,这些工具在小说中常被描述为能够跨越时空进行即时通讯的装置。
Ansible的命名与奥森·斯科特·卡德(Orson Scott Card)的科幻小说《安德的游戏》(Ender’s Game)中的安塞波(Ansible)密切相关。在这部小说中,安塞波是一种虚构的超光速通讯装置,主角安德和他的伙伴们通过它跨越时空指挥无数的战舰。这种跨越时空的即时通信能力,与Ansible作为自动化运维工具在IT基础设施中实现的远程管理和控制功能相呼应。
Ansible的作用
批量远程执行命令 批量配置软件 二次开发:如JumpServer底层借助Ansible实现自动化管理 通过Playbook实现更复杂IT任务的部署(如一套架构)
Ansible的基本架构
Ansible:核心程序 Host Inventory:主机清单,Ansible管理的主机信息(包括IP地址、SSH端口号、账号、密码等) Playbooks:剧本,YAML格式,模块化定义一系列任务,供外部统一调用 Core Modules:核心模块,所有任务均由模块完成 Custom Modules:自定义模块 ,完成核心模块无法完成的任务,支持任意语言编写 Connection Plugins:连接插件,建立Ansible与其它主机间的通信
2. Ansible工作原理
Ansible工作原理
用户登录控制主机:通过配置文件受管节点部署Ansible或单行命令 控制主机和受管节点之间支持 local、SSH、ZeroMQ 三种连接方式,默认使用SSH的。在规模较大的情况下使用ZeroMQ连接方式会明显改善执行速度。 控制主机读取用户的部署任务:根据自己hosts文件中定义的受管节点查找对应机器地址(IP地址或域名) 控制主机下发任务:管理机通过SSH免密连接受管节点,下发任务模块给受管节点临时目录 受管节点执行任务,任务完毕后删除模块 受管节点将执行结果返回给控制主机
返回结果字体颜色
二、Ansible安装
1. Ansible的安装方式
使用YUM安装,需要提前配置eple源或使用Kylin自带的网络源使用pip安装如果没有安装pip,需要先安装pip- yum install python-setuptools easy_install pip
复制代码 2. 安装Ansible
以下使用麒麟自带的网络源进行安装
YUM安装后的配置文件默认目录为:/etc/ansible
**ansible.cfg:**定义Ansible主机的默认配置文件,如:是否需要输入密码、是否开启sudo、hosts主机清单位置 **hosts:**主机清单,保存管理的主机信息,默认文件为hosts **roles:**公共角色,Ansible从1.2版本引入的新特性,用于层次性、结构化的组织playbook,roles能够根据层次性结构自动安装变量文件、tasks以及handlers等
3. Ansible的常见命令
常见命令
命令 | 说明 | ansible | 定义并运行简单任务(ad-hoc临时命令) | ansible-config | 查看、编辑、管理Ansible配置 | ansible-doc | 文档查看工具 | ansible-galaxy | 共享和下载角色的工具 | ansible-inventory | 查看主机清单信息 | ansible-playbook | 执行playbook | ansible-pull | 从仓库中拉取 playbooks | ansible-vault | 加解密文件 | ansible-console | REPL控制台执行Ansible任务 | 4. SSH免密登陆
因为Ansible是基于SSH协议与受管节点进行通信。在管理多台主机时,无法保证主机的密码都一致,可以通过构建密钥验证的SSH体系解决SSH连接问题。
[Step1]: 在控制主机上创建密钥对- ssh-keygen -t rsa # 指定加密方式为rsa
复制代码
[Step2]: 上传公钥文件到受管节点,受管节点会自动将公钥保存在/root/.ssh目录下- ssh-copy-id -i /root/.ssh/id_rsa_pub 192.168.110.2
复制代码ssh-copy-id:复制SSH公钥到远程主机 -i /root/.ssh/id_rsa_pub:指定公钥文件路径 192.168.110.2:受管节点
[Step3]: 验证:使用控制主机访问受管节点
三、 管理Ansible配置文件
Ansible的配置文件作用是指导ansible工具的功能设置。安装Ansible软件后,会自动生成配置文件
/etc/ansible/ansible.cfg 用于配置多个Ansible工具行为
管理Ansible设置
可以通过在多个目录中创建 ansible.cfg 文件,以应用多个Ansible工具的设置。Ansible配置文件由几个部分组成,每一部分含有以键值对形式定义的设置,
[default]:用于设置Ansible操作的默认值 [privilege_escalation]:用于配置Ansible如何在受管主机上执行特权升级
常用参数
指令 | 描述 | inventory | 指定清单文件的路径 | remote_user | 指定Ansible用于连接客户机的用户名,如果未指定则使用当前用户的名称 | ask_pass | 指示是否提示输入SSH密码 | become | 指定连接后是否在客户机上自动切换用户 | become_method | 指定切换用户的方式(默认为sudo) | become_user | 指定在客户端上切换到哪个用户(默认为root) | become_ask_pass | 是否提示输入become_method的密码 | Ansible配置解析
在较新的系统中,建议使用become_user代替sudo_user。- [defaults]# 默认配置inventory=/etc/ansible/hosts # 主机清单位置
- library = /usr/share/my_modules/ # 自定义模块存放目录
- module_utils = /usr/share/my_module_utils/ # Ansible模块工具目录
- remote_tmp = ~/.ansible/tmp # py命令存放的临时目录
- local_tmp = ~/.ansible/tmp # 本机临时命令执行目录
- plugin_filters_cfg = /etc/ansible/plugin_filters.yml # 插件过滤器位置
- forks =5# 默认并发数,存在多台主机时,会5台5台主机的执行
- poll_interval =15# 检查远程任务执行状态时等待的时间间隔(秒)
- sudo_user = root # sudo切换的用户,默认sudo的用户为root
- ask_sudo_pass = True # sudo是否提示输入密码
- ask_pass = True # 是否询问ssh密码
- transport = smart # 指定与受管主机的通信的传输方式
- remote_port =22# 连接远程主机使用的SSH端口号
- module_lang = C # 指定了模块使用的语言
- module_set_locale = False # 控制是否根据远程主机的环境设置来设置模块的本地化[privilege_escalation]# 控制特权升级(即提权)相关的设置become=True # 是否在客户机上自动切换用户become_method=sudo # 用于特权升级的方法(可选值:sudo、su、pbrun、doas)become_user=root # sudo切换的用户 become_ask_pass=False # 提权是否要提示输入密码
复制代码 Ansible通常不需要修改太多默认配置,其中有一项需要更改- vim /etc/ansible/ansible.cfg
- # 修改下列选项
- host_key_checking = False # SSH连接时不检查远程主机的SSH密钥的指纹信息
复制代码 默认在第一次进行SSH连接时,会提示是否记录SSH密钥的指纹信息
四、Ansible配置文件生效范围
自定义配置文件
ansible配置文件可以存在于不同位置
/etc/ansible/ansible.cfg:默认路径 ~/.ansible.cfg:家目录 ~/ansible/ansible.cfg:工作目录(相当于在家目下新建一个ansible,ansible称为工作目录) /etc/profile:环境变量
优先级:变量 > 当前目录 > 用户家目录 > /etc
总结就是一句话:在没有环境变量的前提下,距离哪一个配置文件最近,则哪一个配置文件生效
[Step1]: 新建用户server- useradd server
- echo Kylin2024 |passwd--stdin server
复制代码 [Step2]: 切换到server用户,新建工作目录,进入工作目录,在工作目录中新建ansible配置文件- su - server
- mkdir ~/ansible
- cd ~/ansible
- touch ansible.cfg
复制代码 [Step3]: 验证:查看Ansible版本信息,可以看到配置文件的路径为当前的工作目录
[Step4]: 验证:切换默认配置文件路径下,查看Ansible版本信息,可以看到配置文件的路径为默认配置文件路径- cd /etc/ansible
- ansible --version
复制代码
五、 主机清单
清单定义Ansible管理的主机集合,这些主机可以分配到组中,以进行集中管理。组可以包含子组,主机可以是多个组的成员。清单还可以设置应用到它所定义的主机和组的变量。
定义主机清单可以采用以下两种方式
使用文本文件定义静态主机清单 通过外部信息提供程序,使用Ansible插件按需生成动态主机清单
使用简单的 ini 样式的静态清单文件
嵌套组通过创建后缀为:children的主机组名称来定义 可以通过范围简化主机规格:【start:end】
- web.meaauf.com # 不受任何组管理的主机写最上面10.1.1.1
- [group1]# 组名192.168.10.1 # 纳管主机
- server.meaauf.com # 域名方式指定纳管主机172.16.30.[1:10]# 代表纳管172.16.30.1-172.16.30.10[group2:children]# 嵌套组,组名需要带children
- group1 # 嵌套组只能包含组名不包含主机
复制代码 覆盖清单位置
安装Ansible软件后,在/etc/ansible/hosts位置提供一个默认主机清单,属于全局管理范围。 特权用户管理时可以为其在工作目录中创建清单,在工作目录中使用Ansible时,优先度最高。
- /home/sserver/ansible/xxxx # 针对某个用户设置清单
- /etc/ansible/hosts # 针对全局设置
复制代码 1. 主机清单练习
案例需求
192.168.110.1是server主机组的成员 192.168.110.2 ~ 192.168.110.4 是network主机组的成员 server组是web主机组的成员
[Step1]: 编辑默认清单文件- vim /etc/ansible/hosts
- # 写入下列内容[server]192.168.110.1
- [network]192.168.110.[2:4][web:children]
- server
复制代码 [Step2]: 验证:以标准输出方式展示清单内容
六、Ansible查找文档
Ansible查找所有模块
Ansible查找指定模块
Ansible查找指定模块,以幻灯片形式常用的模块
模块名 | 说明 | file | 用于设置文件属性 | yum | 安装软件包 | cron | 设置计划任务 | copy | 复制文件到远程主机 | command | 在远程主机上执行命令 | raw | 类似于command模块,支持管道 | user | 用户配置 | group | 用户组配置 | service | 管理服务 | ping | 测试远程主机 | setup | 查看远程主机信息 | mount | 配置挂载点 | 七、Ansible Playbook
1. Playbook概述
play是针对清单中选定的主机运行的一组有序任务 Playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表 临时命令可以作为一次性命令对一组主机运行一项简单的任务 Playbook可以通过轻松重复的方式对一组目标主机执行多项复杂的任务 Playbook命令工具自上向下的顺序依次执行
2. YAML语法
playbook是使用YAML语法编写的文本文件,后缀名为[.yml] 严格缩进和空格 YAML文件以---开头,以...结束(结束可以省略不写) 使用-(减号加一个或多个空格)作为列表项 注释符为:#
调整Tab键缩进
永久调整缩进:vim ~/.vimrc–>set tabstop=2 当前调整缩进:set tabstop=2
整体缩进(视图模式)
按 Ctrl+v 进入视图模式 通过 j 选择行,或者 G 直接选中剩余所有行 按 I 进入编辑模式 在调整完后,按 Esc 键应用
yaml示例- ---# yaml语法:开头 -name: install httpd # paly任务的描述:描述部分可选hosts: node1 # 指定目标主机tasks:# 任务列表,下面为任务模块-name: Install Apache # 任务模块,与tasks有两个字符缩进
- ansible.builtin.yumL # 模块名name: httpd # 模块参数、模块选项state: latest # 模块参数、模块选项...# yaml语法:结尾(可省略)
复制代码 八、 Ansible简单案例配置
案例需求
编辑清单文件,192.168.110.2是hosts主机组的成员 在hosts主机组中安装Apache服务
节点设置
主机 | 网络信息 | 说明 | Kylin-1 | 192.168.110.1/24 | 控制主机 | Kylin-2 | 192.168.110.2/24 | 受管节点 | [Step1]: Kylin-1配置:安装Ansible[Step2]: Kylin-1配置:编辑清单文件- vim /etc/ansible/hosts
- # 写入下列内容[hosts]192.168.110.2
复制代码
[Step3]: Kylin-1配置:编辑主配置文件- cd /etc/ansible
- vim /etc/ansible/ansible.cfg
- # 修改下列选项
- host_key_checking = False
复制代码 [Step4]: Kylin-1配置:编辑playbook- # 文件内容如下----name: Install Httpd
- hosts: hosts
- tasks:-name: install the latest version of Apache
- yum:name: httpd
- state: latest
复制代码 [Step5]: Kylin-1验证:试运行Playbook- ansible-playbook http.yml -C
复制代码
[Step6]: Kylin-1验证:运行Playbook- ansible-playbook http.yml
复制代码
[Step7]: Kylin-1验证:通过Ad-hoc查看受管主机是否安装Apache- ansible -m shell -a"rpm -qa httpd" all
复制代码
九、错误汇总
1. Python版本错误
错误信息- "`python2-dnf` is not installed, but it is requiredfor the Ansible dnf module."
复制代码
错误原因
python2-dnf 包不存在:系统尝试安装 python2-dnf,但是找不到这个包。这通常是因为你的系统已经不再支持 Python 2,并且 dnf 本身也通常是与 Python 3 一起打包的。 使用了 Python 2.7:尽管错误信息中提到了 Python 2.7,但现代 Linux 发行版(如 CentOS 8 及更高版本)默认使用 Python 3,并且不再提供对 Python 2 的广泛支持
解决办法- vim /etc/ansible/ansible.cfg
- # 在[defaults]中添加下列命令[defaults]
- interpreter_python = /usr/bin/python3 # 指定 Python 解释器为 Python 3
复制代码 十、其它补充
1. 标准输入输出符号
在Linux的环境中,通常需要执行一些脚本,存在几个特殊的符号,不同的符号含义不同。
**>:**将符号前结果重定向到符号后文件中,会直接覆盖内容 **>>:**将符号前结果重定向到符号后文件中,在文件末尾追加内容,不会覆盖 **0:**标准输入stdin **1:**标准输出stdout **2:**标准错误stderr **&>:**这是Bash中的特有的重定向语法,是>和2>&1的简写形式,用于将产生的标准输出和标准错误都重定向到文件中 **2>&1:**将标准错误重定向到标准输出中
案例1:重定向覆盖内容
案例2:追加内容
探究:在上述命令中,我们使用了一条 “echo “aaa” > demo.txt” ,这其实是省略写法
echo "aaa"是一个标准输出,执行 echo “aaa” 产生的标准输出然后重定向到demo.txt案例3:将错误信息过滤掉
2是标准错误,意思将错误信息重定向到err.txt文件中
案例4:将标准输出和标准错误输出重定向到文件中
等同于将 > + 2>&1,将标准错误和标准输入重定向到demo.log中2>&1将错误信息重定向到标准输出,也就是相当于重定向到demo.log中- bash demo.sh >demo.log 2>&1
复制代码 2. inode索引节点
inode编号用于在文件系统中唯一地标识一个文件或目录,这种唯一性确保了文件或目录的元数据可以被准确地访问和修改。文件或目录的数据存储在磁盘的数据块中。inode中包含了指向这些数据块的指针,因此,通过inode编号可以快速地定位到文件或目录的实际数据。
文件系统的许多操作,如文件的创建、删除、读取、修改等,都需要通过inode编号来访问和操作文件的元数据。
案例说明
假如现在存在一个名为“myfile”的文件,其inode编号为137393488。当我们需要读取 “myfile”文件内容时,文件系统会使用inode编号137393488来查找对应的inode节点,从而获取指向文件数据块的指针,最终读取到文件的内容。
查看指定文件的inode节点
显示文件的状态信息
3. 硬链接和软链接
硬链接的特点:
同一个文件,多个名称 以文件副本的形式存在,但不占用实际空间(inode编号相同) 不支持跨分区(不能跨文件系统),不支持对目录创建 删除硬链接后,链接数会发生改变 硬链接的文件类型跟随着之前的文件类型
软链接的特点:
不同的文件(inode编号不同),支持跨分区 支持对目录创建,原始文件和软链接存在依赖,原始文件删除了,软链接会失效 删除一个软链接,链接数不会发生改变,删除的相当于是一个快捷方式 文件类型为:l
[Step1]: 先本地生成1个500M的文件- ddif=/dev/zero of=FILE count=1bs=500M
复制代码
[Step2]: 为FILE文件创建1个软链接,链接名为:file01。链接大小比源文件小,源文件的链接数没有发生改变
[Step3]: 查看源文件FILE和链接文件file01的inode,可以看到inode不一致
[Step4]: 为FILE文件创建1个硬链接,链接名为:file02。可以看到硬链接的大小和源文件大小一致,源文件的链接数+1
[Step4]: 查看源文件FILE和链接文件file02的inode,可以看到inode一致
[Step5]: 删除原始文件FILE,可以看到软链接失效了,而硬链接正常
|
|