Ansible的使用

##### Ansible使用环境

- 控制节点
  - 安装Ansible软件
  - Python环境支持:Python>=2.6
  - 必要的模块:如PyYAML等
- 被控节点
  - 启用SSH服务
  - 允许控制节点登录,通常设置免密登录
  - Python环境支持

http://www.ansible.com/

#### 一、环境准备

配置好主机名、IP地址、YUM源。关闭防火墙和SELinux

pubserver挂载rocky镜像

web1添加两块20G硬盘

| 主机名    | IP地址         | 角色                |
| --------- | -------------- | ------------------- |
| pubserver | 192.168.88.240 | 控制节点            |
| web1      | 192.168.88.11  | 被控节点(webserver) |
| web2      | 192.168.88.12  | 被控节点(webserver) |
| db1       | 192.168.88.13  | 被控节点(database)  |

#### 二、部署配置、自定义ansible软件YUM源

> 控制节点==服务端
>
> 被控节点==客户端

##### 前置部署(控制节点服务端操作):

​    安装vsftpd软件并设置开机自启后开启服务,配置网络YUM以及开机自动挂载

​    刷新网络YUM源,确保通信正常

```shell
yum clean all; yum repoinfo
```

​    从真机上传ansible相关软件到pubserver主机

```shell
[root@真机 ~]# scp /linux-soft/s2/zzg/ansible_soft/* root@192.168.88.240:/var/ftp/rpms/
```

##### 开始部署:

​    安装createrepo命令包

```shell
yum -y install createrepo_c
```

​    创建软件仓库信息

```shell
createrepo /var/ftp/rpms/
```

​    验证软件仓库下确保有repodata目录

​    增加自定义YUM源配置,在文件最后追加ansible源

```shell
[ansible-rpms]
name=ansible-rpms
baseurl="ftp://192.168.88.241/rpms"
enabled=1
gpgcheck=0
```

​    刷新网络YUM源

​    同步repo文件到所有被控节点

```shell
for i in 192.168.88.1{1..3}
    do
        scp /etc/yum.repos.d/ftp_Yum.repo root@$i:/etc/yum.repos.d/
    done
```

​    控制节点安装Ansible(服务端)

```shell
yum -y install ansible
```

​    查看安装版本

```shell
ansible --version
```

​    配置控制节点的hosts本地主机名解析文件,确保控制节点通过主机名访问到被控节点

```shell
vim /etc/hosts

192.168.88.241  pubserver
192.168.88.11   web1
192.168.88.12   web2
192.168.88.13   db1
```

​    连接,测试hosts文件配置正确

```shell
for i in pubserver web1 web2 db1
    do
        ping -c 2 $i
    done
```

​    配置控制节点免密登录被控节点

```shell
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N ''    #非交互生成秘钥对
```

​    发送公钥到被控节点

```shell
for i in web1 web2 db1
    do
        ssh-copy-id root@$i
    done
```

​    验证免密登录

```shell
for i in web1 web2 db1
    do
        ssh root@$i "hostname"
    done
#结果显示web1,web2,db1
```

##### 被控节点Ansible管理环境配置

- 配置目标
  - 使用Ansible软件管理多个环境,如开发环境、测试环境、生产环境
  - 多用户使用同一个控制节点管理不同主机
  - 每个用户有属于自己的配置环境(工作目录)
- Ansible配置文件查找顺序
  - 首先检测ANSIBLE_CONFIG变量定义的配置文件
  - 其次检查当前目录下的./ansible.cfg文件
  - 再次检查当前用户家目录下的~/ansible.cfg文件
  - 最后检查/etc/ansible/ansible.cfg文件
- 控制节点配置

> 创建自定义Ansible工作目录,在root家目录下创建ansible文件夹并进入可以自定义名称,以后关于ansible操作均在此目录下进行

​    配置ansible工具,在刚创建的工作目录下创建ansible.cfg配置文件和inventory清单列表文件

​    ansible.cfg配置文件修改内容:

