ansible - 无法将 ansible fact 设置为整数
问题描述
我正在尝试提取主要发行版版本(其中 ansible_facts 保存为字符串)并将其存储为整数,以便以后 < 或 > 与整数进行比较。当我这样做时:
set_fact:
distromajor: "{{ ansible_facts['distribution_major_version'] | int }}"
我发现 distromajor 持有“7”而不是 7。所以后来的比较失败了。事实上,我能让它工作的唯一方法就是像这样比较:
(distromajor|int >=6) and (distromajor|int <= 8)
这是预期的行为吗?为什么我不能将发行版主版本保存为 int?
最接近的SO 问题没有解释为什么在比较时没有将 distromajor 变量重新转换为 int 的情况下以后的整数比较失败。
解决方案
问:“这是预期的行为吗? ”
答:是的。这是 Ansible 中的预期行为。
问:“为什么我不能将发行版主版本保存为 int? ”
A:Ansible 决定你不能(待办事项:需要参考源代码)。在YAML中,有三个基本原语:
- 映射(哈希/字典)
- 序列(数组/列表)
- 标量(字符串/数字)
如您所见,标量既是字符串又是数字。但是,出于某种我不知道的原因,Ansible 决定任何"{{ scalar }}"
表达式只能返回string或boolean。例如
- set_fact:
distromajor: "{{ ansible_facts['distribution_major_version']|int }}"
- debug:
var: distromajor
- debug:
msg: "{{ distromajor|type_debug }}"
正如您已经发现的那样,尽管显式转换为整数,但仍给出一个字符串
distromajor: '20'
msg: AnsibleUnsafeText
推荐阅读
- android - 分别触发 OnClickListener 和 OnTouchListener
- storage-access-framework - 是否可以与其他应用程序共享使用存储访问框架存储的文件
- docker - 如何在 docker-compose.yml 中引用快捷方式?
- node.js - 从 nuxt.config.js 生成到根目录
- mysql - MySQL - 预订查询 - 选择在给定日期范围内可用的所有产品
- php - 无法在 PHP 中捕获 Twilio Sms 错误响应
- python - 过滤数据框列中的文本(python/Pandas)
- java - Spring 应用程序的自定义端口和其他参数
- c# - 找不到系统,找不到 Xamarin.Forms
- flask - 烧瓶重定向 -> 错误 302 & render_template -> 没有任何反应