显示主机的自定义名称

2023-12-10

我有一本用于使用 EC2 实例的 Ansible 手册。我正在使用动态库存(ec2.py) 获取我想要使用的实例组 (hosts: tag_Service_Foo)。当我运行它时,它会产生如下输出:

GATHERING FACTS ***************************************************************
ok: [54.149.9.198]
ok: [52.11.22.29]
ok: [52.11.0.3]

但是,我可以从 Amazon 获取特定实例的“名称”标签(我这样做并将其存储在一个变量中,以便在剧本的几个部分中使用)。

有没有办法让 Ansible 在显示进度时使用此字符串作为主机名?我希望看到更具描述性的内容(因为我没有记住 IP):

GATHERING FACTS ***************************************************************
ok: [main-server]
ok: [extra-server]
ok: [my-cool-server]

的输出ec2.py库存脚本看起来像这样(被截断;它很长)。

{
  "_meta": {
    "hostvars": {
      "54.149.9.198": {
        "ec2__in_monitoring_element": false,
        "ec2_ami_launch_index": "0",
        "ec2_architecture": "x86_64",
        "ec2_client_token": "xxx",
        "ec2_dns_name": "xxx",
        "ec2_ebs_optimized": false,
        "ec2_eventsSet": "",
        "ec2_group_name": "",
        "ec2_hypervisor": "xen",
        "ec2_id": "i-xxx",
        "ec2_image_id": "ami-xxx",
        "ec2_instance_type": "xxx",
        "ec2_ip_address": "xxx",
        "ec2_item": "",
        "ec2_kernel": "",
        "ec2_key_name": "xxx",
        "ec2_launch_time": "xxx",
        "ec2_monitored": xxx,
        "ec2_monitoring": "",
        "ec2_monitoring_state": "xxx",
        "ec2_persistent": false,
        "ec2_placement": "xxx",
        "ec2_platform": "",
        "ec2_previous_state": "",
        "ec2_previous_state_code": 0,
        "ec2_private_dns_name": "xxx",
        "ec2_private_ip_address": "xxx",
        "ec2_public_dns_name": "xxx",
        "ec2_ramdisk": "",
        "ec2_reason": "",
        "ec2_region": "xxx",
        "ec2_requester_id": "",
        "ec2_root_device_name": "/dev/xvda",
        "ec2_root_device_type": "ebs",
        "ec2_security_group_ids": "xxx",
        "ec2_security_group_names": "xxx",
        "ec2_sourceDestCheck": "true",
        "ec2_spot_instance_request_id": "",
        "ec2_state": "running",
        "ec2_state_code": 16,
        "ec2_state_reason": "",
        "ec2_subnet_id": "subnet-xxx",
        "ec2_tag_Name": "main-server",
        "ec2_tag_aws_autoscaling_groupName": "xxx",
        "ec2_virtualization_type": "hvm",
        "ec2_vpc_id": "vpc-xxx"
      }
    }
  }
  "tag_Service_Foo": [
    "54.149.9.198",
    "52.11.22.29",
    "52.11.0.3"
  ],
}

您需要做的是创建自己的包装器(例如my_ec2.py)超过ec2.py这将对输出进行后处理。想法是使用行为主机变量ansible_ssh_host。你可以使用任何语言,不仅仅是Python。只要它在标准输出上打印有效的 json 就可以了。需要的话可以参考一下.

这将是一个小小的工作。但希望 sudo 代码能有所帮助:

output_json_map = new map
for each group in <ec2_output>: # e.g. tag_Service_Foo, I think there would be another 
                                # key in the output that contains list of group names.
  for each ip_address in group:
    hname = ec2_output._meta.hostvars.find(ip_address).find(ec2_tag_Name)

    # Add new host to the group member list
    output_json_map.add(key=group, value=hname)
    copy all vars from ec2_output._meta.hostvars.<ip_address>
                  to output_json_map._meta.hostvars.<hname>
    # Assign the IP address of this host to the ansible_ssh_host
    # in hostvars for this host
    output_json_map.add(key=_meta.hostvars.<hname>.ansible_ssh_host,
                        value=ip_address)
    output_json_map.add(key=_meta.hostvars.find(ip_address).ansible_ssh_host,
                        value=ip_address)

print output_json_map to stdout

例如。对于你的例子的输出my_ec2.py应该:

{
  "_meta": {
    "hostvars": {
      "main-server": {
        "ansible_ssh_host": "54.149.9.198"
        --- snip ---
        "ec2_tag_Name": "main-server",
        --- snip ---
      },
      "extra-server": {
        "ansible_ssh_host": "52.11.22.29"
        --- snip ---
        "ec2_tag_Name": "extra-server",
        --- snip ---
      },
      <other hosts from all groups>
    }
  }
  "tag_Service_Foo": [
    "main-server",
    "extra-server",
    <other hosts in this group>
  ],
  "some other group": [
    <hosts in this group>,
    ...
  ],
}

