运维自动化工具:Ansible 概念与模块详解

news2024/11/23 3:40:18

目录

前言

一、运维自动化工具有哪些

二、Ansible 概述

1、Ansible 概念

2、Ansible 特点

3、Ansible 工作流程

4、Ansible 架构

4.1 Ansible 组成

4.2 Ansible 命令执行来源

5、Ansible 的优缺点

三、Ansible 安装部署

1、环境部署

2、管理节点安装 Ansible

3、查看Ansible相关文件

4、配置主机清单

5、免密管理 ssh-keygen

5.1 测试连通性

5.2 简洁输出 

四、Ansible 常用的命令行模块

1、command 模块

2、shell 模块

3、cron 模块 

4、user 模块 

5、group 模块

6、copy 模块

7、file 模块

8、hostname 模块

9、ping 模块

10、yum 模块

11、service/systemd 模块

12、script 模块

13、setup 模块

五、inventory 主机清单

1、简单配置

2、变量

2.1 主机变量

2.2 组变量

2.3 组嵌套


前言

Ansible 是一款强大而又流行的开源运维自动化工具,它能够简化部署、配置管理和应用程序的自动化

作为一名运维工程师,掌握 Ansible 的概念和模块是至关重要的

本文旨在深入探讨 Ansible 的核心概念和各种模块的功能,帮助读者更好地理解和利用这一工具来提高工作效率和系统稳定性。无论您是刚接触 Ansible 的初学者,还是希望进一步了解其高级功能的专业人士,本文都将为您提供全面而详实的指导

让我们一起深入探索 Ansible 的世界,发现自动化运维的无限可能性!

一、运维自动化工具有哪些

  • Ansible:Ansible是一种基于Python开发的自动化工具,用于配置管理、应用部署和任务自动化。它使用SSH协议来与远程主机通信,并使用Playbooks来定义任务和配置

  • Puppet:Puppet是一种基于模型驱动的自动化工具,用于配置管理和自动化部署。它使用Puppet语言来描述系统配置,并通过代理在远程主机上执行配置

  • Chef:Chef是另一种配置管理工具,它使用Ruby语言来定义系统配置,并通过Chef客户端在远程主机上执行配置

  • SaltStack:SaltStack是一种事件驱动的自动化工具,用于配置管理、远程执行和监控。它使用Python语言和ZeroMQ消息队列来实现高效的通信和自动化

自动化工具架构语言使用情况
Ansible无clientpython   协议用ssh95%
puppetC/Sruby       协议用http淘汰
chefC/Sruby       协议用http淘汰
saltstackC/Spython   协议用ssh5%

二、Ansible 概述

官网:https://www.ansible.com/
官方文档:https://docs.ansible.com/

1、Ansible 概念

  • Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现
  • Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作
  • Ansible是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是Ansible的模块, 比如copy模块用于拷贝文件到远程主机上,service模块用于管理服务的启动、停止、重启等
  • Ansible其中一个比较鲜明的特性是Agentless,即无Agent的存在,它就像普通命令一样,并非C/S软件,也只需在某个作为控制节点的主机上安装一次Ansible即可,通常它基于ssh连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务
  • 使用者在使用时,在服务器终端输入命令或者playbooks,会通过预定好的规则将playbook拆解为play,再组织成ansible可以识别的任务,调用模块和插件,根据主机清单通过SSH将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除
  • Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。比如执行 systemctl stop xxx 命令来停止服务,当发现要停止的目标服务已经处于停止状态, 它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而 systemctl restart xxx 是非幂等的
  • Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用

2、Ansible 特点

  • 部署简单,只需在主控端部署Ansible环境, 被控端无需做任何操作
  • 默认使用SSH协议设备进行管理
  • 主从集中化管理
  • 配置简单、功能强大、扩张性强
  • 支持API及自定义模块,可以通过Pyhton轻松扩展
  • 通过playbooks 来定制强大的配置、状态管理
  • 对云计算平台、大数据都有很好的支持

3、Ansible 工作流程

Ansible 基于模块化工作,本身没有批量部署的能力,真正具有批量部署的是Ansible所运行的模块(Modules)

Ansible 只是提供了一种框架,在 Ansible 管理体系中,存在着管理节点(Control Node)和被管理节点(Managed Node)两种角色

