当前位置: 首页 > news >正文

Kylin麒麟操作系统服务部署 | Ansible基础

以下所使用的环境为:
虚拟化软件: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工作原理

  1. 用户登录控制主机:通过配置文件受管节点部署Ansible或单行命令
  2. 控制主机和受管节点之间支持 local、SSH、ZeroMQ 三种连接方式,默认使用SSH的。在规模较大的情况下使用ZeroMQ连接方式会明显改善执行速度。
  3. 控制主机读取用户的部署任务:根据自己hosts文件中定义的受管节点查找对应机器地址(IP地址或域名)
  4. 控制主机下发任务:管理机通过SSH免密连接受管节点,下发任务模块给受管节点临时目录
  5. 受管节点执行任务,任务完毕后删除模块
  6. 受管节点将执行结果返回给控制主机

在这里插入图片描述

返回结果字体颜色

  • 绿色:未发生变化
  • 黄色:更改生效
  • 红色:执行错误

二、Ansible安装

1. Ansible的安装方式

使用YUM安装,需要提前配置eple源或使用Kylin自带的网络源

yum install -y ansible

使用pip安装

pip install ansible

如果没有安装pip,需要先安装pip

yum install python-setuptools easy_install pip

2. 安装Ansible

以下使用麒麟自带的网络源进行安装

yum install -y 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-consoleREPL控制台执行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]: 验证:使用控制主机访问受管节点

ssh root@192.168.110.2

在这里插入图片描述

三、 管理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-inventory --list

在这里插入图片描述

六、Ansible查找文档

Ansible查找所有模块

ansible-doc -l

在这里插入图片描述

Ansible查找指定模块

ansible-doc file

在这里插入图片描述

Ansible查找指定模块,以幻灯片形式

ansible-doc -s file

常用的模块

模块名说明
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-1192.168.110.1/24控制主机
Kylin-2192.168.110.2/24受管节点

[Step1]: Kylin-1配置:安装Ansible

yum install -y 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

vim http.yml
# 文件内容如下

---
- 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:重定向覆盖内容

echo "aaa" > demo.txt

在这里插入图片描述

案例2:追加内容

echo "bbb" >> demo.txt

在这里插入图片描述

探究:在上述命令中,我们使用了一条 “echo “aaa” > demo.txt” ,这其实是省略写法

echo "aaa"是一个标准输出,执行 echo “aaa” 产生的标准输出然后重定向到demo.txt

echo "aaa" 1 > demo.txt	

案例3:将错误信息过滤掉

2是标准错误,意思将错误信息重定向到err.txt文件中

cat aaa.txt 2> err.txt

在这里插入图片描述

案例4:将标准输出和标准错误输出重定向到文件中

等同于将 > + 2>&1,将标准错误和标准输入重定向到demo.log中

bash demo.sh &>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节点

ls -i myfile

在这里插入图片描述

显示文件的状态信息

stat myfile

在这里插入图片描述

3. 硬链接和软链接

硬链接的特点:

  • 同一个文件,多个名称
  • 以文件副本的形式存在,但不占用实际空间(inode编号相同)
  • 不支持跨分区(不能跨文件系统),不支持对目录创建
  • 删除硬链接后,链接数会发生改变
  • 硬链接的文件类型跟随着之前的文件类型

软链接的特点:

  • 不同的文件(inode编号不同),支持跨分区
  • 支持对目录创建,原始文件和软链接存在依赖,原始文件删除了,软链接会失效
  • 删除一个软链接,链接数不会发生改变,删除的相当于是一个快捷方式
  • 文件类型为:l

[Step1]: 先本地生成1个500M的文件

dd if=/dev/zero of=FILE count=1 bs=500M

在这里插入图片描述

[Step2]: 为FILE文件创建1个软链接,链接名为:file01。链接大小比源文件小,源文件的链接数没有发生改变

ln -s FILE file01

在这里插入图片描述

[Step3]: 查看源文件FILE和链接文件file01的inode,可以看到inode不一致

ls -i FILE
ls -i file01

在这里插入图片描述

[Step4]: 为FILE文件创建1个硬链接,链接名为:file02。可以看到硬链接的大小和源文件大小一致,源文件的链接数+1

ln FILE file02

在这里插入图片描述

[Step4]: 查看源文件FILE和链接文件file02的inode,可以看到inode一致

在这里插入图片描述

[Step5]: 删除原始文件FILE,可以看到软链接失效了,而硬链接正常

在这里插入图片描述

相关文章:

  • 使用 Python 爬取 item_get_video 接口获取某书笔记详情
  • IDEA 创建SpringCloud 工程(图文)
  • Python----计算机视觉处理(Opencv:二值化,阈值法,反阈值法,截断阈值法,OTSU阈值法)
  • 小学数学原理1:14 - 为什么是减法?
  • 云创智城 ×YunParking停车源码+YunCharge充电源码+DeepSeek:AI 驱动城市级停车平台升级,构建安全智慧出行新生态
  • 搜索 之 组合问题
  • Kubernetes Pod 生命周期详解 之 探针
  • 函数(函数的概念、库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、函数的声明和定义、static和extern)
  • 【面试题系列】Redis 常见面试题答案
  • 蓝桥杯备考:数据结构堆之第k小
  • mapbox高阶,结合threejs(threebox)添加extrusion挤出几何体
  • LeeCode题库第四十九题
  • ES6 字符串和正则表达式
  • 72. 编辑距离
  • 线性搜索算法
  • 《几何原本》命题I.31
  • JVM常用概念之代际障碍
  • Selenium的免登录和滚动条到底部的学习总结(3)
  • 焕新|16GB+1TB 、UV 双段,AORO M8 防爆手机安全性能双升级
  • 使用pnpm管理前端项目依赖
  • 纽约市长称墨海军帆船撞桥已致2人死亡,撞桥前船只疑似失去动力
  • 用贝多芬八首钢琴三重奏纪念风雨并肩20年
  • 六省会共建交通枢纽集群,中部离经济“第五极”有多远?
  • 江苏省委组织部副部长高颜已任南京市委常委、组织部部长
  • 韧性十足的中国外贸企业:“不倒翁”被摁下去,还会再弹起来
  • 辽宁盘山县一乡镇幼儿园四名老师被指多次殴打一女童,均被行拘