```shell
[defaults]                  #通用配置
inventory = inventory       #主机清单列表文件名
host_key_checking = false   #不检查主机秘钥,非交互式ssh连接
```

​    inventory清单列表文件修改内容:

```shell
[webservers]        #定义主机组,名称自定义
web[1:2]            #[1:2]表示从1到2

[dbservers]
db1

[cluster:children]  #cluster为组名,:children为固定写法,表示为cluster的子组
webservers
dbservers
```

​    在工作目录下确认配置结果

```shell
ansible all --list-hosts            #查看所有被控主机列表
ansible webservers --list-hosts        #查看webservers组主机列表
ansible dbservers --list-hosts        #查看dbservers组主机列表
ansible cluster --list-hosts        #查看cluster组主机列表
```

#### 三、Ansible使用方法及常用模块

##### 使用方法

- ad-hoc临时命令
  - 在命令行下使用ansible命令调用Ansible模块,实现被控节点远程管理
  - 通常用于查询信息或临时简易操作
- Playbook剧本
  - 把管理任务以特定的格式编辑在文件中,通过ansible-playbook命令远程管理被控节点
  - 通常用于复杂任务设计及远程执行

​    ad-hoc命令语法格式:ansible    [主机、组列表或IP]    [参数]

​    常用参数

| -m   | 要执行的模块,默认为command                                  |
| ---- | ------------------------------------------------------------ |
| -a   | 模块的参数                                                   |
| -u   | ssh连接的用户名,默认用root,ansible.cfg中可以配置           |
| -f   | fork多少进程并发处理,默认为5个                              |
| -i   | 指定hosts主机清单列表文件路径,默认default=/etc/ansible/hosts |
| -M   | 要执行的模块路径,默认为/usr/share/ansible                   |
| -t   | 日志输出目录,日志文件名以主机命名                           |
| -k   | 使用密码登录远程主机,被控节点未做免密登录时可用             |

​    eg:ansible all -m ping    #ping模块用于测试是否可以SSH远程登录被控节点主机

> 返回结果为绿色的SUCCESS状态信息则为成功
>
> 返回结果为红色的UNREACHABLE则为失败
>
> 需要检测管理节点与被控节点网络和是否可以免密登录

​    Playbook剧本:略——详情看二阶段/3.Ansible/3_Day02.md

##### 模块简介

- Ansible在使用过程中通过模块来完成指定任务
- Ansible模块的本质是一个文件,通常是为实现具体功能的Python脚本
- Ansible已经有很多开发好的模块,可以直接调用,具备开发能力也可以自行开发
- 多数模块都支持使用参数,需要使用的时候指定参数
- 主要学习已有的常用模块的用途及常用参数

> 在Ansible中,模块的幂等性指的是模块执行操作时,如果目标状态已经符合预期,再次执行相同的操作不会产生任何改变,也就是说,模块的执行结果是可重复的,不会因为多次执行而产生不同的结果。这种特性非常重要,因为它可以确保自动化任务的可靠性,避免不必要的数据更改或资源消耗。

​    模块查询命令使用方法——ansible-doc

```shell
# 列出目前全部可用Ansible模块,按空格键向下翻页,按q退出返回命令行
ansible-doc -l

# 统计已有模块数量,WARNING信息直接忽略即可
ansible-doc -l | wc -l
7214

# 查看包含yum的模块
ansible-doc -l | grep yum

# 查看指定模块的帮助文档,按空格键向下翻页,按q退出返回命令行
ansible-doc yum
```

​    相关模块:

​    command模块

> Ansible的默认模块,用于在被控节点(客户端)执行Linux命令,不支持bash特性,如管道、重定向

```shell
ansible web1 -m command -a "hostname" #获取被控节点主机名
ansible web1 -a "ip a s"              #获取被控节点IP地址信息
```

​    shell模块

> 于在被控节点执行Linux命令,支持bash特性

```shell
# 获取IP信息前两行
ansible web1 -m shell -a "ip a s | head -2"
# 将IP地址信息重定向保存到指定文件
ansible web1 -m shell -a "ip a s > /opt/ip.txt"
# 确认重定向结果
ansible web1 -m shell -a "cat /opt/ip.txt"
```