被管理节点通常称之为资产,会放在主机清单(Inventory)文件中,Inventory 其实就是由 Ansible 所管理的主机形成的。在管理节点上,Ansible 将 Ad-Hoc(批量执行单条命令,即单模块)或者 Playbook(任务剧本)转化为 Python 脚本,最终通过 ssh 网络协议将这些 Python 脚本传递到被管理节点,在被管理服务器上依次执行,并且会实时将结果返回给管理节点,执行完后进行清理模块或命令。返回结果顺序根据网络、被管理服务器本身性能等因素有关

4、Ansible 架构

4.1 Ansible 组成

  • INVENTORY:Ansible管理主机的清单 /etc/anaible/hosts 需要管理的服务清单
  • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API:供第三方程序调用的应用程序编程接口

4.2 Ansible 命令执行来源

  • USER 普通用户,即SYSTEM ADMINISTRATOR
  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
  • CMDB(配置管理数据库) API 调用
  • PUBLIC/PRIVATE CLOUD API调用

5、Ansible 的优缺点

优点:

  • 部署较为简单, 只需要在控制主机上部署 Ansible 环境,被控制端上只要求安装 ssh 和 python 2.5以上版本,对于运维人员使用门槛低
  • 被管控节点无需安装 Agent
  • 无服务端,使用是直接调用控制端命令或者脚本
  • 基于模块工作, 可以使用任意语言开发模块
  • 基于 yaml 语法编写 playbook
  • 定义的任务已存在则不会做任何事情,意味着在同一台服务器上多次执行同一个 playbook 是安全的

缺点:

  • 学习成本:需要学习 Ansible 自定义的脚本语法规则
  • 安装成本:控制主机需是一台非 Windows 远程主机,也就是说至少要有1台远程 Server
  • 易用性:因为必须有远程主控机,若本地有文件需同步,则需先将文件传输到对应的主控机,才能够做分发同步

三、Ansible 安装部署

1、环境部署

节点名称IP是否安装Ansible
control 管理节点172.16.12.10
managed-1 被管理节点172.16.12.12
managed-2 被管理节点172.16.12.13

(1)关闭所有设备的防火墙和核心防护

systemctl stop firewalld
setenforce 0

(2)修改三台设备的主机名,方便区分

[root@localhost ~]#hostnamectl set-hostname control
[root@localhost ~]#bash
 
[root@localhost ~]#hostnamectl set-hostname managed-1
[root@localhost ~]#bash
 
[root@localhost ~]#hostnamectl set-hostname managed-2
[root@localhost ~]#bash

(3)管理节点配置本地的/etc/hosts文件

echo "172.16.12.10 control" >> /etc/hosts
echo "172.16.12.12 managed-1" >> /etc/hosts
echo "172.16.12.13 managed-2" >> /etc/hosts

2、管理节点安装 Ansible

yum install -y epel-release      #先安装epel源
yum install -y ansible           #再安装ansible
ansible --version                #查看ansible版本

3、查看Ansible相关文件

tree /etc/ansible/     #查看ansible目录结构

ll /etc/ansible/       #查看ansible相关文件详细信息

ansible.cfg: 这是Ansible的配置文件。包含了一些全局配置选项,比如默认的模块路径、远程用户等
hosts: 这是Ansible的主机清单文件,也称为inventory文件。在这个文件中列出了Ansible将要管理的主机或主机组。通过编辑这个文件,可以添加、删除或修改要管理的主机信息
roles: 这是Ansible角色的存放目录。角色是一种组织和重用Playbooks的方式,它将相关的任务、变量和处理逻辑组织成一个可复用的单元。在这个目录中,你可以存放自己编写或从其他地方获取的角色,以便在Playbooks中使用

4、配置主机清单

vim /etc/ansible/hosts
[webs]           #配置组名
172.16.12.12     #组里包含的被管理的主机IP地址或主机名(主机名需要先修改/etc/hosts文件)
 
[dbs]
172.16.12.13

 

5、免密管理 ssh-keygen

用于生成SSH密钥对的命令行工具。它通常用于创建公钥和私钥,以便进行安全的SSH通信

#生成 SSH 密钥对
ssh-keygen -t rsa  # 一直回车
# rsa表示生成RSA密钥对,RSA是一种非对称加密算法
ls .ssh/
# id_rsa 是私钥文件;id_rsa.pub 是公钥文件
 
#ssh登录到远程管理节点,在ssh客户端即control服务器上生成known_hosts文件
ssh root@172.16.12.12
ssh root@172.16.12.13
ls .ssh/
#known_hosts 文件存放SSH服务器的公钥

