SaltStack官方于2020.2月初发布了最新的功能版本——Salt 3000,代号 Neon。相对而言,本次发布的版本,在主要功能上的变化并不算大,具体有哪些增、删、改的变更,请大家详见下文的展开说明。
您也可以参考在Github上维护的一份相同的技术资料:Salt 3000 Release Notes - Codename Neon
由于历史原因,Salt要求PyCrypto作为“lowest common denominator”(需要符合的最低要求)。 但是,PyCrypto并没有得到持续维护,最佳实践是手动升级以使用维护程度更高的库,例如PyCryptodome。 有关更多信息,请参见问题#52674和问题#54115
Neon发行版已删除了日期形式的版本控制。 展望未来,我们将使用从3000
开始的基于非日期的版本架构。版本将为MAJOR.PATCH
。 对于包含功能和/或错误修复的计划发行版,MAJOR版本将增加。 请查看批准的 SEP 以获取更多详细信息。
新版本控制方案符合PEP 440,但distutils.StrictVersion将导致错误的无效版本号。 如果使用StrictVersion比较Salt的版本,请使用LooseVersion。 您还可以使用打包库来比较版本。 另一种选择是使用 salt version module。
请注意,当前不支持使用Python 3.8运行Salt。 建议不要使用高于3.7的版本。
Tornado代码库已包含在salt.ext.tornado
中。 这样做是为了在所有操作系统上提供一致的Tornado版本,同时我们继续致力于将Tornado升级到最新版本。 使用Tornado的新代码应从salt.ext.tornado
导入模块,而不是导入Tornado的系统版本。
Salt目前与msgpack 1.0.0rc1不兼容。 我们建议使用版本<1.0.0。 这会影响Salt Master对minions运行命令的能力。 有关更多详细信息和更新,请参见问题56007。
使用pip安装salt时,此版本无法在Windows上正确安装。 PR 56099中解决了此问题。此问题的解决方法是:
pip install "pywin32==224" "WMI==1.4.9"
那些使用Salt Windows Installer的用户不受此问题的影响。
该模块自 2018.3 发行版中开始提供, 在本次发布版本中 saltcheck 模块在以下方面得到了加强:
Saltcheck提供了类似于单元测试的功能,仅需要有关Salt模块执行和Yaml的知识。 Saltcheck使用Salt模块返回数据,然后针对该返回运行断言。 这允许使用salt模块中包含的所有功能进行测试。
为了运行状态和highstate状态saltcheck测试,必须在状态目录中创建一个子文件夹并将其命名为saltcheck-tests
。 状态测试应在*.tst
结尾的文件中创建,并将其放置在saltcheck-tests
文件夹中。 tst
文件通过salt渲染系统运行,从而使测试可以用yaml(或选择的渲染器)编写,并包括jinja以及常规的grain和pillar信息。 像状态一样,可以在一个tst
文件中指定多个测试。 可以在saltcheck-tests
文件夹中创建多个tst
文件,并且应将其命名为与关联状态相同的名称。 测试的id
与salt状态文件中的id
相同,并且应唯一且具有描述性。
文件在系统中分布的示例::
/srv/salt/apache/
init.sls
config.sls
saltcheck-tests/
init.tst
config.tst
deployment_validation.tst
可以按state状态的name名称运行测试,如运行所有的apache/saltcheck/*.tst
测试文件或在top.sls中为分配给该minion的所有状态运行测试。 也可以在没有关联状态的情况下创建测试。 这些测试将通过使用saltcheck.run_state_tests
来运行,并不会由saltcheck.run_highstate_tests
自动运行。
salt '*' saltcheck.run_state_tests apache,apache.config
salt '*' saltcheck.run_state_tests apache check_all=True
salt '*' saltcheck.run_highstate_tests
salt '*' saltcheck.run_state_tests apache.deployment_validation
{# will run the common salt state before further testing #}
setup_test_environment:
module_and_function: saltcheck.state_apply
args:
- common
pillar-data:
data: value
{% for package in ["apache2", "openssh"] %}
{# or another example #}
{# for package in salt['pillar.get']("packages") #}
jinja_test_{{ package }}_latest:
module_and_function: pkg.upgrade_available
args:
- {{ package }}
assertion: assertFalse
{% endfor %}
validate_user_present_and_shell:
module_and_function: user.info
args:
- root
assertion: assertEqual
expected-return: /bin/bash
assertion_section: shell
print_result: False
skip_test:
module_and_function: pkg.upgrade_available
args:
- apache2
assertion: assertFalse
skip: True
Saltcheck输出已得到增强,可以显示每次测试所花费的时间。 这将导致输出格式的更改。
先前的输出:
local:
|_
----------
ntp:
----------
ntp-client-installed:
Pass
ntp-service-status:
Pass
|_
----------
TEST RESULTS:
----------
Failed:
0
Missing Tests:
0
Passed:
2
New output:
local:
|_
----------
ntp:
----------
ntp-client-installed:
----------
duration:
1.0408
status:
Pass
ntp-service-status:
----------
duration:
1.464
status:
Pass
|_
----------
TEST RESULTS:
----------
Execution Time:
2.5048
Failed:
0
Missing Tests:
0
Passed:
2
Skipped:
0
现在,可以使用salt模块运行unless
和onlyif
条件。 字典必须包含一个参数fun
,它是正在运行的模块,其他所有参数都必须在args键下传递,或作为单独的kwargs传递给模块函数。
注意
某些states的
unless/onlyif
实现早于此功能,可能无法按预期工作:
states.git
states.cmd
states.macpackage
states.file
states.docker_container
例如:
check external ip address:
http.query:
- name: https://icanhazip.com
- status: 200
- onlyif:
- fun: file.file_exists
path: /usr/local/bin/whatever
等效于:
check another ip address:
http.query:
- name: https://icanhazip.com
- status: 200
- onlyif:
- test -f /tmp/fnord.txt
另一个例子:
set mysql root password:
debconf.set:
- name: mysql-server-5.7
- data:
'mysql-server/root_password': {'type': 'password', 'value': {{pillar['mysql.pass']}} }
- unless:
- fun: pkg.version
args:
- mysql-server-5.7
现在提供了一个用于管理Java Keystore文件的新的state和execution 模块。 它允许添加/删除/列出以及管理keystore密钥库文件。
# salt-call keystore.list /path/to/keystore.jks changeit
local:
|_
----------
alias:
hostname1
expired:
True
sha1:
CB:5E:DE:50:57:99:51:87:8E:2E:67:13:C5:3B:E9:38:EB:23:7E:40
type:
TrustedCertEntry
valid_start:
August 22 2012
valid_until:
August 21 2017
define_keystore:
keystore.managed:
- name: /tmp/statestore.jks
- passphrase: changeit
- force_remove: True
- entries:
- alias: hostname1
certificate: /tmp/testcert.crt
- alias: remotehost
certificate: /tmp/512.cert
private_key: /tmp/512.key
- alias: stringhost
certificate: |
-----BEGIN CERTIFICATE-----
MIICEjCCAX
Hn+GmxZA
-----END CERTIFICATE-----
现在提供一个用于编辑XML文件的新状态和执行模块。 当前,它允许编辑来自xpath查询的值或编辑XML ID。
# salt-call xml.set_attribute /tmp/test.xml ".//actor[@id='3']" editedby "Jane Doe"
local:
True
# salt-call xml.get_attribute /tmp/test.xml ".//actor[@id='3']"
local:
----------
editedby:
Jane Doe
id:
3
# salt-call xml.get_value /tmp/test.xml ".//actor[@id='2']"
local:
Liam Neeson
# salt-call xml.set_value /tmp/test.xml ".//actor[@id='2']" "Patrick Stewart"
local:
True
# salt-call xml.get_value /tmp/test.xml ".//actor[@id='2']"
local:
Patrick Stewart
ensure_value_true:
xml.value_present:
- name: /tmp/test.xml
- xpath: .//actor[@id='1']
- value: William Shatner
对win_lgpo进行了多项修复,以扩展对其他策略的支持并提高性能。 已经解决了在ADML文件中发现的编码和不支持的字符(智能引号、破折号等)以及某些策略中的空格的问题。
速度增强包括:
__context__
中从ADMX/ADML文件缓存已编译的xml附加功能:
对win_lgpo状态进行了多次更改以提高性能。
现在,它使用lgpo.get_policy
函数而不是lgpo.get
,以避免在每次状态运行的开始和结束时重新加载计算机上的所有设置。
支持新的较短的策略名称,但也尝试解析较旧的较长的策略名称。
现在使用.NET库在支持Windows的Windows系统上获取接口信息。 不支持的系统会退回到更昂贵的WMI调用。 这一点很重要,因为此数据是针对grains收集的,并且在每次处理fork分叉时都会发生。
为map.jinja
添加了一个新的故障排除 execution module。
假设按如下方式将map加载到公式SLS中:
{% from "myformula/map.jinja" import myformula with context %}
以下命令可以用来加载 map 并检查结果:
salt myminion jinja.load_map myformula/map.jinja myformula
这个模块也可以拿来测试 json 和 yaml maps:
salt myminion jinja.import_yaml myformula/defaults.yaml
salt myminion jinja.import_json myformula/defaults.json
已添加Ansible json_query Jinja过滤器的端口。 它允许使用JMESPath语言针对JSON数据进行查询。 可以用于过滤pillar数据、yaml映射,也可以用于http_query。
取决于jmespath Python模块。
插槽语法已更新,以支持解析字典响应并添加文本。
demo dict parsing and append:
test.configurable_test_state:
- name: slot example
- changes: False
- comment: __slot__:salt:test.arg(shell="/bin/bash").kwargs.shell ~ /appended
local:
----------
ID: demo dict parsing and append
Function: test.configurable_test_state
Name: slot example
Result: True
Comment: /bin/bash/appended
Started: 09:59:58.623575
Duration: 1.229 ms
Changes:
此外,现在在嵌套状态数据结构(字典、列表、除非/仅当参数)中支持插槽解析:
demo slot parsing for nested elements:
file.managed:
- name: /tmp/slot.txt
- source: salt://slot.j2
- template: jinja
- context:
# Slot inside of the nested context dictionary
variable: __slot__:salt:test.echo(a_value)
- unless:
- fun: file.search
args:
# Slot as unless argument
- __slot__:salt:test.echo(/tmp/slot.txt)
- "DO NOT OVERRIDE"
ignore_if_missing: True
pchanges
,因此onchanges
和prereq
等requisites条件现在在测试模式下可以正常运行。module.run
来更轻松地处理更改。boto_ssm
模块以设置和查询AWS SSM参数中的secrets。可以通过在引擎配置中包括engine_module
参数来配置特定Salt引擎的多个副本。
engines:
- production_logstash:
host: production_log.my_network.com
port: 5959
proto: tcp
engine_module: logstash
- develop_logstash:
host: develop_log.my_network.com
port: 5959
proto: tcp
engine_module: logstash
已添加新的fluent
引擎,以将Salt事件导出到fluentd中。
engines:
- fluent
host: localhost
port: 24224
@type file
path /var/log/td-agent/saltstack
可以通过在信标配置中包含beacon_module
参数来配置特定Salt信标的多个副本。
beacons:
watch_importand_file:
- files:
/etc/important_file: {}
- beacon_module: inotify
watch_another_file:
- files:
/etc/another_file: {}
- beacon_module: inotify
添加到chroot的新功能函数apply
,sls
和highstate
允许在sls文件中执行状态或在chroot内部运行apply/highstate。
Raet传输工具已被弃用。 请使用支持的传输协议tcp或zeromq。
dockermod.resolve_tag
函数中删除了对标签tags
kwarg参数的支持。dockermod.connect_container_to_network
函数中删除了对network_id
kwarg的支持。 请改用net_id
。dockermod.sls_build
函数中删除了对name
kwarg的支持。 请改用repository
和tag
。image
kwarg的支持。 在所有情况下,请同时使用repository
和tag
选项:
heat.create_stack
和heat.update_stack
函数中删除了enviroment
kwarg。 请改为使用environment
。ssh.get_known_host
函数的支持。 请改用ssh.get_known_host_entries
函数。ssh.recv_known_host
函数的支持。 请改用ssh.recv_known_host_entries
函数。firewalld
module 有以下变更:
firewalld.add_port 函数中force_masquerade
选项的默认设置已从True
更改为False
。
firewalld.add_port_fwd 函数中对force_masquerade
选项的支持已从True
更改为False
。
MS Teams
或Slack
可能是合适的替代品。quiet
的kwarg。 请改为将output_loglevel
设置为quiet
。heat.deployed
功能中删除了enviroment
。 请改为使用environment
。firewalld
状态已更改如下:
firewalld.present
函数中prune_services
选项的默认设置已从True
更改为False
。hgfs_env_whitelist
配置选项已被删除,以支持hgfs_saltenv_whitelist
。hgfs_env_blacklist
配置选项已删除,以支持hgfs_saltenv_blacklist
。svnfs_env_whitelist
配置选项已被删除,以支持svnfs_saltenv_whitelist
。svnfs_env_blacklist
配置选项已删除,以支持svnfs_saltenv_blacklist
。gitfs_env_whitelist
配置选项已删除,取而代之的是gitfs_saltenv_whitelist
。gitfs_env_blacklist
配置选项已被删除,以支持gitfs_saltenv_blacklist
。由于服务已停用,Hipchat引擎已被删除。 对于迁移到Slack的用户,Slack引擎可能是合适的替代者。
由于退役该服务,该hipchat returner已被移除。 对于迁移到Slack的用户,Slack Returner可能是合适的替代者。
对于smartos
,已经淘汰了一些grains。 这些grains已被去除。
hypervisor_uuid
已替换为mdata:sdc:server_uuid
grain。datacenter
已替换为mdata:sdc:datacenter_name
grain。nova云驱动程序已被删除,以支持openstack云驱动程序。
以下jinja过滤器设置为在Aluminum版本中删除:
salt.utils.__init__.py
中的所有功能均已删除。 这些包括:
salt/auth/__init__.py
文件中的salt.auth.Authorize
类已删除,salt/utils/minions.py
文件中的any_auth
方法已被删除。 这些方法和类未在Salt代码库内部使用。