- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下目录结构:
├── ansible.cfg
├── hosts.yml
├── playbook.yml
├── group_vars
| ├── all.yml
│ └── vm_dns.yml
└── roles
└── pihole
├── handlers
│ └── main.yml
└── tasks
└── main.yml
在 ansible.cfg
中,我只有:
[defaults]
inventory = ./hosts.yml
在 group_vars/all.yml
中,我有一些通用设置:
---
aptcachetime: 3600
locale: "en_GB.UTF-8"
timezone: "Europe/Paris"
然后在 hosts.yml
中设置我的 PiHole 虚拟机:
---
all:
vars:
ansible_python_interpreter: /usr/bin/python3
vm_dns:
vars:
dns_server: true
hosts:
vmb-dns:
pihole:
dns:
- "185.228.168.10"
- "185.228.169.11"
network:
ipv4: "192.168.2.4/24"
interface: eth0
vmk-dns:
pihole:
dns:
- "185.228.168.10"
- "185.228.169.11"
network:
ipv4: "192.168.3.4/24"
interface: eth0
此时,我没有尝试将任何变量移动到 group_vars,一切正常。
现在,我觉得可以通过将对 所有 vm_dns
主机相同的设置分解为一个 group_vars 文件来使主机文件更具可读性。所以我从 hosts.yml
中删除了所有 dns
和 interface
行,并将它们放在group_vars/vm_dns.yml
文件,像这样:
---
pihole:
dns:
- "185.228.168.10"
- "185.228.169.11"
network:
interface: eth0
此时,hosts.yml
包含:
---
all:
vars:
ansible_python_interpreter: /usr/bin/python3
vm_dns:
vars:
dns_server: true
hosts:
vmb-dns:
pihole:
network:
ipv4: "192.168.2.4/24"
vmk-dns:
pihole:
network:
ipv4: "192.168.3.4/24"
但是当我现在运行剧本时,一旦它尝试执行使用从 hosts.yml
移动到 group_vars/vm_dns.yml
的变量之一的任务>,Ansible 失败并显示 AnsibleUndefinedVariable: dict object has no attribute ...
。
我不太确定我是否只是误解了“Ansible 方式”,或者我正在尝试做什么(本质上是将同一列表的不同部分分成 hosts
和group_vars
,我想)不仅仅是可行的。我以为 "flattening" that Ansible does本来应该处理这个问题,但似乎 Ansible 根本没有合并 group_vars/vm_dns.yml
中定义的变量。
我已经阅读了 the subject 上的文档, 并找到了一些 almost-related posts , 但没有发现以这种方式展示跨主机和 group_vars 使用的 YAML 格式列表。
编辑:与此问题实际相关的其他 SO 或 Github 问题
In Ansible, how to combine variables from separate files into one array?
https://github.com/ansible/ansible/issues/58120
https://docs.ansible.com/ansible/latest/reference_appendices/config.html#default-hash-behaviour
最佳答案
由于您在主机级别的 list 中保留了 pihole
var 的定义,因此默认情况下这个定义会赢得游戏并替换先前在组级别的定义。查看variable precedence documentation .因此,如果您稍后尝试访问例如pihole.dns
或 pihole.network.interface
,映射不再存在,ansible 会引发上述错误。
这是 ansible 中的默认行为:按优先顺序用最新的变量替换先前的变量。但是您可以通过设置 hash_behaviour=merge
来更改字典的这种行为。在 ansible.cfg
中。
我对这个设置的个人实验并不十分令人满意:它在我自己的剧本/角色中表现正确,这些剧本/角色是专门为此制作的,但在包含第三方贡献(剧本片段、角色、自定义模块)时开始引发难以追踪的错误....)。所以我绝对不推荐它。而且,这个配置已经deprecated in ansible 2.10因此将在 ansible 2.14 中删除。如果你仍然想使用它,你应该尽可能地限制设置的范围,当然不要在全局级别设置它(即肯定不在 /etc/ansible/ansible.cfg
中)
我现在在全局范围内使用什么来解决这类问题:
---
pihole_host:
network:
ipv4: "192.168.2.4/24"
---
pihole_defaults:
dns:
- "185.228.168.10"
- "185.228.169.11"
network:
interface: eth0
(请注意,您可以利用上述变量的优先顺序在不同级别定义这些默认值)group_vars/all.yml
中),定义您的 var,它将是 default 和 specific 的组合,确保它始终默认为空 ---
# Calculate pihole from group defaults and host specific
pihole: >-
{{
(pihole_defaults | default({}))
| combine((pihole_host | default({})), recursive=true)
}}
关于Ansible - 在 hosts.yml 和 group_vars 之间拆分 YAML 格式的变量列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62566312/
我正在使用count()包中的函数plyr。从今天早上开始,我在运行以下代码时收到错误消息: Arrivaltime <- cut(Export_2019_2$Arrival,
将其放入group_vars/all: default_environment: HOME2: "{{ ansible_env.HOME }}" 在任务中使用时定义环境: environment:
这可能是一个奇怪的问题,我确信我已经看到了这个问题,但忽略了将其添加为书签。 我的主机存在于多个组中: [group1] host1 [group2] host2 [group3] host1 hos
我有一个虚拟的怀疑让我卡住了很长时间。我有一个非常平庸的 list 文件,其中包含主机和变量: [lb] 10.112.84.122 [tomcat] 10.112.84.124 [jboss5] 1
我正在尝试调试 ansible 如何在运行时填充我的一些模板。 我在 group_vars 中有两个文件: foo/etl.yml prod/etl.yml prod/etl.yml中有值应该覆盖 f
我有以下文件夹结构,这似乎使它能够构建和加载角色,但没有加载组和主机变量。怎么会? /etc/ansible/ - hosts - requirements.yml - group_vars/
我有一个要求,我需要在 Ansible 中使用 group_vars 但它不需要在同一路径上。基本上我的剧本在 SVN 中,每当我们想要部署时,我们实际上会检查最新版本的剧本,然后部署。 实际执行部署
我需要将一些 YAML 格式的文件从一个“大” yml 更改为几个较小的文件。不幸的是,我不知道哪个部分属于哪里。例如,我有以下 .yml: all: hosts: station01:
Ansible 最佳实践文档 recommends分离库存: inventories/ production/ hosts.ini # inventory file
对于现有项目,我将首先通过 Vagrant 将 bash 配置脚本替换为 ansible,然后在解决问题后将其推出到临时/生产服务器。 问题... 根据ansible docs在变量优先级上,grou
我之前一直将所有变量放在 list 文件中,例如 dse_dir=/app/dse dse_bin_dir={{ dse_dir }}/bin dse_conf_dir={{ dse_dir }}/r
有谁知道如何将剧本放入文件夹中,但共享相同的角色、group_vars 以及通常位于根目录的其他内容? 这是我想要的: root_dir:- group_vars- roles- inventory-
我试图从 list 组中获取 IP 地址列表而不是主机名。这些 IP 地址已经在我的主机变量中,但我无法让它们匹配来自其组名的列表。 这是我的原始剧本: - name: Install Kafka
这个问题在这里已经有了答案: Ansible with "Alternative Directory Layout" and using vaults (1 个回答) 4年前关闭。 我正在尝试使用 a
如果变量可以在 list 文件中或 group_vars 中,我如何从 list 中获取变量的值目录? 例如,region=place-a可能在 list 文件中或在 group_vars 中的文件中
假设 Ansible 结构: . ├── group_vars │ └── all └── site.yml 在哪里 all包含 my_test_variable: yes , 和 site.ym
我正在尝试在本地运行剧本,但我希望角色的 task/main.yml 文件中的所有变量都引用特定 list 文件中的 group_var。 不幸的是,剧本无法访问 group_vars 目录,就像无法
我们可以通过修改ansible.cfg中的roles_path来改变角色的路径。但该文档似乎没有提及任何有关更改 group_vars 和 host_vars 路径的内容。 如何更改这些路径? 我会将
我正在尝试将 ansible 连接到本地网络中的一台机器,这需要在 SSH 调用中传递一些额外的选项。我在 list 、组变量、主机变量中尝试了 ansible_ssh_extra_args,但它被忽
Ansible 2.10.1 提供以下弃用警告: [DEPRECATION WARNING]: DEFAULT_HASH_BEHAVIOUR option, This feature is fragi
我是一名优秀的程序员,十分优秀!