#将本地主机上的SSH公钥复制到远程主机
sshpass -p '123' ssh-copy-id root@172.16.12.12
sshpass -p '123' ssh-copy-id root@172.16.12.13

5.1 测试连通性

(1)测试本机

ansible localhost -m ping

(2)分别测试 managed-1 和 mansged-2,观察返回信息

ansible webs -m ping
ansible dbs -m ping

返回结果的颜色:

  • 绿色:执行成功并且不需要做改变的操作
  • 黄色:执行成功并且对目标主机做变更
  • 红色:执行失败

5.2 简洁输出 

ansible 172.16.12.12 -m ping -o
ansible 172.16.12.13 -m ping -o

四、Ansible 常用的命令行模块

指的是在不使用 Playbook 的情况下,直接使用 ansible 命令行工具执行临时命令

这些命令通常是一次性的、针对特定任务的,而不需要编写长期维护的 Playbook。通过 AD-Hoc 命令,可以快速地在远程主机上执行特定的任务,比如文件操作、软件安装、服务管理等

命令格式:
ansible <组名> -m <模块> -a <参数列表>   #默认模块为command,可省略
ansible-doc -l				            #列出所有已安装的模块,按q退出

1、command 模块

command 模块允许用户在目标主机上执行特定的命令,主要功能是在远程主机执行命令,此为默认模块,可忽略 -m 选项

此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现

注意此模块不具有幂等性 (幂等性是指在对系统进行操作时,无论执行多少次,系统的状态都保持一致的特性)

以下是 command 模块的一般用法:

格式:ansible <host-pattern> [-m command] -a "<command>"
#<host-pattern> 是要操作的目标主机或主机组
#-m command 指定要使用的模块是 "command"
#-a "<command>" 传递给模块的参数,即要在目标主机上执行的命令
ansible-doc -s command  #-s 列出指定模块的描述信息和操作动作

ansible 172.16.12.12 -m command -a 'date'	#指定 ip 执行 date
ansible webs -m command -a 'date'			#指定组执行 date
ansible dbs -m command -a 'date'       
ansible all -m command -a 'date'			#all 代表所有 hosts 主机
ansible all -a 'ls /home'				    #如省略 -m 模块,则默认运行 command 模块

常用的参数:

chdir:在远程主机上运行命令前提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作
#在远程主机上运行命令前提前进入/home目录并查看当前目录
ansible webs -m command -a "chdir=/home ls ./"

#removes:判断指定文件是否存在,如果存在,执行后面的操作
ansible webs -m command -a "removes=/mnt/1.txt ls /mnt"
#creates:判断指定文件是否存在,如果存在,不执行后面的操作
ansible webs -m command -a "creates=/mnt/1.txt ls /mnt"

当指定文件不存在时:

当指定文件存在时:

2、shell 模块

在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)

和command相似,用shell执行命令支持各种符号,比如:*,$, >,此模块不具有幂等性

ansible-doc -s shell    #-s 列出指定模块的描述信息和操作动作

#在名为 "webs" 的一组主机上,通过向标准输入传递密码,将用户 mimi 的密码更改为 123
ansible webs -m shell -a 'echo 123|passwd --stdin dh'

#获取名为 "webs" 的主机上网络接口 "ens33" 的第二行输出,并提取其中的第二个字段
ansible webs -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}") | cut -d " " -f2'
#在名为 "dbs" 的主机上执行一个类似的命令,但是它只是打印网络接口 "ens33" 的第二行输出
ansible dbs -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print \$2}")'

3、cron 模块 

用于管理 cron 作业(定时任务),支持时间:minute,hour,day,month,weekday

在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除

minute/hour/day/month/weekday:分/时/日/月/周
job:任务计划要执行的命令
name:任务计划的名称
ansible-doc -s cron    #-s 列出指定模块的描述信息和操作动作

#在名为 "dbs" 的主机上设置一个 cron 任务。具体来说,它使用了 Ansible 的 cron 模块,传递了三个参数:minute="*/2" 表示每两分钟执行一次,job="/bin/echo welcome to China" 表示要执行的命令是输出 "welcome to China",name="crontab01" 表示这个任务的名称是 "crontab01"
ansible dbs -m cron -a 'minute="*/2" job="/bin/echo welcome to China" name="crontab01"'