显然,使用这个my_ec2.py代替ec2.py作为库存文件。 :-)

- 编辑 -

1)在组中,我可以只用一个名称来指代事物吗? 2)有 没有别名的概念? 3)我想知道我是否可以使用IP地址 组并只修改 _meta 部分,或者我是否需要全部完成?

是*、否和否。


* 从技术上讲,第一个“是”应该是“否”。让我解释。

我们在这里所做的可以使用静态库存文件来完成,如下所示:

原来的ec2.py返回相当于以下清单文件的 json:

[tag_Service_Foo]
54.149.9.198 ec2_tag_Name="main-server"  ec2_previous_state_code="0" ...
52.11.22.29  ec2_tag_Name="extra-server" ec2_previous_state_code="0" ...

our new my_ec2.py返回这个:

[tag_Service_Foo]
main-server  ansible_ssh_host="54.149.9.198" ec2_tag_Name="main-server"  ec2_previous_state_code="0" ...
extra-server ansible_ssh_host="52.11.22.29"  ec2_tag_Name="extra-server" ec2_previous_state_code="0" ...

# Technically it's possible to create "an alias" for main-server like this:
main-server-alias  ansible_ssh_host="54.149.9.198" ec2_tag_Name="main-server"  ec2_previous_state_code="0" ...

现在你可以运行一个游戏main-server-alias在主机列表中,ansible 会执行它54.149.9.198.

BUT,这是一个很大的问题,但是,当您使用“all”作为主机模式运行游戏时,ansible 会在main-server-aliasmain-server。因此,您创建的是一个上下文中的别名和另一个上下文中的新主机。我没有测试过这个BUT part因此,如果您发现其他情况,请回来纠正我。

HTH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