​    script模块

> 用于在被控节点执行脚本,不局限于Shell脚本

```shell
ansible webservers -m script -a "test.sh" #执行test.sh脚本
```

-------------------------------------

---------------------

​    file模块

>  用于在被控节点创建文件、目录、链接文件等,还可以修改权限、归属
>
> 幂等性

```shell
## 常用参数
    path:指定文件路径
    owner:设置文件所有者
    group:设置文件所属组
    state:状态
        touch表示创建文件
        directory表示创建目录
        link表示创建软链接
        absent表示删除
    mode:设置权限
    src:source的简写,源
    dest:destination的简写,目标

#使用file模块创建文件、目录、软链接,但touch特殊创建同一文件只会刷新时间戳
ansible webservers -m file -a "path=/tmp/file.txt state=touch"
ansible web1 -m shell -a "ls -l /tmp | grep txt"
ansible webservers -m file -a "path=/tmp/demo state=directory"
ansible webservers -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"
#使用file模块修改文件权限和归属
ansible webservers -m file -a "path=/tmp/file.txt owner=sshd group=adm mode=0777"
#使用file模块删除被控节点指定文件、目录、软链接
ansible webservers -m file -a "path=/tmp/file.txt state=absent"
ansible webservers -m file -a "path=/tmp/demo state=absent"
ansible webservers -m file -a "path=/tmp/hosts.txt state=absent"
```

​    copy模块

> 用于将控制节点指定文件发送被被控节点(服务端上传、客户端下载)

```shell
## 常用参数
    src:源。控制端的文件路径
    dest:目标。被控制端的文件路径
    content:内容。需要写到文件中的内容

# 使用copy模块发送控制节点指定文件到被控节点指定目录并重命名(如果dest指定到目录则文件名不变)
ansible webservers -m copy -a "src=test.sh dest=/tmp/adduser.sh"

# 使用copy模块发送指定内容到被控节点并存储在文件中
ansible webservers -m copy -a "content='Hello World' dest=/tmp/mytest.txt"
```

​    fetch模块

> 用于将被控节点指定文件发送到控制节点(服务端下载、客户端上传)

```shell
## 常用参数
    src:源。被控制端的文件路径
    dest:目标。控制端的文件路径
    flat:不生成目录结构,只保留文件到指定目录

# 使用fetch模块收集被控节点指定文件到控制节点(默认在控制节点生成/dest_path/主机名/src_path/file)
ansible webservers -m fetch -a "src=/etc/hostname dest=~/"

# 使用fetch模块收集被控节点指定文件到控制节点(不生成目录结构,只保留文件到指定目录)
ansible web1 -m fetch -a "src=/etc/hosts dest=~/ flat=yes"
```

​    lineinfile模块

> 用于确保被控节点指定文件内有指定行。用于在远程主机上的文件中插入、替换或删除行,适用于编辑配置文件、脚本等文本文件,确保某些配置或内容的一致性,如添加环境变量、修改配置项等

```shell
## 常用参数
    path:待修改的文件路径
    line:写入文件的一行内容
    regexp:正则表达式,用于查找文件中的内容

# 确保/etc/issue文件中有Hello World行,如果不存在则追加到文件末尾,存在就不会添加
ansible webservers -m lineinfile -a "path=/etc/issue line='Hello World'"

# 替换/etc/issue文件中最后一个带Hello的整行替换成Hello Linux
ansible webservers -m lineinfile -a "path=/etc/issue regexp='Hello' line='Hello Linux'"
```

​    replace模块

> 用于关键词匹配替换

```shell
## 常用参数
    path:待修改的文件路径
    replace:将正则表达式查到的内容,替换成replace的内容
    regexp:正则表达式,用于查找文件中的内容

# 替换/etc/issue文件中所有Hello的字符串为Hi
ansible webservers -m replace -a "path=/etc/issue regexp='Hello' replace='Hi'"
```

-----------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------

​    user模块

> 用于实现Linux用户管理