#查看名为 "dbs" 的主机当前用户的 crontab 列表
ansible dbs  -a 'crontab -l'

#移除指定的计划任务,假如该计划任务没有取名字,name=None即可
ansible dbs -m cron -a 'name="crontab01" state=absent'            

4、user 模块 

管理系统用户的模块。它允许用户创建、删除和修改系统用户以及相关属性

常用参数:

name:用户名,必选参数
state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除
system=yes|no:是否为系统账号
uid:用户uid
group:用户基本组
shell:默认使用的shell
move_home=yse|no:如果设置的家目录已经存在,是否将已经存在的家目录进行移动
password:用户的密码,建议使用加密后的字符串
comment:用户的注释信息
remove=yes|no:当state=absent时,是否删除用户的家目录
ansible-doc -s user    #-s 列出指定模块的描述信息和操作动作

#在名为 "dbs" 的主机上创建一个用户yiyi
ansible dbs -m user -a 'name="yiyi"'
#查看名为 "dbs" 的主机上 "/etc/passwd" 文件的末尾10行内容
ansible dbs  -a 'tail /etc/passwd'

#删除用户yiyi,没有指定remove=yes参数,所以该用户的家目录没有被删除
ansible dbs -m user -a 'name="yiyi" state=absent'	
#查看名为 "dbs" 的主机上 "/etc/passwd" 文件的末尾10行内容
ansible dbs -m command -a 'tail /etc/passwd'

ansible dbs  -a 'ls /home/'   #查看名为 "dbs" 的主机上的家目录

#删除用户yiyi,指定remove=yes参数,该用户的家目录也会被删除
ansible dbs -m user -a 'name="dh" state=absent remove=yes'	
#查看名为 "dbs" 的主机上 "/etc/passwd" 文件的末尾10行内容
ansible dbs -m command -a 'tail /etc/passwd'
#查看名为 "dbs" 的主机上的家目录
ansible dbs  -a 'ls /home/'   

5、group 模块

管理系统用户组的模块。它允许用户创建、删除和修改系统用户组以及相关属性

ansible-doc -s group    #-s 列出指定模块的描述信息和操作动作

#在名为 "webs" 的主机上创建一个系统组为nginx
ansible webs -m group -a 'name=nginx gid=1314 system=yes'
#查看名为 "webs" 的主机上 "/etc/group" 文件的末尾10行内容
ansible webs -a 'tail /etc/group'

#在名为 "webs" 的主机上创建一个名为 "nginx-test" 的系统用户,并添加到nginx系统组
ansible webs -m user -a 'name=nginx-test uid=2000 system=yes group=nginx'	
#在名为 "webs" 的主机上查看 "/etc/passwd" 文件的末尾10行内容
ansible webs -a 'tail /etc/passwd'
#在名为 "webs" 的主机上查看名为 "nginx-test" 的用户的身份信息
ansible webs -a 'id nginx-test'    

6、copy 模块

从 ansible 服务器主控端复制文件到远程主机,src=file 如果是没指明路径,则为当前目录或当前目录下的 files 目录下的 file 文件

常用参数:

dest:指出复制文件的目标及位置,使用绝对路径,如果是源目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容
src:指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录
mode:指出复制时,目标文件的权限 
owner:指出复制时,目标文件的属主
group:指出复制时,目标文件的属组
content:指出复制到目标主机上的内容,不能与 src 一起使用
ansible-doc -s copy    #-s 列出指定模块的描述信息和操作动作

#在名为 "webs" 的主机上,将名为 "/etc/fstab" 的文件复制到名为 "/opt/fstab.bak" 的文件中
ansible webs -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=777'
#在名为 "webs" 的主机上查看 "/opt" 目录的详细列表
ansible webs -a 'ls -l /opt'
#在名为 "webs" 的主机上查看名为 "/opt/fstab.bak" 的文件的内容
ansible webs -a 'cat /opt/fstab.bak'

#在名为 "webs" 的主机上将字符串 "hello world" 写入名为 "/opt/1.txt" 的文件中,没有目标文件会自动创建
ansible webs -m copy -a 'content="hello world" dest=/opt/1.txt'  
#在名为 "webs" 的主机上查看名为 "/opt/1.txt" 的文件的内容
ansible webs -a 'cat /opt/1.txt' 

7、file 模块

设置文件属性,创建软链接等,关键字选项如下:

path       #指定文件路径
state      #文件状态 有:新建(touch) 删除(absent) 文件夹(directory)  连接文件(link)等
src        #源文件
mode       #权限
owner      #属主
group      #属组
recurse    #递归,修改属性时有效
ansible-doc -s file    #-s 列出指定模块的描述信息和操作动作

(1)设置文件属性 

#在名为 "webs" 的主机上,设置文件属性,修改文件的属主属组权限等
ansible webs -m file -a 'owner=dh group=dh mode=644 path=/opt/fstab.bak'
#在名为 "webs" 的主机上查看 "/opt" 目录的详细列表
ansible webs -a 'ls -l /opt'

(2)创建链接文件 

#在名为 "webs" 的主机上,设置/opt/fstab.link为/opt/fstab.bak的链接文件
ansible webs -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link' 
#在名为 "webs" 的主机上查看 "/opt" 目录的详细列表
ansible webs -a 'ls -l /opt'

(3)创建一个文件

ansible webs -m file -a "path=/opt/123.txt state=touch"

(4)删除一个文件

ansible webs -m file -a "path=/opt/123.txt state=absent"

8、hostname 模块

用于管理远程主机上的主机名,一般不使用模块,如果使用模块且模块中定义多个被管理节点,那么模块中的所有被管理节点的主机名会一致

ansible-doc -s hostname    #-s 列出指定模块的描述信息和操作动作

#将名为 "dbs-node1" 的主机名应用到名为 "dbs" 的主机上
ansible dbs -m hostname -a "name=dbs-node1"

9、ping 模块

检测远程主机的连通性

ansible-doc -s ping    #-s 列出指定模块的描述信息和操作动作

ansible all -m ping   #测试是否连通所有的主机

关闭 managed-1 节点,再测试联通性

10、yum 模块

yum 管理软件包,只支持 RHEL,CentOS,fedora,不支持 Ubuntu 其它版本;在远程主机上安装与卸载软件包

常用参数:

name参数:必须参数,用于指定需要管理的软件包
state参数:用于指定软件包的状态 ,默认值为。present,表示确保软件包已经安装,除了。present,其他可用值有 installed、latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent和removed 等效,表示删除对应的软件包。
disable_gpg_check参数:	用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装。
enablerepo参数:用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时,将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。
disablerepo参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。
#其中enablerepo 参数和 disablerepo 参数可以同时使用
 
#如
name			   所安装的包的名称
state              present--->安装, latest--->安装最新的, absent---> 卸载软件
update_cache       强制更新yum的缓存
conf_file          指定远程yum安装时所依赖的配置文件(安装本地已有的包)
disable_pgp_check  是否禁止GPG checking,只用于presentor latest
disablerepo        临时禁止使用yum库。 只用于安装或更新时
enablerepo         临时使用的yum库。只用于安装或更新时
ansible-doc -s yum    #-s 列出指定模块的描述信息和操作动作

#在名为 "webs" 的主机上,安装httpd服务
ansible webs -m yum -a 'name=httpd'

#在名为 "webs" 的主机上,卸载httpd服务
ansible webs -m yum -a 'name=httpd state=absent'

#其他用法
ansible webs -m yum -a 'name=nginx state=present enablerepo=epel'  
#启用epel源进行安装nginx
 
ansible webs -m yum -a 'name=* state=lastest exclude=kernel*,foo*' 
#升级除kernel和foo开头以外的所有包,建议不要

11、service/systemd 模块

可以启动、停止、重新启动和重新加载系统服务;用于管理远程主机上的管理服务的运行状态;常用的参数

常用参数:

name:被管理的服务名称
state=started|stopped|restarted:动作包含启动关闭或者重启
enabled=yes|no:表示是否设置该服务开机自启
runlevel:如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动
ansible-doc -s service    #-s 列出指定模块的描述信息和操作动作

#在名为 "webs" 的主机上,查看httpd服务状态
ansible webs -a 'systemctl status httpd'
#在名为 "webs" 的主机上,开启httpd服务,并设置开机自启动
ansible webs -m service -a 'enabled=true name=httpd state=started'

12、script 模块

在远程主机上运行 ansible 服务器上的脚本(无需执行权限,本身不执行),此模块不具有幂等性

ansible-doc -s script    #-s 列出指定模块的描述信息和操作动作

#编写
vim test.sh
#!/bin/bash
echo "welcome to my world" > /opt/script.txt