显示主机的自定义名称 的相关文章

  • 基于 ec2 发行版动态设置 ansible-playbook 用户变量

    我正在创建一个 ansible 剧本 它会遍历一组 AWS EC2 主机并安装一些基本软件包 在 playbook 可以执行任何任务之前 playbook 需要使用正确的信息登录到每个主机 2 种类型的发行版 AWS Linux 或 Ubu
  • 在 Ansible 的字典列表中搜索键 [重复]

    这个问题在这里已经有答案了 我有一个类似于以下内容的字典列表 subnets name subnet1 name34554 address 192 168 1 100 id id1 name subnet2 name67678 addr 1
  • Ansible设置mysql root密码

    你们中有人有想法构建一个 yml 用于 mysql 更新 root 密码并授予权限吗 我已经创建了我的剧本 并且在全新安装时它按预期工作 完全没有问题 但是 当我再次进行 vagrant 配置时 它现在无法设置 root 密码 并且出现错误
  • 如果定义了 item,则 Ansible with_items

    安塞布尔 1 9 4 该脚本应该仅在定义了某些变量的主机上执行某些任务 正常情况下可以正常工作 但与with items陈述 debug var symlinks when symlinks is defined name Create o
  • 如何在 YAML 中使用 IF ELSE 和变量?

    我正在使用 Ansible Tower 的 YAML 文件 其中包含以下信息 name Package Deployment block name Update package package yum update cache True u
  • 如何将 ansible_become_pass 存储在保管库中以及如何使用它?

    我是 ansible 的新手 我正在使用一个非常简单的剧本来发布sudo apt get update and sudo apt get upgrade在几台服务器上 这是我正在使用的剧本 name Update Servers hosts
  • 将变量内容复制到事实中后,Ansible 会抛出错误

    我有变量 其中包含带有其他模板引擎标记的字符串 不幸的是它们是三个花括号 如果我直接使用这些变量 一切都很好 如果我将它们复制到事实中以便随后修改它们 Ansible 会抛出错误 示例剧本 hosts localhost connectio
  • jenkins 管道中的该模块需要 boto3 和 botocore

    我正在尝试通过 jenkins groovy 脚本运行 ansible playbook 但不断收到错误 boto3 is required 我已经安装了 boto3 pip list boto grep boto boto3 1 20 3
  • ansible 有 yaml 编辑模块吗?

    我需要修改 yaml 文件 施洛德配置 http schleuder2 nadir org documentation v2 2 index html 并且我想从 ansible 剧本中执行此操作 是否有模块可以执行此操作 很难用谷歌搜索这
  • 将事实收集到事实缓存的最快方法

    我正在尝试让 Ansible 与 limit 一起工作 为此我需要有关其他主机的事实 我正在使用fact caching进行缓存 我应该运行什么命令 以便它只收集所有主机上的所有事实并缓存它们 而不运行任何任务 像这样的东西设置模块 htt
  • Ansible:即使成为 sudo 用户,也无法配置 sudo 命令

    testuser 是 sudo 用户 sudo cat etc sudoers d 90 cloud init testuser testuser ALL ALL NOPASSWD ALL 我可以手动登录 testuser 并在没有密码的情
  • 使用 Python API 2.0.0.1 运行 Ansible Playbook

    安塞布尔版本 2 0 0 1 我现在已经四处寻找了很多 我发现的大多数文档要么不完整 要么已弃用 这篇文章适用于1 8 4版本 即 https stackoverflow com questions 27590039 running ans
  • 使用 with_items 连接字符串并分配给 Ansible 中的变量

    启动 ec2 实例时 我需要将两个 2 IP 保存到 vars 文件中的变量中 以便稍后在部署期间使用 这就是我保存单个服务器 IP 的方式 name Save server public IP to vars file lineinfil
  • 如何配置 Ansible 跳过两个堡垒主机?

    我想编写一个 Ansible 剧本 使用 Ansible 2 7 5 它将在到达目标服务器之前跳过两个主机来执行诸如安装 docker 和 python 等操作 我能够让 Ansible 通过一台主机跳转到server1通过将其添加到我的h
  • 如何在 jinja2 中缩进嵌套的 if/for 语句

    我有一个很长的 Jinja2 模板 其中有很多嵌套if for声明 很难读 我想缩进 位 使其更清晰 但是 如果我这样做 这些块的内容也会进一步缩进 我怎样才能缩进just the bits 我正在使用安塞布尔 重现步骤 template
  • ansible 用户模块总是显示已更改

    我正在努力正确使用 ansible 的用户模块 问题是每次我运行我的剧本时 我创建的用户always显示为已更改 即使我已经创建了它们 我在这里发现其他人也有同样的问题 https github com ansible ansible is
  • 在ansible中合并字典

    我目前正在构建一个使用 ansible 安装 PHP 的角色 并且在合并字典时遇到一些困难 我尝试了多种方法来做到这一点 但我无法让它像我想要的那样工作 A vars file my default values key value my
  • Ansible 无法运行任何命令或 shell

    我在 RPi 上运行任何命令或 shell 时遇到问题 当我使用以下代码时 name Example command ansible builtin command cmd cat etc motd 我收到此错误 Unsupported p
  • local_action:shell 连接文件时出错

    我的剧本中有这样的错误 为什么以及如何解决它 获取远程主机的更新列表 将列表连接到一个文件中 name Save update deb packs in file on ansible host copy content update de
  • 如何在 Ansible 中运行 MySQL 查询

    我需要编写一个 Ansible 脚本来在 MySQL 数据库中执行 SQL 查询 这是我尝试过的 你能指导一下吗 hosts localhost tasks name retrive data command mysql u root h

