我有多个盐状态和命令,在其他作业当前可以运行时执行。
然后我收到新作业的错误,例如:
函数“state.apply”以 PID 3869 运行,并于 2017 年 3 月 23 日 10:19:32.691177 启动,jid 20170323101932691177
有没有办法等待其他作业先完成或并行运行作业?
我在状态文件中注释掉 jinja 代码时遇到问题,我在 sls 文件中有一个 for 循环
{% for user_name in salt['pillar.get']('userlist') %}
get_user:
- Some code here
....
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我用 注释掉它#,但是当我在小兵中执行状态时,循环仍在运行。
# {% for user_name in salt['pillar.get']('userlist') %}
get_user:
- Some code here
....
# {% endfor %}
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
我的 SaltStack Pillar 中有以下 YAML:
prometheus:
services:
cassandra:
enabled: False
cockroachdb:
enabled: True
haproxy:
enabled: True
swift:
enabled: False
Run Code Online (Sandbox Code Playgroud)
我希望能够循环访问已启用的服务列表。
{% for enabled_service_name in prometheus.services | selectattr('enabled') %}
{{ enabled_service_name }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为我尝试过滤的属性位于服务名称下方的嵌套字典中:
prometheus:
services:
cassandra:
enabled: False
cockroachdb:
enabled: True
haproxy:
enabled: True
swift:
enabled: False
Run Code Online (Sandbox Code Playgroud)
我显然可以通过在循环内应用条件测试来实现我想要的:
{% for name, properties in prometheus.services | dictsort %}
{% if properties.enabled %}
configuration for {{ name }}
{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
然而,我会经常循环这个列表,并且更喜欢让 Jinja 在 for 循环中内嵌应用过滤器。
有没有办法按嵌套字典中项目的值进行过滤?
我正在创建一个添加iptables规则的公式/状态文件:
ipt_allow:
iptables.append:
- table: filter
- chain: INPUT
- jump: ACCEPT
- match: state
- connstate: 'NEW,ESTABLISHED'
- dport: 6666
- proto: tcp
- source: 'ip1, ip2, ip3, ...'
Run Code Online (Sandbox Code Playgroud)
我不想硬编码IP地址source.ip1,, ip2和ip3是与谷物相匹配的爪牙的IP地址role:role1.这样一来,如果我role1在路上添加更多的碎片,那么一旦我重新运行这个状态文件,它们就会被添加到iptables规则中.我该怎么做呢?
我开始玩Salt了.我找不到任何关于如何使状态依赖于多个其他状态的信息.
state_a:
module.run:
- name: my.module
- m_name: name_a
state_b:
module.run:
- name: my.module
- m_name: name_b
state_c:
module.run:
- name: my.module
- m_name: name_c
- require:
- module: ...
Run Code Online (Sandbox Code Playgroud)
怎样才能让state_c到require双方state_a和state_b?
额外问题:Key: Single Value在Salt中使用结构定义依赖关系背后的理由是什么?
在salt状态文件中,如何将柱的内容添加到远程salt-minion上的文件中?
例如,如果我有支柱数据,如:
ssl:
some-domain.com:
key:
-----BEGIN RSA PRIVATE KEY-----
MIICX... snip ...
Run Code Online (Sandbox Code Playgroud)
在远程salt-minion上,我希望有一个类似的文件,/etc/nginx/ssl/som-domain.com.key其中包含该私钥的内容,我该怎么做?我也愿意接受这样一个答案:"你做错了,假的." 只要你给我一些见解并指出我正确的方向,它将会有很大的帮助.
我知道盐的file.managed,和file.*来自某些测试的朋友,但我不确定是否有一种最佳/首选的方法可以将任意支柱数据添加到远程文件中,就像我正在尝试的那样.
我还在学习/用盐攻击,所以我还在使用Yaml + Jinja进行模板化,如果你在制定一个合适的答案时很重要.
谢谢!
编辑: 顺便说一下,目前的hacky解决方案是:
在我的file_root/srv/salt /中创建一个文件,就像/srv/salt/ssl/some-domain.com.key包含类似的文件一样{{ salt[pillar.get]('ssl:some-domain.com:key') }}
但这看起来真是太烂了.在这里寻找更好的解决方案.
这有什么不同:
dic1:
- subdict1.1: value11.1
- subdict1.2: value1.2
- cubdict1.3: value1.3
Run Code Online (Sandbox Code Playgroud)
还有这个:
dict2:
subdict2.1: value2.2
subdict2.1: value2.2
subdict2.3: value2.3
Run Code Online (Sandbox Code Playgroud)
我知道第一个评估字典列表.但第二个是什么?还不是字典列表?
我有几个几乎相同的状态.他们都部署项目,创建virtualenv并配置主管.差异仅在于回购,项目名称和一些其他操作.
很多代码都是重复的.是否可以将相同的部件放入文件中并将其包含在其他变量中?
在Ansible中,可以这样做:
tasks:
- include: wordpress.yml
vars:
wp_user: timmy
ssh_keys:
- keys/one.txt
- keys/two.txt
Run Code Online (Sandbox Code Playgroud) 根据saltstack文档,它是"json":https://docs.saltstack.com/en/latest/ref/renderers/all/salt.renderers.jinja.html
但是在jinja doc http://jinja.pocoo.org/docs/2.9/templates/#builtin-filters中 - 没有"json",而是"tojson".
有人知道为什么吗?