#在远程主机上运行 ansible 服务器上的脚本
chmod +x test.sh   #必须添加可执行权限,才可运行脚本
ansible dbs -m script -a 'test.sh'
ansible dbs -a 'cat /opt/script.txt'

13、setup 模块

收集有关远程主机的各种系统信息。这些信息包括操作系统类型、IP 地址、内存和 CPU 使用情况、磁盘空间以及许多其他有用的系统级信息。这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度。可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息

常用参数:

gather_subset: #指定要收集的子集信息,例如all, network, hardware, virtual等
gather_timeout:#设置收集信息的超时时间,以秒为单位
filter:        #用于过滤输出信息,可以根据需要选择性地显示特定信息,可配合正则表达式
fact_path:     #指定一个目录,将收集到的信息保存为 JSON 文件
retries:       #在发生连接问题时尝试重新连接的次数
ansible-doc -s setup    #-s 列出指定模块的描述信息和操作动作

#获取webs组主机的facts信息
ansible webs -m setup 
#使用filter可以筛选指定的facts信息,如筛选以 ipv4  结尾的信息              
ansible webs -m setup -a 'filter=*ipv4'    

五、inventory 主机清单

inventory(主机清单)是一个配置文件,用于定义Ansible可以操作的主机和组。这个文件可以是静态的,也可以是动态生成的,用于指定主机的IP地址、主机名以及这些主机的分组信息

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内

官方文档:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html  

1、简单配置

如果是名称类似的主机,可以使用列表的方式标识各个主机

(1)指定多个被管理的主机地址

[dbs]
172.16.12.12
172.16.12.13
……

(2)指定ssh端口为非默认的端口

[dbs]
172.16.12.12:777
172.16.12.13:666
……

(3)指定连续的主机地址

[dbs]
172.16.12.[10:20]

[dbs]
db-[a:f].example.org	#支持匹配a~f

2、变量

在 Ansible Inventory 中,变量是用来存储主机和组级别的数据的元素。这些变量可以帮助您在执行 Ansible Playbook 时动态地为不同的主机或组提供不同的配置信息

Inventory 变量名     说明
ansible_hostansible连接节点时的IP地址
ansible_port连接对方的端口号,ssh连接时默认为22
ansible_user 连接对方主机时使用的主机名。不指定时,将使用执行ansible或ansible-playbook命令的用户
ansible_password连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效
ansible_ssh_private_key_file指定密钥认证ssh连接时的私钥文件
ansible_ssh_common_args提供给ssh、sftp、scp命令的额外参数
ansible_become允许进行权限提升
ansible_become_method指定提升权限的方式,例如可使用sudo/su/runas等方式
ansible_become_user提升为哪个用户的权限,默认提升为root
ansible_become_password 提升为指定用户权限时的密码

2.1 主机变量

写法1:
[webs]
172.16.12.12 ansible_port=22 ansible_user=root ansible_password=123
172.16.12.13 ansible_port=22 ansible_user=root ansible_password=123
#webs组中被控制端 172.16.12.12 的端口号为22,登录时用户是root,密码为123
写法2:
[webs]
172.16.12.1[2:3] ansible_port=22 ansible_user=root ansible_password=123
#如果是名称类似的主机,可以使用列表的方式标识各个主机
写法3:
[webs]
172.16.12.12:22
172.16.12.13:1234
#默认ssh管理时的端口为22,若不是22则直接在被管理ip后加冒号和对应端口号

(1)修改并查看远程被控端ssh端口号

cat /etc/ssh/sshd_config | grep Port
#过滤得到 ssh 的端口号

vim /etc/ssh/sshd_config   #修改 ssh 配置文件中的端口号
Port 1234
systemctl restart sshd    #重启 sshd 服务

cat /etc/ssh/sshd_config | grep Port
#过滤得到 ssh 的端口号

(2)若在主机清单中不定义被控端 172.16.12.13 修改的端口号,那么被控端 172.16.12.13测试会无法联通

egrep -v "^#" /etc/ansible/hosts | egrep -v "^$"
#过滤得到 /etc/ansible/hosts 配置文件中生效的配置

ansible webs -m ping

(3)在主机清单中重新定义被控端主机,修改被控端 172.16.12.13 的端口号等变量

