如何解决是否可以将整个模块函数的参数放在一个支柱中?
考虑以下状态来安装软件包(取自 pkg.installed
文档):
httpd:
pkg.installed:
- fromrepo: mycustomrepo
- skip_verify: True
- skip_suggestions: True
- version: 2.0.6~ubuntu3
- refresh: True
- cache_valid_time: 300
- allow_updates: True
- hold: False
是否可以像这样将 pkg.installed
参数移动到支柱文件中:
pkg:
install:
- name: httpd
fromrepo: mycustomrepo
skip_verify: True
skip_suggestions: True
version: 2.0.6~ubuntu3
refresh: True
cache_valid_time: 300
allow_updates: True
hold: False
然后创建一个通用状态来安装这样的包:
{% for p in salt['pillar.get']('pkg:install') %}
install_{{ p.name }}:
pkg.installed:
{{ p }}
{% endfor %}
显然,这个例子不起作用,因为 {{ p }}
是一个 dict
而 pkg.installed
需要一个 list
,但希望这能说明我想要完成的任务。
现在想象一个场景,我有 5 个不同的应用程序在 5 个不同的 Minion 上运行,它们都需要 httpd
包,但它们都需要不同的参数。也许它们都使用不同的版本,其中之一不提供 refresh
参数。处理这个问题的最佳方法是什么?
现在,我唯一的选择是编写 5 个不同的状态,或者编写一个包含一堆丑陋条件的状态:
{% for p in salt['pillar.get']('pkg:install') %}
install_{{ p.name }}:
pkg.installed:
{% if p.fromrepo is defined %}
- fromrepo: {{ p.fromrepo }}
{% endif %}
{% if p.refresh is defined %}
- refresh: {{ p.refresh }}
{% endif %}
{% endif %}
我意识到我可以为其中一些参数创建默认值,但这不适用于 version
和 fromrepo
之类的参数(我会将这些默认设置为什么?)。那么无论如何要完成我想要做的事情,还是我应该回到绘图板并重新考虑我的整个方法?
解决方法
这是可以做到的,我在研究完全不相关的东西的盐配方中找到了一个例子。
假设一个 pillar 文件设置如下:
pkg:
install:
- name: httpd
fromrepo: mycustomrepo
skip_verify: True
version: 2.0.6~ubuntu3
- name: python38
skip_suggestions: True
hold: True
- name: java-1.8.0-openjdk
这将迭代 pkg:install
中的所有字典,然后迭代每个字典以应用键/值对:
{% for p in pkgs %}
install_{{ p.name }}_package:
pkg.installed:
{%- for k,v in p.items() %}
- {{ k }}: {{ v }}
{%- endfor %}
{% endfor %}
这是一个非常简单的解决方案,我想多了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。