ansible - Ansible:将事实变量与字典变量一起使用
问题描述
我想在几个 linux 服务器上安装 Apache。Apache 软件包在 RedHat 或 Debian 操作系统(apache2 与 httpd)上的名称不同:这是一种使用 ansible 事实变量(“ansible_os_family”)作为字典变量键的方法吗?
类似的东西(但这不起作用):
---
- name: playbook1
hosts: all
become: yes
vars:
apache_packages: {
"RedHat": "httpd",
"Debian": "apache2"
}
tasks:
- name: Install Apache server
package:
name: "{{ apache_packages['{{ ansible_os_family }}'] }}"
state: present
...
解决方案
将Jinja 分隔符嵌套在另一个 Jinja 分隔符中绝不是一个好主意。
另一个规则是“胡须不堆叠”。我们经常看到这样的:
{{ somevar_{{other_var}} }}
如果您需要使用动态变量,请根据需要使用以下内容:
{{ hostvars[inventory_hostname]['somevar_' + other_var] }}
对于“非主机变量”,您可以使用vars 查找插件:
{{ lookup('vars', 'somevar_' + other_var) }}
如果你没有用引号括起来,它将被假定为一个变量,所以在这种情况下,这很简单:
name: "{{ apache_packages[ansible_os_family] }}"
推荐阅读
- xgboost - 使用 xgboost 预测 100 棵树与 1000 棵树所花费的时间相同
- java - Spring Boot socket-io-client v1 不会使用 ssl 发送到 socket.io 服务器
- rust - 如何在可变引用中获取、转换和替换向量?
- mysql-python - 注册检查Mysql和Python
- ffmpeg - 使用 ffmpeg 监控 HLS 和 ICY 流元数据
- c - 自定义 IO 仅写入标头,其余帧似乎省略
- git - `git add . && git commit --amend`?
- python - ValueError:形状 (29, 1) 和 (42, 1, 29) 不兼容 [Keras]
- javascript - 如何知道javascript剪贴板“复制”事件的发起者
- node.js - 插入嵌入文档并返回插入的子文档