vim /etc/ansible/hosts
[webs]
172.16.12.12
172.16.12.13 ansible_port=1234 ansible_user=root ansible_password=123     
#默认ssh管理时的端口为22,若不是22则直接在被管理ip后加冒号和对应端口号,被控端 172.16.12.12 使用的是默认端口号22,而被控端 172.16.12.13 使用的是端口号1234

(3)可指定端口号,使用 ssh 登录测试被控端172.16.12.13

(4)修改完控制端使用 ping 模块检测主机的联通性

ansible webs -m ping

2.2 组变量

[webs]
172.16.12.12
172.16.12.13

#表示webs组内所有主机定义变量控制时使用root账户密码为123
[webs:vars]     
ansible_user=root
ansible_password=123

#表示为所有组的所有主机定义变量使用ssh远程管理时都是22端口
[all:vars]       
ansible_port=22

2.3 组嵌套

#webs组
[webs]
172.16.12.12
172.16.12.13
 
#dbs组
[dbs]
172.16.12.15
 
#组内嵌为onlys
[onlys:vars]
webs
dbs
#表示 onlys 组的成员即 vars 包括 webs和dbs

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

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

相关文章

智能商品计划系统:引领未来零售业的革新之路

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;和大数据技术已成为推动各行业革新的关键动力。在零售行业中&#xff0c;智能商品计划系统的出现&#xff0c;正逐步改变着传统的商品规划与管理方式&#xff0c;为品牌注入新的活力与竞争力。本文将对智能商…

源码部署与SaaS账号:企业软件选择的自建房与租赁公寓之辩

在数字化运营的时代&#xff0c;企业选择软件解决方案就如同在选择住所&#xff1a;源码部署类似于“自建房屋”&#xff0c;而SaaS账号则更像是“租赁公寓”。 自建房屋&#xff08;源码部署&#xff09; 当你选择自建房屋时&#xff0c;你需要投入大量的时间和资金来购买土地…

什么是香草看涨期权?香草看涨期权有哪些特点?

什么是香草看涨期权&#xff1f;香草看涨期权有哪些特点&#xff1f; 香草看涨期权&#xff0c;通常也称为香草期权&#xff0c;是金融市场上的一种金融衍生品&#xff0c;由券商或金融机构推出。它允许投资者以较小的费用获取相应股票市值的收益权&#xff0c;主要用于风险管…

如何添加、编辑、调整WordPress菜单

我们最近在使用WordPress建站建设公司网站。我们是使用的hostease的主机产品建设的WordPress网站。在建设网站使用遇到了一些WordPress菜单使用方面的问题。好在hostease提供了不少帮助。 下面把WordPress菜单使用心得分享一下。 本文将详细介绍WordPress菜单的各种功能&#x…

hive日常使用时忘记部分补充(不定时)

1、date_formate、unix_timestamp、from_unixtime用法&#xff1a; 2、lag&#xff08;&#xff09;、lead()用法&#xff1a; lag&#xff08;)窗口函数返回分区中当前行之前行&#xff08;可以指定第几行&#xff09;的值。 如果没有行&#xff0c;则返回null。 lead()窗口…

组件通信-props详解

目录 一、什么是prop 二、props校验 三、组件中prop和data的区别 一、什么是prop Prop定义&#xff1a;组件上注册的一些自定义属性。 Prop作用&#xff1a;向子组件传递数据。 特点&#xff1a; 可以传递任意数量的prop可以传递任意类型的prop 二、props校验 组件的pr…

【Linux】-Linux基础命令[2]

目录 一、目录切换相关命令 1、cd 2、pwd 二、相对路径、绝对路径和特殊路径符 1、相对路径和绝对路径 2、特殊路径符 三、创建目录命令&#xff08;mkdir&#xff09; 四、文件操作命令 1、touch 创建文件 2、cat查看文件内容 3、more查看文件内容 4、cp命令复制文…

了解外汇询价和锁价,全球交易中的关键概念

外汇市场是全球交易量最大的金融市场之一&#xff0c;每天都有大量的货币买卖活动。在外汇交易中&#xff0c;询价和锁价是两个关键概念&#xff0c;它们不仅影响交易者的决策&#xff0c;还关系到交易的成本和风险控制。为了帮助交易者更好地理解和应用这两个概念&#xff0c;…

浏览器输入URL到页面展示的过程详解

重点面试题&#xff1a;当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来&#xff0c;经历了什么&#xff1f; step 1、URL解析 URL&#xff1a;internet上的每一个网页都具有一个唯一的名称标识&#xff0c;通常称之为URL&#xff08;Uniform Resource Locator…