```shell
## 常用参数
    name:待创建的用户名
    uid:用户ID
    group:设置主组
    groups:设置附加组
    home:设置家目录
    password:设置用户密码
    state:状态。present表示创建,它是默认选项。absent表示删除
    remove:删除家目录、邮箱等。值为yes或true都可以

# 使用user模块创建用户
ansible webservers -m user -a "name=tom"

# 使用user模块创建用户并设置用户属性,group是属组,groups是附加组
ansible webservers -m user -a "name=jim uid=1010 group=adm groups=daemon,root home=/home/jim"

# {{}}是固定格式,表示执行命令
# password_hash()是函数,sha512是加密算法
ansible webservers -m user -a "name=tom password={{'123456'|password_hash('sha512')}}"
ansible webservers -m user -a "name=tom state=absent"
ansible webservers -m user -a "name=jim state=absent remove=true"
```

​    group模块

> 用于实现Linux组管理

```shell
## 常用参数
    name:待创建的组名
    gid:组的ID号
    state:present表示创建,它是默认选项。absent表示删除

# 使用group模块创建devops组
ansible webservers -m group -a "name=devops"

# 使用group模块删除devops组
ansible webservers -m group -a "name=devops state=absent"
```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 提高编程:模板与 STL 深度剖析

摘要:本文深入探讨 C 提高编程中的模板编程与标准模板库(STL)相关内容。详细阐述模板编程中函数模板和类模板的概念、语法、特性及应用案例;对 STL 的诞生背景、基本概念、六大组件进行剖析,并对常用容器、函数对象、常…

C++(类模板的运用)

使用vector实现一个简单的本地注册登录系统 注册&#xff1a;将账号密码存入vector里面&#xff0c;注意防重复判断 登录&#xff1a;判断登录的账号密码是否正确 #include <iostream> #include <vector> #include <fstream> #include <sstream> usi…

【大模型】DeepSeek+蓝耕MaaS平台+海螺AI生成高质量视频实战详解

目录 一、前言 二、蓝耘智能云MaaS平台介绍 2.1 蓝耘智算平台是什么 2.2 平台优势 2.3 平台核心能力 三、海螺AI视频介绍 3.1 海螺AI视频是什么 3.2 海螺AI视频主要功能 3.3 海螺AI视频应用场景 3.4 海螺AI视频核心优势 3.5 项目git地址 四、蓝耘MaaS平台DeepSeek海…

接口自动化学习二:session自动管理cookie

session自动管理cookie&#xff1a; cookie中的数据&#xff0c;都是session提供的 实现步骤&#xff1a; 1.创建session对象&#xff1b;my_sessionrequests.Session() 2.使用session实例&#xff0c;调用get方法&#xff0c;发送获取验证码请求&#xff08;不需要提取cookie&…

C++类型转换详解

目录 一、内置 转 内置 二、内置 转 自定义 三、自定义 转 内置 四、自定义 转 自定义 五、类型转换规范化 1.static_case 2.reinterpret_cast 3.const_cast 4.dynamic_cast 六、RTTI 一、内置 转 内置 C兼容C语言&#xff0c;在内置类型之间转换规则和C语言一样的&am…

QEMU源码全解析 —— 块设备虚拟化(17)

接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(16) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社

mac 卸载流氓软件安全助手

之前个人电脑在公司使用过一段时间&#xff0c;为了使用网线联网安装了公司指定的 联软上网助手&#xff0c;谁知安装容易卸载难&#xff0c;后来找运维来卸载&#xff0c;输入管理员密码后&#xff0c;也无反应&#xff0c;最后不了了之了&#xff0c;这个毒瘤软件长期在后台驻…

Java 大视界 -- Java 大数据机器学习模型在智能客服多轮对话系统中的优化策略(179)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

极氪汽车云原生架构落地实践

云原生架构落地实践的背景 随着极氪数字业务的飞速发展&#xff0c;背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验&#xff0c;并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。 为快速响应用户的需求&#xff0c;例如…

Python•判断循环

