问题标签 [ansible-facts]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
641 浏览

ansible-facts - 从ansible中的macaddress中删除冒号

我需要通过从 mac 地址中删除冒号来从 ansbile 事实(例如 ansible_default_ipv4.macaddress)创建一个文件

我已经尝试了我能想到的一切,但无法让它发挥作用

0 投票
3 回答
3595 浏览

ansible - Ansible:如何使用多值数据列表作为库存并传递给目标主机

我的主机清单的来源来自一个输出成对值的内部工具,例如,这里有 6 个观察值,我目前有 160 个观察值:

所以第 1 列是我的目标主机列表(我的库存)。Column2 是唯一的 processname 值,专门分配给 servername 的值。通常会出现同一台服务器。一些服务器只有一个进程名,而其他服务器可能有 2 到 N 个。这意味着我的目标主机可能会重复一个唯一的进程名列表。我想使用此输出对列表中的两个动态库存,并且我需要将每个观察值的两个值关联并分配给变量。我不是绝对需要使用动态库存,我只需要一个解决方案。我还需要通过 command: 或 shell: modules 传递给目标主机和 {{ processname# }} 中的值。(这是独一无二的,没有与此需求相关的模块)

如果需要,我有办法过滤这些数据并以 JSON 格式或 YAML 输出,为每个主机制作一个单独的 YML 文件。虽然我更喜欢动态处理这些;预处理列表是可以接受的。

因为 ansible-playbook 需要一些已知的主机清单列表,所以在开始播放时,我无法理解如何从动态输出中创建此列表。

到目前为止我所做的:我尝试阅读并尝试将这些对设置为 /etc/ansible/hosts/host_vars/servername#.yml 文件中的内容。这非常难看,因为我必须将数据输出预处理为 YML 格式。但它并没有给我一个主机列表供我在我的剧本中参考。因此,虽然 hostvar 似乎是合乎逻辑的选择,但我无法理解它。

我需要的:

感谢您的任何见解。我现在已经使用 Ansible 3.5 周了!我在使用静态和动态库存方面做得很好,但这让我很困惑,因为库存列表并不明显,请给出匹配对的格式。

注意:很多人都建议使用 host_vars,但在我看来,这是保留给主机名、相关端口和代理值的。我可能是错的。

==================================================== ==================

更新:感谢您在正确方向上的帮助。我已经更新了我们的清单脚本,以 JSON 格式输出主机列表。第一个新选项是以 JSON 格式输出主机。示例:{"my_host":["servername1","servername2",]}

将其称为动态库存脚本,效果很好!

ansible all -m ping servername1 | 成功 => {“改变”:假,“平”:“乒乓”} servername2 | 成功 => {“改变”:假,“平”:“乒乓”}

下一步:清单脚本的第二个新选项是添加一个新开关来输入主机名。这部分仍然让我感到困惑。这是输出: showInv --host=servername1

{"servername1":["processname1","processname2","processname3",]}

我缺少的最后一部分是如何在我的剧本中使用特定的 "--host={{ my_host }} 调用库存脚本。

看来我需要找到现有主机名的变量并将其作为切换选项“--host=”传递回库存脚本

0 投票
1 回答
1317 浏览

ansible - 遍历 ansible_devices 并选择任何不是 sda 的物理磁盘以包含在卷组中

我需要构建两个逻辑卷。sda1 将始终形成 /root 并为日志等进行分区,但 /application 可能包含一到四个附加磁盘。我知道他们总是从 sdb 开始,然后继续到 sde 或 sdf。我可以想到几个不同的快速而肮脏的解决方案,比如运行一个 bash 命令来构建一个要注册为变量的列表,但我想做的是从 Ansible 设置事实的 ansible_devices 部分下拉并匹配sd[bz] 的正则表达式。我知道我不太可能拥有 sdz,但我希望尽可能保持灵活性。有没有人有这方面的好技术?jinja2 过滤器是错误的方法吗?

0 投票
1 回答
788 浏览

ansible - Ansible 中另一个角色的事实访问

在我的 ansible 游戏中,我使用 pre_tasks 设置了一些事实:

现在我想从我正在开发的角色中访问它们。当我尝试直接访问它们时,我收到一个变量未定义的错误:

根据我读过的一些文章,我需要用来hostvars查找另一个剧本中设置的事实,例如:

但是,这存在明显的问题(变量内部的变量)。我知道我可以简单地在需要访问它们的每个角色中定义我的事实,但这看起来很混乱,而且绝对不是 DRY。

我只需要一种方法来设置和访问可以从多个角色和角色中访问的“全局”事实/变量。做这个的最好方式是什么?

0 投票
1 回答
1542 浏览

regex - 如何正则表达式替换 Ansible 中的嵌套值

这个问题是关于 Ansible 中的循环,而不是关于 AWS,但为了清楚起见,我将使用 AWS 部署问题作为示例。

对于我们的部署脚本,我尝试遍历 Amazon EC2 容器服务中的一些集群。我最终要做的是重新启动集群上的每个服务。给定它的名称,我可以重新启动服务。但是我需要简单的名称,而不是完全限定的 ARN。所以我查找每个集群的服务并得到如下信息:

项目:测试服务

现在我想用服务的短名称替换每个 ARN。例如: arn:aws:ecs:eu-central-1:55:service/test-service变成test-service.

替换后,我可以循环服务并通过将所需的计数设置为 0 来关闭它们(稍后我将再次打开它们):

taskdefinitions我在剧本中定义的简单字典在哪里:

因此,在将上面显示的 AWS 列表放入变量后,result我尝试通过执行以下操作来进行正则表达式替换:

这很好用,但它显然只替换了一个集群的服务名称,并且我丢失了 dict 中的任何其他字段ansible_facts。后者可以接受,前者不行。那么问题来了:如何替换嵌套列表中的文本?另一个问题是跳过关闭不包含在 中的服务taskdefinitions,但这不是手头的问题。

0 投票
1 回答
223 浏览

ansible - ansible剧本失败了

部分剧本如下:这是ansible剧本(main.yml)

custom_application.py:

这是从 main.yml 文件调用的自定义 ansible 应用程序。

Application.py:python 类,做一些与应用程序相关的事情。

在 main.yaml 和自定义 ansible 模块和应用程序类之上

Module_stdout 如下:

模块标准输出我截断了确切的模块标准输出如下:

我认为它是一个有效的 json 对象。

如上所示,一个特定的 ansible 步骤失败,没有 stderr。而且我也收到上述警告..让我知道我哪里出错了

注意:我也发送 json 数据作为自定义 ansible 模块的输出

0 投票
1 回答
89 浏览

ansible - Ansible 没有返回正确的 group_vars,为什么?

deploy.yaml

inventory

当我运行剧本时,我希望变量demo返回aaa,但它返回bbb

为什么?

0 投票
1 回答
2228 浏览

ansible - ansible 将事实值分配给变量

我是 ansible 的新手,我正在编写一个小剧本,它必须从目标主机收集事实值并将其用作剧本中的变量。有人可以帮我怎么做。

注意:DATA_AGGREGATOR_ENV 是在所有服务器中定义的环境变量,值因服务器而异。

0 投票
1 回答
389 浏览

ansible - 使用属性名称作为其他变量访问 ansible 变量属性

我有以下代码:

我确认EC2_MY_AP_HOST返回一个字符串 ip10.0.1.2

我收到的 json 结构python convinventory/ec2.py如下:

访问这些数据的正确方法是什么?

0 投票
2 回答
1991 浏览

ansible - 确认安装点集存在的最简单的非外壳方法,每个安装点的自定义最小大小

ansible_mounts 是一个字典数组,就像这样 -

我需要确认存在一组具有最小尺寸的特定挂载点。我对此数据结构有控制权,但现在它的结构类似 -

我希望使用像 grep 这样的 selectattr() 过滤器,但它不可用。

致命:[tstServer]:失败!=> {"failed": true, "msg": "模版字符串时出现模板错误:没有名为 'selectattr' 的过滤器。字符串:{{ ansible_mounts | selectattr('mount', 'equalto', item.mount ) }}" }

使用神社 2.6。不知道为什么 selectattr() 不存在。
(这是詹金斯的输出,如果有人关心的话。)

乐于使用whenfailassertwith_itemswith_nestedcombine()和/或其他任何东西;只是还没有找到合适的组合来使它整洁。我宁愿它不采取十几个步骤 - 一个将是理想的。

建议?

附录:我可以通过一个步骤轻松地确认安装点fail: ... when: not item.mount|is_mount

...这很有趣,因为虽然/dev/shm以这种方式显示为挂载点(以及从df&之类的命令mount),但它不包含在ansible_mounts.

这意味着我不能只用ansible_mounts单独with_nested的 for来检查文件大小/dev/shm。这让我变成了一只悲伤的熊猫。

进一步的附录:

事实证明,我必须检查一个通常可通过常用文件系统获得的挂载点 (/tmp) - 最佳选项 ansible_mounts!- 一个 (/dev/shm) 是 tempfs - 最简单的似乎是 df,它也可以处理 /tmp - 以及 oracle 管理的一堆,所以它们只能通过 fdisk 获得。

最后,我必须检查每个系统的十几个驱动器,但 /tmp 是 ansible_mounts 唯一可用的驱动器。话虽这么说,我的问题变得像我问的那样没有意义......

感谢您的输入。