网络安全零信任学习1:基本概念

读书《白话零信任》一书笔记系列&#xff1a; 1&#xff09;基本概念 传统安全模式在某种程度上假设内网用户、设备和系统是可信的&#xff0c; 忽视了来自内网的威胁。企业一般专注于对外部的防御&#xff0c;内网用户 的访问行为往往只受到很少的限制。 随着网络攻击手段的提…

来了,135届广交会的成绩单

5月5日&#xff0c;第135届中国进出口商品交易会&#xff08;简称广交会&#xff09;在广州圆满闭幕&#xff0c;这一全球贸易盛典再次展现了中国制造的卓越实力和文化魅力&#xff0c;成就斐然&#xff0c;吸引了全球目光。 接下来&#xff0c;让我们通过数说成绩单&#xff…

c语言常用操作符(2)

1.移位操作符 移位操作符分为<<左移操作符和右移操作符>> 注&#xff1a;移位操作符的操作数只能是整数&#xff0c;同时移位操作符移动的是存储在内存中的二进制位&#xff08;也就是补码&#xff09; 同时移位操作符不要移动负数位&#xff0c;这个是标准未定义…

凡尔码安全巡检卡替代传统纸质记录卡

建筑行业、物业管理、医院等行业的安全巡检的记录方式通常以&#xff1a;1、纸质记录&#xff1a;巡检人员使用纸质巡检表格&#xff0c;手动填写巡检时间、巡检区域、巡检发现的问题以及处理情况。这种方式简单直接&#xff0c;但可能存在信息记录不完整、易丢失等问题。 2、电…

Glowroot:Java应用的性能守护神,让监控变得既轻松又有趣!

Glowroot&#xff1a;Java应用的性能守护神&#xff0c;让监控变得既轻松又有趣&#xff01; 在这个快节奏的数字化时代&#xff0c;作为一名开发者&#xff0c;你是否曾因应用性能问题而夜不能寐&#xff1f;是不是常幻想有个超级英雄能在关键时刻挺身而出&#xff0c;帮你揪…

基于深度学习的人体关键点检测与姿态识别

文章目录 源码下载地址&#xff1a; 源码地址在视频简介中 深度学习人体关键点检测&#xff0c;姿态识别 界面效果&#xff1a; 界面代码&#xff1a; from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * f…

先经营好自己,才是成事最坚实的基础!做事要稳!

电影《教父》里有句著名的台词说&#xff1a;花半秒钟就能看透事物本质的人&#xff0c;和花一辈子也看不透事物本质的人&#xff0c;注定是截然不同的命运。而这所谓的“看透本质”&#xff0c;就是事物的底层逻辑。 底层逻辑是一种解决问题的思维模式。底层逻辑越坚固&#x…

SharePoint 使用renderListDataAsStream方法查询list超过5000时的数据

问题&#xff1a; 当SharePoint List里的数据超过5000时&#xff0c;如果使用常用的rest api去获取数据&#xff0c;例如 await this.sp.web.lists.getByTitle(Document Library).rootFolder.files.select(*, listItemAllFields).expand(listItemAllFields).filter(listItemA…

科技控必看!让你轻松成为机器人领域达人

科技控们注意了&#xff01;你是不是经常对机器人技术充满无限的好奇&#xff0c;却又因为缺乏合适的渠道而难以深入了解和亲身体验呢&#xff1f;别担心&#xff0c;BFT机器人&#xff0c;正是你探索机器人世界的绝佳之地&#xff01; 在这里&#xff0c;你将发现一个充满惊喜…

更高效环保!格力博重新定义“中高端”割草机

格力博&#xff08;江苏&#xff09;股份有限公司&#xff08;以下简称&#xff1a;格力博或公司&#xff09;作为全球新能源园林机械行业的领先企业&#xff0c;始终走在创新前沿。自2007年开始从事新能源园林机械的研发、设计、生产及销售&#xff0c;格力博始终践行绿色发展…

el-carousel走马灯页数回到第一页

我的走马灯是在一个弹窗里,包裹着一些button,切换到下一页时 关闭弹窗再打开弹窗还显示的是上次第二页位置 领导很不满意 1. 2.写在你打开弹窗或者关闭弹窗的位置 this.$refs.carousel && (this.$refs.carousel.activeIndex 0); 解释一下: this.$refs.carousel: thi…