(release-3008.1)=
Salt 3008.1 release notes#
Changelog#
Changed#
Changed
salt.returners.redis_returnto enumerate the Redis keyspace #69037with
SCANinstead of the blockingKEYS patterncommand in both #69037get_jidsandclean_old_jobs.KEYSwalks the entire keyspace #69037synchronously and stalls the Redis server for the duration; on a #69037
master with hundreds of thousands of jobs this can block all clients #69037
of that Redis instance for seconds.
SCANis incremental and #69037non-blocking. Order of returned keys is no longer guaranteed (the #69037
returner does not rely on order); operators with custom scripts that #69037
read
ret:*orload:*directly may see them in a different order. #69037
Fixed#
Fixed
win_pkgfunctions ignoring thesaltenvsetting in minion configuration. All public functions (refresh_db,genrepo,install,remove,list_pkgs,latest_version,upgrade_available,list_upgrades,list_available,version,get_repo_data,get_package_info) now fall back to__opts__["saltenv"]whensaltenvis not passed explicitly, instead of always defaulting tobase. #38551Added
encodingparameter tofile.replaceexecution module and state to support UTF-16, UTF-32, and other multi-byte encoded files that would otherwise be incorrectly treated as binary. #52793Improved documentation for the
runasandpasswordparameters incmd.run,cmd.script, and allsalt.modules.cmdmodexecution functions on Windows. The docs now accurately describe when a password is required: only when the salt-minion is not running as SYSTEM or as an elevated Administrator. Removed the inaccurate claim that the target user account must be in the Administrators group. Also changedcmd.scriptto log a warning instead of hard-failing whenrunasis used without a password on Windows, since a password is not always required. #57951Fixed
SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MACerrors in the VMware cloud driver by reconnecting when a cached vCenter service instance is found to be stale or corrupted (for example when inherited across a fork by salt-cloud's parallel provider queries). #61983Fixed event signature verification failing under
minion_sign_messages. The minion was signing the return load beforesalt.channel.client.AsyncReqChannel._package_loadattached transport metadata (nonce,ts,tok,id), so the bytes the master re-serialized to verify did not match what was signed and every signed return was dropped. Signing is now performed inside_package_loadafter the metadata is attached, against the same bytes the master verifies. #68181Fixed two distinct bugs in the
salt.engines.redis_sentinelengine that #69031together prevented it from being usable.
start()no longer raises #69031AttributeError: 'dict_values' object has no attribute 'pop'on Python 3 #69031(the dict.values() result is now wrapped in
list(...)).Listenerand #69031start()now accept an optionalpasswordargument and forward it to #69031the redis client, allowing the engine to authenticate against a Sentinel #69031
that requires AUTH; the default of
Nonekeeps existing configurations #69031working unchanged. #69031
Fixed
salt.returners.redis_returnsilently ignoring the documented #69032redis.passwordconfiguration option. The returner now reads #69032redis.passwordfrom config (in both regular and proxy modes) and #69032forwards it to both the single-server
redis.StrictRedisand the #69032StrictRedisClusterconstructors. Operators with auth-protected Redis #69032no longer lose every job return to a hidden `NOAUTH Authentication #69032
required` failure; deployments without a password are unaffected. #69032
Fixed three closely-related bugs in
salt.cache.redis_cachethat #69033together broke hierarchical-bank semantics: #69033
_build_bank_hiernow registers each child bank name in both the #69033parent's
$BANK_set (consumed byflush()tree traversal) and the #69033parent's
$BANKEYS_set (consumed bylist_());_get_banks_to_remove#69033now decodes the bytes returned by
smembersand skips the"."#69033placeholder, so recursive
flush()of a parent bank actually descends #69033into sub-banks instead of corrupting the path; and
flush(bank)of a #69033sub-bank now removes the flushed bank's own reference from its #69033
parent's index sets so
list_(parent)no longer reports it as #69033present. Together these fixes restore
cache.list("minions"), #69033salt-run manage.presentandsalt-run manage.upfor masters #69033configured with
cache: redis. #69033Fixed
salt.tokens.redisclusterbeing unable to retrieve any eauth #69035token. The cluster client was created with
decode_responses=True, #69035which caused
redis_client.get()to returnstrand broke #69035salt.payload.loads(msgpack rejectsstr); it also caused #69035redis_client.keys()to returnstrand broke #69035[k.decode("utf8") for k in ...](strhas no.decode). Both #69035errors were swallowed by broad
except Exceptionhandlers, so eauth #69035appeared to silently reject every token.
decode_responses=Trueis #69035removed; values now round-trip as bytes through msgpack as the rest #69035
of the module already expected. #69035
Fixed
salt.returners.redis_returnleaking<minion>:<fun>last-jid #69038pointer keys indefinitely. The pointer was written with
pipeline.set#69038and no
ex=TTL, so any (minion, fun) pair that stopped running stuck #69038in Redis forever -- O(minions × distinct funcs) keys accumulating over #69038
the lifetime of the master. The pointer now expires on the same TTL #69038
as the rest of the returner data (
keep_jobs_seconds). Operators with #69038external scripts reading these keys directly may observe them #69038
expiring; the documentation never promised they would not. #69038
Fixed
salt.returners.redis_return.get_funalways returning an #69039empty dict. The function read return data from a
<minion>:<jid>#69039key that no other code in the module ever wrote -- a leftover from #69039
an older storage schema. It now reads from the canonical #69039
ret:<jid>hash viaHGET ret:<jid> <minion>, matching the #69039storage layout that
returneractually produces and the read #69039pattern that
get_jidalready uses. #69039cmd.runand friends no longer include theenvandstdinarguments in theCommandExecutionErrorraised when the underlying subprocess fails to start (typicallyENOENT/ binary not found). Both fields routinely carry credentials passed in by the caller (env={"DB_PASSWORD": "..."}, password piped viastdin), and the error message ends up in master/minion logs and in event-bus return data visible to the API caller. #69075Relenv 0.22.14 #69129
Update python 3.14 to 3.14.6 #69129
Update sqlite to 3.53.2.0 #69129
Update openssl to 3.5.7 #69129
Fix pillar masking leaking
**********into rendered pillar and state values.MaskedDict/MaskedList__repr__/__str__now consult thesalt.utils.secret.mask_pillarContextVar, so{{ pillar['list_or_dict_value'] }}interpolations on the minion return plain values inside a render bracket. Hoist themask_pillar=Falsebracket fromrender_pillartocompile_pillarsoext_pillarhandlers and the rest of the master-side pillar build also run unmasked. #69160Fixed Windows MSI self-upgrade via
pkg.installfailing with error 1603. The old product'sDeleteConfig_DECACcustom action was unconditionally deletingROOTDIR\varduringRemoveExistingProducts, destroying the MSI thatpkg.installhad cached toROOTDIR\var\cachebefore launching the upgrade. Users who hadREMOVE_CONFIG=1persisted in the registry (from checking "On uninstall" at install time) hit a worse variant where the entireROOTDIRwas deleted. The fix checksUPGRADINGPRODUCTCODE— set by Windows Installer whenever an uninstall is triggered by a major upgrade — and skips allROOTDIRdeletion during upgrades, matching the behaviour of the NSIS installer which has always preservedROOTDIRduring upgrades. #69219Fixed
TypeError: string indices must be integersin the minion when the master returns a bare string error response (e.g."bad load","Some exception handling minion payload") for a pillar request. The minion now raises a cleanAuthenticationErrorinstead of crashing, allowing the caller to retry or fail gracefully. #69228pkg.list_patches in yumpkg.py parses tdnf output on Photon OS #69229
Restore Python dependencies in the PyPI sdist by including
requirements/*.inandrequirements/**/*.lockinMANIFEST.in. After the requirements.txt→.inrename, the sdist no longer shipped the files thatsetup.pyreads to populateinstall_requires, sopip install saltproduced an installation with no dependencies. #69244Fix
salt-cloudfailing to start withAttributeError: module 'salt' has no attribute 'minion'by importingsalt.minioninsalt.cloud. #69281Ensure multiple masters have their own job/state queues #69308
Fixed minion state queue replacing the master-assigned JID on queued state runs, so returns now come back tagged with the JID the master actually published. #69386
Made the salt user's home directory and the relenv
extras-<py-ver>directory configurable in the Linux packaging. The DEB preinst scripts now source/etc/default/salt-setup(and/etc/sysconfig/salt-minion-setupfor cross-distro parity with RPM) before applying theSALT_HOME/SALT_USER/SALT_GROUP/SALT_NAMEdefaults, mirroring the long-standing RPM behavior. A newSALT_EXTRAS_DIRoverride is honored by both stacks so the extras tree can be relocated outside/opt/saltstack/saltand its ownership is correctly restored on upgrade. #69402
Added#
Added
dsc_resourceexecution module and state module for invoking individual #43718PowerShell DSC resources directly via
Invoke-DscResource, without compiling #43718a MOF file or involving the Local Configuration Manager. The #43718
dsc_resource.managedstate provides idiomatic Salt state management for any #43718installed DSC resource module. #43718
fix etcdv3 module authentification when using etcd3-py lib #69202