ʕ⸝⸝⸝˙Ⱉ˙ʔ ♡ 判断🍰常用的判断符号(比较运算符)andor括号notin 和 not inif-elif-else循环🍭计数循环 forrange()函数简易倒计时enumerate()函数zip()函数遍历列表遍历元组遍历字符串遍历字典条件循环 while提前跳转 continue跳出循环 break能量站😚判断🍰 …

FreeRTOS与RT-Thread深度对比:从入门到精通的全面解析

FreeRTOS与RT-Thread深度对比&#xff1a;从入门到精通的全面解析 在嵌入式系统开发领域&#xff0c;实时操作系统(RTOS)扮演着至关重要的角色。FreeRTOS和RT-Thread作为两款主流的开源RTOS&#xff0c;各有特色&#xff0c;适用于不同的应用场景。本文将从小白到大神的角度&a…

OpenCV 图形API(18)用于执行两个矩阵(或数组)的逐元素减法操作函数sub()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 计算两个矩阵之间的逐元素差值。 sub 函数计算两个矩阵之间的差值&#xff0c;要求这两个矩阵具有相同的尺寸和通道数&#xff1a; dst ( I ) src…

LeetCode刷题SQL笔记

系列博客目录 文章目录 系列博客目录1.distinct关键字 去除重复2.char_length()3.group by 与 count()连用4.date类型有个函数datediff()5.mod 函数6.join和left join的区别1. **JOIN&#xff08;内连接&#xff0c;INNER JOIN&#xff09;**示例&#xff1a; 2. **LEFT JOIN&a…

其他合成方式介绍

在 SurfaceFlinger 的 Layer 处理逻辑中&#xff0c;除了常见的 Client Composition&#xff08;GPU合成&#xff09; 和 Device Composition&#xff08;HWC合成&#xff09;&#xff0c;还存在一些特殊的合成方式&#xff0c;比如 Sideband、Solid Color 和 Display Decorati…

GraphRAG与知识图谱

一、GraphRAG介绍 1.1 什么是 Graph RAG&#xff1f; Graph RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;是一种基于知识图谱的检索增强技术&#xff0c; 通过构建图模型的知识表达&#xff0c;将实体和关系之间的联系用图的形式进行展示&#xff…

一个开源的 VS Code 大模型聊天插件:Light-at

这篇文章是一个开发杂谈。对于有经验的开发者来说&#xff0c;可能这个项目并不算特别复杂或者高技术&#xff0c;只是对我个人来说算一个里程碑&#xff0c;因此写篇杂谈文章记录一下。也许也能给起步者一些参考。 项目地址&#xff1a;https://github.com/HiMeditator/light-…

SQL121 创建索引

-- 普通索引 CREATE INDEX idx_duration ON examination_info(duration);-- 唯一索引 CREATE UNIQUE INDEX uniq_idx_exam_id ON examination_info(exam_id);-- 全文索引 CREATE FULLTEXT INDEX full_idx_tag ON examination_info(tag);描述 现有一张试卷信息表examination_in…

【Pandas】pandas DataFrame set_flags

Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于获取 DataFrame 的行索引DataFrame.columns用于获取 DataFrame 的列标签DataFrame.dtypes用于获取 DataFrame 中每一列的数据类型DataFrame.info([verbose, buf, max_cols, …])用于提供 Dat…

Linux终止进程(kill process)的一些玩法

经常运行一个程序时&#xff0c;表面上已经终止了&#xff0c;实际上还在后台运行。一来呢&#xff0c;它可能占据端口&#xff0c;导致端口复用的时候报错。二来呢&#xff0c;它可能占用GPU&#xff0c;让你显存直接少一块。 尤其是在多进程程序&#xff0c;假如运行“python…

《比特城传奇:公钥、私钥与网络安全的守护之战》

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 第一章&#xff1a;双钥之谜 比特城的清晨总是笼罩着一层薄雾&#xff0c;仿佛这座城市本身就是由无数个0和1编织而成的幻境。在这里&#xff0c;信息如同空气般无处不在&#xff0c;但…