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工作原理
用户登录控制主机:通过配置文件受管节点部署Ansible或单行命令 控制主机和受管节点之间支持 local、SSH、ZeroMQ 三种连接方式,默认使用SSH的。在规模较大的情况下使用ZeroMQ连接方式会明显改善执行速度。 控制主机读取用户的部署任务:根据自己hosts文件中定义的受管节点查找对应机器地址(IP地址或域名) 控制主机下发任务:管理机通过SSH免密连接受管节点,下发任务模块给受管节点临时目录 受管节点执行任务,任务完毕后删除模块 受管节点将执行结果返回给控制主机
返回结果字体颜色
绿色:未发生变化 黄色:更改生效 红色:执行错误
二、Ansible安装
1. Ansible的安装方式
使用YUM安装,需要提前配置eple源或使用Kylin自带的网络源
yum install-y ansible使用pip安装
pip install ansible如果没有安装pip,需要先安装pip
yum install python-setuptools easy_install pip2. 安装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执行playbookansible-pull从仓库中拉取 playbooksansible-vault加解密文件ansible-consoleREPL控制台执行Ansible任务4. SSH免密登陆
因为Ansible是基于SSH协议与受管节点进行通信。在管理多台主机时,无法保证主机的密码都一致,可以通过构建密钥验证的SSH体系解决SSH连接问题。
: 在控制主机上创建密钥对
ssh-keygen -t rsa # 指定加密方式为rsa
: 上传公钥文件到受管节点,受管节点会自动将公钥保存在/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:受管节点
: 验证:使用控制主机访问受管节点
ssh root@192.168.110.2
三、 管理Ansible配置文件
Ansible的配置文件作用是指导ansible工具的功能设置。安装Ansible软件后,会自动生成配置文件
/etc/ansible/ansible.cfg 用于配置多个Ansible工具行为
管理Ansible设置
可以通过在多个目录中创建 ansible.cfg 文件,以应用多个Ansible工具的设置。Ansible配置文件由几个部分组成,每一部分含有以键值对形式定义的设置,
:用于设置Ansible操作的默认值 :用于配置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。
# 默认配置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 # 控制是否根据远程主机的环境设置来设置模块的本地化# 控制特权升级(即提权)相关的设置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
总结就是一句话:在没有环境变量的前提下,距离哪一个配置文件最近,则哪一个配置文件生效
: 新建用户server
useradd server
echo Kylin2024 |passwd--stdin server: 切换到server用户,新建工作目录,进入工作目录,在工作目录中新建ansible配置文件
su - server
mkdir ~/ansible
cd ~/ansible
touch ansible.cfg: 验证:查看Ansible版本信息,可以看到配置文件的路径为当前的工作目录
: 验证:切换默认配置文件路径下,查看Ansible版本信息,可以看到配置文件的路径为默认配置文件路径
cd /etc/ansible
ansible --version
五、 主机清单
清单定义Ansible管理的主机集合,这些主机可以分配到组中,以进行集中管理。组可以包含子组,主机可以是多个组的成员。清单还可以设置应用到它所定义的主机和组的变量。
定义主机清单可以采用以下两种方式
使用文本文件定义静态主机清单 通过外部信息提供程序,使用Ansible插件按需生成动态主机清单
使用简单的 ini 样式的静态清单文件
嵌套组通过创建后缀为:children的主机组名称来定义 可以通过范围简化主机规格:【start:end】
web.meaauf.com # 不受任何组管理的主机写最上面10.1.1.1
# 组名192.168.10.1 # 纳管主机
server.meaauf.com # 域名方式指定纳管主机172.16.30.# 代表纳管172.16.30.1-172.16.30.10# 嵌套组,组名需要带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主机组的成员
: 编辑默认清单文件
vim /etc/ansible/hosts
# 写入下列内容192.168.110.1
192.168.110.
server: 验证:以标准输出方式展示清单内容
ansible-inventory --list
六、Ansible查找文档
Ansible查找所有模块
ansible-doc -l
Ansible查找指定模块
ansible-doc file
Ansible查找指定模块,以幻灯片形式
ansible-doc -sfile常用的模块
模块名说明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受管节点: Kylin-1配置:安装Ansible
yum install-y ansible: Kylin-1配置:编辑清单文件
vim /etc/ansible/hosts
# 写入下列内容192.168.110.2
: Kylin-1配置:编辑主配置文件
cd /etc/ansible
vim /etc/ansible/ansible.cfg
# 修改下列选项
host_key_checking = False: Kylin-1配置:编辑playbook
vim http.yml# 文件内容如下----name: Install Httpd
hosts: hosts
tasks:-name: install the latest version of Apache
yum:name: httpd
state: latest: Kylin-1验证:试运行Playbook
ansible-playbook http.yml -C
: Kylin-1验证:运行Playbook
ansible-playbook http.yml
: 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
# 在中添加下列命令
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.log2>&1将错误信息重定向到标准输出,也就是相当于重定向到demo.log中
bash demo.sh >demo.log 2>&12. inode索引节点
inode编号用于在文件系统中唯一地标识一个文件或目录,这种唯一性确保了文件或目录的元数据可以被准确地访问和修改。文件或目录的数据存储在磁盘的数据块中。inode中包含了指向这些数据块的指针,因此,通过inode编号可以快速地定位到文件或目录的实际数据。
文件系统的许多操作,如文件的创建、删除、读取、修改等,都需要通过inode编号来访问和操作文件的元数据。
案例说明
假如现在存在一个名为“myfile”的文件,其inode编号为137393488。当我们需要读取 “myfile”文件内容时,文件系统会使用inode编号137393488来查找对应的inode节点,从而获取指向文件数据块的指针,最终读取到文件的内容。
查看指定文件的inode节点
ls-i myfile
显示文件的状态信息
stat myfile
3. 硬链接和软链接
硬链接的特点:
同一个文件,多个名称 以文件副本的形式存在,但不占用实际空间(inode编号相同) 不支持跨分区(不能跨文件系统),不支持对目录创建 删除硬链接后,链接数会发生改变 硬链接的文件类型跟随着之前的文件类型
软链接的特点:
不同的文件(inode编号不同),支持跨分区 支持对目录创建,原始文件和软链接存在依赖,原始文件删除了,软链接会失效 删除一个软链接,链接数不会发生改变,删除的相当于是一个快捷方式 文件类型为:l
: 先本地生成1个500M的文件
ddif=/dev/zero of=FILE count=1bs=500M
: 为FILE文件创建1个软链接,链接名为:file01。链接大小比源文件小,源文件的链接数没有发生改变
ln-s FILE file01
: 查看源文件FILE和链接文件file01的inode,可以看到inode不一致
ls-i FILE
ls-i file01
: 为FILE文件创建1个硬链接,链接名为:file02。可以看到硬链接的大小和源文件大小一致,源文件的链接数+1
ln FILE file02
: 查看源文件FILE和链接文件file02的inode,可以看到inode一致
: 删除原始文件FILE,可以看到软链接失效了,而硬链接正常
页:
[1]