随机推荐

  • 如何使用 Interop 与 C# 将 *.ppt、*.pptx 文件另存为 *.wmv?

    我尝试用下面的代码来做到这一点 using Microsoft Office Core using PowerPoint Microsoft Office Interop PowerPoint using System IO using M
  • 如何使用 Java SDK 获取 AWS Quicksight 仪表板的嵌入 URL

    我想我了解获取 AWS Quicksight 仪表板的嵌入 URL 所需的所有步骤 并且我已经能够通过 AWS CLI 获取有效的 URL 如AWS docs 但是 我似乎无法通过 AWS Java SDK 特别是 v2 让它工作 似乎任何
  • 如何让Android应用程序在屏幕休眠时在后台运行?

    我正在开发一个跟踪应用程序 它通过每 3 秒获取用户当前位置来跟踪用户 当屏幕打开时 我能够获取经纬度值 但当屏幕休眠时 我无法获取数据 CODE Override public void onLocationChanged Locatio
  • 在VS 2017、MVC中添加服务引用

    如何在 VS 2017 MVC 中添加服务引用 我尝试找到 添加服务引用 按钮 但它不在那里 只有 添加引用 和 添加连接的服务 我之前在 VS 2013 中添加了服务引用 这很容易 但现在我为我的学校项目更改为 VS 2017 我不知道如
  • 使用 Gson 或 Jackson 压平 JSON 字符串,将包含各个级别键值的键制作为 Map

    我有一个关于以下问题的增强问题使用 Gson 或 Jackson 将 JSON 字符串展平为 Map 我的场景包括重复的键 因此上述问题中的解决方案会导致一些重复的键被覆盖 所以我正在考虑通过将每个级别的密钥组合在一起来构造密钥 那么如何实
  • 如果主题更改,请更改 WP7 应用程序的背景

    如果用户更改主题 我需要更改应用程序的背景图像 Light to Dark 或在代码隐藏中反之亦然 我希望这些应该在页面已加载 event TimDams 向您指出了检测现在设置的主题的好方法之一 但我没有注意到有任何信息如何检测a cha
  • MobileFirst Starter - Bluemix 推送通知在生产模式下失败

    我正在构建一个可以通过 Bluemix 接收远程通知的 iOS 应用程序 我在 Xcode 中的应用程序包标识符与 Apple Portal 中的 AppId 相匹配 后者也与 APN 证书相匹配 xxx sandbox p12 和 xxx
  • 如何更改构建定义的 Scala 版本?

    我正在开发一个简单的 SBT 项目 其中包括用于对 Scala 并行集合进行基准测试的 InputTasks 当我遇到问题时 我已经定义了输入键并开始编写任务 由于我的基准要求斯卡拉 2 10 0 M5 我尝试在我的build sbt na
  • 返回匿名类型结果?

    使用下面的简单示例 使用 Linq to SQL 从多个表返回结果的最佳方法是什么 假设我有两张表 Dogs Name Age BreedId Breeds BreedId BreedName 我想把所有的狗都带回来BreedName 我应
  • EL中bean的动态选择

    有没有办法在运行时而不是设计时指定 EL 中使用的托管 bean 例如 actionListener myBean method 这样myBean根据调用代码的 JSF 页面 part 可以有不同的值 条件是使用的任何对象代替 myBean
  • 只在 ISR 中读取的变量是否为 易失性?

    Is volatile需要一个在主循环中读写但在 ISR 中只读的变量吗 编辑 在编写 main 时 ISR 被禁用 因此 该变量被有效地原子地使用 EDIT 非常相关 中断的易失性与内存屏障 volatile是一种不好的同步访问方式 这是
  • jQuery:将复选框的值添加到输入文本字段

    我正在尝试将任何选中的复选框的值添加到输入文本字段 这是我的小提琴 http jsfiddle net Lf6ky document ready function checkbox on click function if checkbox
  • 使用 f String 插入字符或符号@

    我有两个变量总共存储两个数字 我想组合这些数字并用逗号分隔它们 我读到我可以使用 variablename 插入加号或空格或零 但逗号不起作用 x 42 y 73 print f the number is x y 这是我奇怪的解决方案 我
  • Qt 库中控件的默认 HTML 样式

    这是一个关于 Qt 库的问题 而不是关于 Web 设计的问题 对于 QLabel 和其他控件 我可以设置 HTML 文本 例如 Some Text 问题是 默认的HTML样式是在哪里定义的 我如何找出 标签将使用什么字体 下一个问题 我可以
  • 接收有关 Reality Composer 动画结束的 Xcode 通知

    我有以下可以正确加载的 Reality Composer 项目 正如您所看到的 当动画完成时 它应该使用关键字 attackComplete 进行通知 我如何收到此通知 import RealityKit import ARKit clas
  • 从 1:n 表中的单个查询中检索最新注释(按时间戳)

    假设我有两个表 用户和注释 假设架构如下所示 users id name field2 field3 notes id user id subject heading body timestamp 我想要做的是选择每个用户 以及每个用户根据
  • 如何避免在 .NET Windows 窗体中重复创建表单?

    我正在使用 NET Windows 窗体 我的 MDI 父窗体包含菜单 如果单击菜单 将显示表单 到现在为止没有问题 UserForm uf new UserForm uf Show uf MdiParent this 如果我再次单击菜单
  • Paho MQTT 客户端在设备锁定后断开连接

    我目前正在开发一个小型 紧急按钮 应用程序 该应用程序应该在医疗机构中运行 由于该项目的假设之一是独立于 Internet 因此我决定采用 MQTT 并在本地 WLAN 中设置服务器 我已经实现了 Paho Android 服务 效果非常好
  • 在同一函数中多次使用 self

    我与借用检查员发生争执 我的问题有点复杂 但对于这种情况 我使用类似缓冲区的结构 我的缓冲区有一个功能safe write to slot首先检索第一个空元素 返回 Ok 位置 或 Err 错误消息 结果 然后将值写入该检索到的位置 然而问
  • 显示主机的自定义名称

    我有一本用于使用 EC2 实例的 Ansible 手册 我正在使用动态库存 ec2 py 获取我想要使用的实例组 hosts tag Service Foo 当我运行它时 它会产生如下输出 GATHERING FACTS ok 54 149