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

目录

前言

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

二、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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【如此简单!数据库入门系列】之无序不代表混乱 -- 堆文件

文章目录 前言堆文件链表实现页目录实现总结系列文章 前言 还记得上次遗留的问题吗&#xff1f; 以什么组织方式将数据保存在磁盘中&#xff1f; 今天我们接着讨论这个问题。 首先想一个问题&#xff1a;有一天&#xff0c;你开着自己心爱的大型SUV去超市购物。在停车场入口看…

roblox国际服游戏充值付款订阅Robux套装商城会员,roblox国际服虚拟信用卡充值教程

roblox是一款由Roblox公司开发的大型多人在线游戏创建平台&#xff0c;该平台允许用户设计自己的游戏、物品及衣服&#xff0c;以及游玩自己和其他开发者创建的各种不同类型的游戏。 没有账号注册一个账号&#xff0c;他支持多种平台授权登录&#xff0c;我这里直接选择注册一个…

2024蓝桥杯CTF writeUP--缺失的数据

压缩包的内容 里面有secret.txt文件&#xff0c;用ARCHPR工具套上字典&#xff0c;爆破压缩包密码。密码为pavilion 解压得到原图&#xff0c;并且有了加密后的图片&#xff0c;根据代码里的key和参数直接运行脚本解密水印图片&#xff1a; import cv2 import numpy as np imp…

qt5-入门-xml文件读写

本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 代码已经测试通过。其他例子日后更新。 假设需要读写的xml文档结构如下图所示&#xff1a; 那么首先需要修改.pro文件&#xff0c;增加一句&#xff1a; 然后执行qmake。 代码 #include <QtXml/Q…

您的浏览器不支持 undefined 代理认证!如有问题请联系您的浏览器支持,请勿反馈此问题给 SwitchyOmega.

一、【问题描述】 PAC 文件是一个 JavaScript 文件&#xff0c;用于定义客户端的代理规则。您可以在 PAC 文件中编写规则&#xff0c;根据不同的目标网址或其他条件&#xff0c;决定是否通过代理服务器进行访问。您可以将 PAC 文件部署到服务器上&#xff0c;并在客户端配置浏…

一篇教程搞定Windows系统中的Docker应用安装

文章目录 1. 引言2. “Docker -> WSL -> Windows”的依赖逻辑3. 安装方法3.1 安装WSL3.2 安装Docker Desktop 4. 是否安装成功&#xff1f;初始化一个容器试试。FAQ 1. 引言 Docker是一个用于创建、管理和编排容器的应用。容器是运行在操作系统上的一个应用&#xff0c;…

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…

.net 6.0 框架集成ef实战,步骤详解

一、代码框架搭建 搭建如下代码架构: 重点含EntityFrameworkCore工程,该工程中包含AppDbContext.cs和数据表实体AggregateObject 1、AppDbContext 代码案例 //AppDbContext 代码案例using Microsoft.EntityFrameworkCore;namespace EntityFrameworkCore {public class Ap…

STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲

STM32-HAL库12-STM32F407VGT6的PWM主从定时器&#xff0c;发送指定数量脉冲 一、所用材料 STM32F407VGT6自制双伺服电机控制板&#xff1b; 一川A1系列伺服电机驱动器&#xff08;电0.73KW电机&#xff09;&#xff1b; 二、所学内容 实现PWM发送指定个数脉冲&#xff0c;以…

Https协议加密过程,中间人攻击详解

在上一篇博客中我们讲到了http协议http://t.csdnimg.cn/OsvCh&#xff0c;没看过之前建议先瞅瞅。 https本质就是对http协议进行了一层加密。为什么要进行加密呢&#xff0c;也参考上面一篇文章&#xff0c;涉及到运营商劫持。 因为http是明文传输&#xff0c;所以要对http进…

An Embarrassingly Easy but Strong Baseline for Nested Named Entity Recognition

任务描述&#xff1a; NER 是检测和分类文本中实体范围的任务。当实体范围在文本中彼此重叠时&#xff0c;这个问题被称为嵌套 NER。 解决方法&#xff1a; 使用基于跨度的方法来处理嵌套 NER&#xff0c;其中大多数方法将得到一个 n n 的分数矩阵&#xff0c;其中 n 表示句子…

Compose 生命周期和副作用

文章目录 Compose 生命周期和副作用生命周期副作用APIDisposableEffectSIdeEffectLaunchedEffectrememberCoroutineScoperememberUpdatedStatesnapshotFlowproduceStatederivedStateOf Compose 生命周期和副作用 生命周期 OnActive&#xff1a;添加到视图树。即Composable被首…

有哪些有效的复习方法可以帮助备考软考?

软考目前仍然是一个以记忆为主、理解为辅的考试。学过软考的朋友可能会感到困惑&#xff0c;因为软考的知识在日常工作中有许多应用场景&#xff0c;需要理解的地方也很多。但为什么我说它是理解为辅呢&#xff1f;因为这些知识点只要记住了&#xff0c;都不难理解&#xff0c;…

快速传输大文件:手机电脑互传文件的最佳解决方案

无论是工作还是生活&#xff0c;我们都可能需要将照片、视频、音乐或其他类型的文件从一台设备发送到另一台设备。然而&#xff0c;由于网络速度的限制&#xff0c;传统的文件传输方法可能会非常耗时。那么&#xff0c;有没有一种快速传输大文件的解决方案呢&#xff1f;答案是…

Linux网络编程(三)IO复用一 select系统调用

I/O复用使得程序能同时监听多个文件描述符。在以下场景中需要使用到IO复用技术&#xff1a; 客户端程序要同时处理多个socket&#xff0c;非阻塞connect技术客户端程序要同时处理用户输入和网络连接&#xff0c;聊天室程序TCP服务器要同时处理监听socket和连接socket服务器要同…

【JAVA |数组】数组定义与使用、常见的Arrays类介绍

目录 一、前言 二、数组的创建和初始化 三、数组的使用 四、数组是引用类型 1.JVM的内存分配 2.与引用类型变量 3.null 五、二维数组 六、Java中Arrays类的常用方法 1. Arrays.fill ->填充数组 2. Arrays.sort ->数组排序 3. Arrays.toString ->数组打印 …

数据中台:企业数字化转型的驱动力量_光点科技

在当今数字化快速发展的时代&#xff0c;企业正积极寻求转型升级的新路径。在这个过程中&#xff0c;数据中台以其独特的功能和价值&#xff0c;逐渐成为了企业数字化转型的关键驱动力。本文将深入探讨数据中台的角色、架构及其在企业中的应用&#xff0c;以期为企业的数字化转…

十个数据安全最佳实践:保护数据的简单方法

在德迅云安全将介绍数据安全的主要原则&#xff0c;并了解适用于大多数行业的 10 种数据安全最佳实践&#xff0c;以及云端安全检测的重要性。 数据威胁和维护数据安全的好处 什么是数据安全&#xff1f; 数据安全是旨在保护组织敏感资产的流程和工具的组合。有价值的数据在…

多核DSP并行计算跨平台通信解决方案

并行计算的核心是计算节点以及节点间的通信与协调机制。OpenMP虽然给开发者提供了极易上手的增量式开发方式&#xff0c;但是OpenMP在与复杂架构的MCSDK结合后&#xff0c;工具与代码产生了大量不可调试的黑盒子&#xff0c;更是决定了它不能用于关键任务领域&#xff0c;如军工…

C语言(指针)1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…