将 Salt 升级到 Python 3(python3.5升级)
off999 2024-09-27 13:44 23 浏览 0 评论
更多分享微信公众号:【Python大本营】
截至 2020 年 1 月 1 日,Python 2 已正式结束生命周期,将不再收到任何更新(除了 4 月的最后一个)。各种 Linux 发行版将支持它一段时间;但是,许多组织已经切换到 Python 3 或计划在不久的将来这样做。
是时候将您的 Salt 安装切换到 Python 3:
- Salt Nitrogen (2017.7.0) 是第一个支持 Py3 的版本
- Salt Oxygen (2018.3.0) 获得了显着的 Py3 改进
- 盐氟(2019.2.0)可以认为或多或少成熟
- Salt 3001 Sodium(Salt 3000 Neon之后的那个)将弃用 Python 2.7
本指南介绍如何将 repo 从 Py2 切换到 Py3,识别和卸载旧包,然后安装 Py3 版本。它包含详细的清单,可帮助您计划和执行迁移。它也可以应用于定期升级。但是,它不是您可以盲目应用的 100% 自动万无一失的食谱。
- 10 项关键原则
- 规划升级过程
- 调查你的主人和仆从舰队
- 升级盐大师
- 在 Windows 上升级 Salt
- 在 Ubuntu 和 Debian 上升级 Salt
- 在 CentOS 和 Amazon Linux 上升级 Salt
- 在其他操作系统上升级 Salt
- 监控升级过?程
- 升级自动化
- 未来发展
10 项关键原则
在使用 Salt 的这些年里,我制定了一套十个自以为是的指导原则,可以帮助您维护和升级它。你不必遵循这些准则,我也经常打破它们。但是,它们在整篇文章中都有暗示。
1.有一个QA环境
QA 环境可以是手动的或自动的。目标是能够测试操作系统、Salt 版本(master 和 minion)以及可能的 highstates 的所需组合。始终进行分阶段/逐步推出。如果您的 QA 环境支持快照,您将节省大量时间。
2. 到处运行相同的 Salt 版本
Master 和 Minion 版本应该相同(唯一的例外是[1]和[5])。这是最常走的路。您无需根据不同的功能集调整您的状态。此外,升级过程要容易得多。
3.避免罕见的操作模式
较少的路径和设置显着改变了 Salt 的运行方式(传输、多处理、zmq 过滤、缓存、未记录的东西),往往会导致令人讨厌的意外。如果您想更改设置,请在您的 QA 环境中尝试一段时间。
4.控制引导/升级过程
- 不要使用“最新”的 repo 前缀(除了在 QA 环境中),不要急于升级到最新的主要版本
- 使用“存档”回购前缀,或将 Salt 包固定到次要版本(您永远不知道何时会发生另一个 2019.2.1)
- 引导新的 minions 时始终安装特定版本(例如,通过script_argsSalt Cloud 选项)
是的,小的升级需要更多的工作。但这是您可以控制并决定何时执行的工作。当奴才自动升级并且出现问题时,您无法控制突然出现的工作。
5.先升级master
升级 Salt 时,先升级 master。年长的主人可以(并且最终会)破坏事物。
6.备份密钥
设置/etc/salt/pki主目录的定期备份。除此之外,您的 Salt Master 应该是一次性的,并且状态/支柱应该保存在版本控制系统中(或从外部数据源中提取)。
7.有备用访问路径
当 Salt 出现故障时,制定 B 计划来访问您的服务器。使用salt-ssh、fabric、ansible、ssh、winrm或任何其他工具。保留一个 minion IP 列表也很有帮助(您可以定期从 master grain 缓存中提取它们)。
8、使用Salt作为运维控制平面
避免让您的生产工作负载依赖于 Salt。如果您卸载 Salt,您的生产环境应该可以保持运行(至少在一段时间内)。
如果您有资源,您可能还需要考虑最后两个原则:
9. 镜像 Salt 存储库
我从来不需要这样做,但我在官方 repo 中看到了罕见的连接问题。此外,对于某些人来说,当 SaltStack 删除(然后迅速返回)有缺陷的 2019.2.1 版本时,minion 引导过程被破坏了。如果您遵循原则[4],这不是什么大问题。
10.构建自己的包
错误会发生,您需要快速修复它们而无需等待下一个版本。此外,您可能希望在新功能发布之前集成它们。自定义包是实现这一目标的一种方式。它们使您可以完全控制您运行的 Salt 代码。
我在 2012 年或 2013 年从 virtualenv 运行了一个修补过的 salt-master 一段时间,但我不再这样做了。相反,我更喜欢更轻量级的方法来修补 Salt。
规划升级过程
1. 调查你的主从舰队
下面提供了有用的命令列表。您应该检查许多尺寸:
- 操作系统、架构和版本
- 可用的存储库
- Python 版本
- 大师版和小兵版
- 盐依赖
主要目标是找到所有现有的组合,以便您可以详尽地测试升级过程。另请查看Py3 支持列表。
2.准备QA环境
理想情况下,您希望能够:
- 测试相同的 OS/Salt 版本
- 测试现有的高态
- 测试在您的基础设施之上运行的实际工作负载
您需要多次测试升级过程,因此需要一个快速的反馈周期(例如,快速快照/恢复您的 QA 环境会很好)。
3.更新状态
确保您的状态与目标 Salt 版本兼容。阅读官方发行说明并搜索任何未解决的问题。
4.确定升级过程
例如:
- 执行备份(主/从密钥、备用连接路径等)
- 升级操作系统包,运行 autoclean/autoremove。如果您有新内核,可以选择重新启动。
- 禁用任何可能干扰升级过程的定期 Salt 作业和其他内容。尝试小黄人停电
- 将 master 升级到目标版本,同时保留在 Py2 上
- 确保引导新 minions 的现有进程使用目标 Salt 版本 (Py3)
- 将 minions 升级到目标版本,同时保留在 Py2 上。如果这不可行,请升级到每个发行版可用的最新版本。
- 将 Salt Master 升级到 Py3
- 分别为每个操作系统将 Salt minions 升级到 Py3
考虑小兵升级顺序。您的环境可能需要一些特定的升级顺序。
目标是删除旧的 Salt 版本及其依赖项(以避免包含来自不同 repos 的包),然后从头开始引导 Py3。
如果你的仆从是一次性的,你可以避免就地升级过程,而是从头开始重建它们。另一种选择是蓝/绿部署。
5.多次测试升级过程
- 手动升级你的主人
- 确保升级后可以访问他们的仆从
- 为每个操作系统手动升级单个 Minion
- 确保升级后的 minions 可以访问,可以应用 highstates,并且业务应用程序正常运行
- 自动化上述步骤
- 多次测试自动化
- 测试备份选项(主/从密钥、备用连接路径等)
- 测试新 minions 的引导过程
6.进行升级
- 决定你想要多少个升级阶段
- 确定合适的时间表
- 通知团队
- 执行并验证备份(主/从密钥、备用连接路径等)
- 将新奴才的引导程序切换到目标版本
- 升级大师
- 升级小兵
- 监控结果
调查你的主人和仆从舰队
列出版本
% sudo salt '*' test.version
% sudo salt '*' pkg.version salt-minion
% sudo salt '*' test.versions_report
(您可能会发现已安装的依赖项有很多变化!)
% sudo salt '*' grains.item pythonversion
% sudo salt-run manage.versions
Master:
2019.2.3
Minion requires update:
----------
minion1:
2018.3.5
minion2:
2018.3.5
minion3:
2018.3.5
win10:
2018.3.5
sudo salt-run survey.hash '*' test.version
|_
----------
pool:
- minion1
- minion2
- minion3
- win10
result:
2018.3.5
列出存储库和密钥
% sudo salt '*' pkg.list_repos
% sudo salt '*' pkg.get_repo_keys
结合jq以获得更紧凑的输出:
% sudo salt -G "os:Ubuntu" pkg.list_repos --static --out json | jq '.[] | with_entries(select(.key|contains("saltstack"))) | .[][].line'
"deb https://repo.saltstack.com/apt/ubuntu/18.04/amd64/archive/2018.3.5 bionic main"
"deb https://repo.saltstack.com/apt/ubuntu/18.04/amd64/archive/2019.2.3 bionic main"
% sudo salt -G "os:Debian" pkg.list_repos --static --out json | jq '.[] | with_entries(select(.key|contains("saltstack"))) | .[][].line'
"deb https://repo.saltstack.com/apt/debian/9/amd64/archive/2018.3.5 stretch main"
"deb https://repo.saltstack.com/apt/debian/9/amd64/archive/2019.2.3 stretch main"
% sudo salt -G "os:CentOS" pkg.list_repos --static --out json | jq '.[] | with_entries(select(.key|contains("saltstack"))) | .[].baseurl'
"https://repo.saltstack.com/yum/redhat/7/$basearch/archive/2018.3.5/"
"https://repo.saltstack.com/yum/redhat/7/$basearch/archive/2019.2.3/"
针对 py2 minions
% sudo salt -C "G@os:Ubuntu and G@pythonversion:0:2" grains.item pythonversion saltversion
% sudo salt -C "G@os:Debian and G@pythonversion:0:2" grains.item pythonversion saltversion
% sudo salt -C "G@os:CentOS and G@pythonversion:0:2" grains.item pythonversion saltversion
% sudo salt -C "G@os:Windows and G@pythonversion:0:2" grains.item pythonversion saltversion
其他有用的目标谷物
- cpuarch
- lsb_distrib_codename
- lsb_distrib_id
- lsb_distrib_release
- os
- osarch
- oscodename
- osfinger
- osmajorrelease
- osrelease
- osversion
- pythonexecutable
- pythonversion
- saltpath
- saltversion
调查
任何模块调用(test.version、cmd.run、grains.item等)都可以与survey运行器结合使用:
sudo salt-run survey.hash '*' grains.item os osfinger pythonversion saltversion
|_
----------
pool:
- minion3k
result:
{u'osfinger': u'Ubuntu-18.04', u'saltversion': u'2018.3.5', u'os': u'Ubuntu', u'pythonversion': [2, 7, 17, u'final', 0]}
|_
----------
pool:
- minion2
result:
{u'osfinger': u'CentOS Linux-7', u'saltversion': u'2018.3.5', u'os': u'CentOS', u'pythonversion': [2, 7, 5, u'final', 0]}
|_
----------
pool:
- minion1
result:
{u'osfinger': u'Debian-9', u'saltversion': u'2018.3.5', u'os': u'Debian', u'pythonversion': [2, 7, 13, u'final', 0]}
|_
----------
pool:
- win10
result:
{u'osfinger': u'Windows-10', u'saltversion': u'2018.3.5', u'os': u'Windows', u'pythonversion': [2, 7, 14, u'final', 0]}
列出包来源
目标是查找从特定来源安装的软件包,以便您可以在升级过程中删除它们。
Ubuntu/Debian
我在Ask Ubuntu上找到了以下代码段。如果您知道在不安装 aptitude 或其他软件包的情况下执行相同操作的更直接的方法,那么我会全力以赴。
% apt-cache policy $(dpkg -l | awk 'NR >= 6 { print $2 }') |
awk '/^[^]/ { split($1, a, ":"); pkg = a[1] }
nextline == 1 { nextline = 0; printf("%-40s %-50s %s\n", pkg, $2, $3) }
/\*\*\*/ { nextline = 1 }' | grep saltstack
输出可能因操作系统而异:
salt-common https://repo.saltstack.com/apt/ubuntu/18.04/amd64/archive/2018.3.5 bionic/main
salt-minion https://repo.saltstack.com/apt/ubuntu/18.04/amd64/archive/2018.3.5 bionic/main
python-jinja2 https://repo.saltstack.com/apt/debian/9/amd64/archive/2018.3.5 stretch/main
salt-common https://repo.saltstack.com/apt/debian/9/amd64/archive/2018.3.5 stretch/main
salt-minion https://repo.saltstack.com/apt/debian/9/amd64/archive/2018.3.5 stretch/main
此外,您可以首先检查 Salt Minion 的安装方式。您需要确定显式安装了哪些软件包(可以自动删除其余的依赖项)。查看/var/log/apt/history.log:
德比安:
Start-Date: 2020-02-18 05:15:02
Commandline: apt-get install -y -o DPkg::Options::=--force-confold procps pciutils python-yaml
Requested-By: vagrant (1000)
Install: python-yaml:amd64 (3.12-1), libyaml-0-2:amd64 (0.1.7-2, automatic)
End-Date: 2020-02-18 05:15:02
Start-Date: 2020-02-18 05:15:05
Commandline: apt-get install -y -o DPkg::Options::=--force-confold wget gnupg2 apt-transport-https ca-certificates
Requested-By: vagrant (1000)
Install: gnupg2:amd64 (2.1.18-8~deb9u4), apt-transport-https:amd64 (1.4.9)
End-Date: 2020-02-18 05:15:06
Start-Date: 2020-02-18 05:15:35
Commandline: apt-get install -y -o DPkg::Options::=--force-confold salt-minion
Requested-By: vagrant (1000)
Ubuntu:
Start-Date: 2020-02-18 05:15:08
Commandline: apt-get install -y -o DPkg::Options::=--force-confold wget gnupg apt-transport-https ca-certificates
Requested-By: vagrant (1000)
Install: apt-transport-https:amd64 (1.6.12)
End-Date: 2020-02-18 05:15:08
Start-Date: 2020-02-18 05:15:49
Commandline: apt-get install -y -o DPkg::Options::=--force-confold python2.7 python-apt python-requests python-yaml procps pciutils
Requested-By: vagrant (1000)
Install: python-six:amd64 (1.11.0-2, automatic), python-openssl:amd64 (17.5.0-1ubuntu1, automatic), python-yaml:amd64 (3.12-1build2), python-requests:amd64 (2.18.4-2ubuntu0.1), python-certifi:amd64 (2018.1.18-2, automatic), python-chardet:amd64 (3.0.4-1, automatic), python-enum34:amd64 (1.1.6-2, automatic), python-cryptography:amd64 (2.1.4-1ubuntu1.3, automatic), python-cffi-backend:amd64 (1.11.5-1, automatic), python-ipaddress:amd64 (1.0.17-1, automatic), python-pkg-resources:amd64 (39.0.1-2, automatic), python-apt:amd64 (1.6.5ubuntu0.2), python-urllib3:amd64 (1.22-1ubuntu0.18.04.1, automatic), python-idna:amd64 (2.6-1, automatic), python-asn1crypto:amd64 (0.24.0-1, automatic)
Upgrade: python2.7-minimal:amd64 (2.7.15-4ubuntu4~18.04.2, 2.7.17-1~18.04), libpython2.7:amd64 (2.7.15-4ubuntu4~18.04.2, 2.7.17-1~18.04), python2.7:amd64 (2.7.15-4ubuntu4~18.04.2, 2.7.17-1~18.04), libpython2.7-minimal:amd64 (2.7.15-4ubuntu4~18.04.2, 2.7.17-1~18.04), libpython2.7-stdlib:amd64 (2.7.15-4ubuntu4~18.04.2, 2.7.17-1~18.04)
End-Date: 2020-02-18 05:15:56
Start-Date: 2020-02-18 05:16:11
Commandline: apt-get install -y -o DPkg::Options::=--force-confold salt-minion
该bootstrap-salt.sh脚本还将所有内容记录到/tmp/bootstrap-salt.log:
pciutils is already the newest version (1:3.5.2-1).
procps is already the newest version (2:3.3.12-3+deb9u1).
...
Selecting previously unselected package python-yaml.
Preparing to unpack .../python-yaml_3.12-1_amd64.deb ...
Unpacking python-yaml (3.12-1) ...
Setting up libyaml-0-2:amd64 (0.1.7-2) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
Setting up python-yaml (3.12-1) ...
Reading package lists...
Building dependency tree...
Reading state information...
ca-certificates is already the newest version (20161130+nmu1+deb9u1).
ca-certificates set to manually installed.
wget is already the newest version (1.18-5+deb9u3).
The following NEW packages will be installed:
apt-transport-https gnupg2
...
The following additional packages will be installed:
dctrl-tools debconf-utils dirmngr javascript-common libjs-jquery
libjs-sphinxdoc libjs-underscore libpgm-5.2-0 libsodium18 libzmq5 python-apt
python-backports-abc python-cffi-backend python-chardet
python-concurrent.futures python-croniter python-cryptography
python-dateutil python-enum34 python-idna python-ipaddress python-jinja2
python-markupsafe python-msgpack python-openssl python-pkg-resources
python-psutil python-pyasn1 python-requests python-setuptools
python-singledispatch python-six python-systemd python-tornado python-tz
python-urllib3 python-zmq salt-common
Suggested packages:
debtags dbus-user-session pinentry-gnome3 tor apache2 | lighttpd | httpd
python-apt-dbg python-apt-doc python-cryptography-doc
python-cryptography-vectors python-enum34-doc python-jinja2-doc
python-openssl-doc python-openssl-dbg python-psutil-doc doc-base
python-socks python-setuptools-doc python-mysqldb python-pycurl
python-tornado-doc python-twisted python-ntlm python-augeas
Recommended packages:
sfdisk e2fprogs
The following NEW packages will be installed:
dctrl-tools debconf-utils dirmngr javascript-common libjs-jquery
libjs-sphinxdoc libjs-underscore libpgm-5.2-0 libsodium18 libzmq5 python-apt
python-backports-abc python-cffi-backend python-chardet
python-concurrent.futures python-croniter python-cryptography
python-dateutil python-enum34 python-idna python-ipaddress python-jinja2
python-markupsafe python-msgpack python-openssl python-pkg-resources
python-psutil python-pyasn1 python-requests python-setuptools
python-singledispatch python-six python-systemd python-tornado python-tz
python-urllib3 python-zmq salt-common salt-minion
因此,对于 Debian/Ubuntu,您可能希望显式删除salt-minion、python-requests、python-yaml和python-apt,然后自动删除依赖项。
CentOS/亚马逊
% yum list installed | grep saltstack
PyYAML.x86_64 3.11-1.el7 @saltstack
python-zmq.x86_64 15.3.0-3.el7 @saltstack
salt.noarch 2018.3.5-1.el7 @saltstack
salt-minion.noarch 2018.3.5-1.el7 @saltstack
zeromq.x86_64 4.1.4-7.el7 @saltstack
/var/log/yum.log信息量不是很大:
Feb 18 08:15:37 Updated: rpm-libs-4.11.3-40.el7.x86_64
Feb 18 08:15:37 Updated: rpm-4.11.3-40.el7.x86_64
Feb 18 08:15:38 Updated: rpm-build-libs-4.11.3-40.el7.x86_64
Feb 18 08:15:38 Updated: rpm-python-4.11.3-40.el7.x86_64
Feb 18 08:15:38 Installed: python-chardet-2.2.1-3.el7.noarch
Feb 18 08:15:38 Installed: python-kitchen-1.1.1-5.el7.noarch
Feb 18 08:15:38 Installed: libyaml-0.1.4-11.el7_0.x86_64
Feb 18 08:15:38 Updated: libxml2-2.9.1-6.el7_2.3.x86_64
Feb 18 08:15:38 Installed: libxml2-python-2.9.1-6.el7_2.3.x86_64
Feb 18 08:15:38 Updated: python-urlgrabber-3.10-9.el7.noarch
Feb 18 08:15:39 Updated: yum-3.4.3-163.el7.centos.noarch
Feb 18 08:15:39 Installed: yum-utils-1.1.31-52.el7.noarch
Feb 18 08:15:39 Installed: PyYAML-3.11-1.el7.x86_64
Feb 18 08:15:39 Updated: chkconfig-1.7.4-1.el7.x86_64
Feb 18 08:16:15 Installed: lz4-1.7.5-3.el7.x86_64
Feb 18 08:16:15 Updated: systemd-libs-219-67.el7_7.3.x86_64
Feb 18 08:16:15 Installed: python-ipaddress-1.0.16-2.el7.noarch
Feb 18 08:16:15 Installed: python-markupsafe-0.11-10.el7.x86_64
Feb 18 08:16:15 Installed: python-six-1.9.0-2.el7.noarch
Feb 18 08:16:15 Installed: libtommath-0.42.0-6.el7.x86_64
Feb 18 08:16:15 Installed: libtomcrypt-1.17-26.el7.x86_64
Feb 18 08:16:16 Installed: python2-crypto-2.6.1-16.el7.x86_64
Feb 18 08:16:16 Installed: python-backports-1.0-8.el7.x86_64
Feb 18 08:16:16 Installed: python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch
Feb 18 08:16:16 Installed: python-tornado-4.2.1-5.el7.x86_64
Feb 18 08:16:16 Installed: python-urllib3-1.10.2-7.el7.noarch
Feb 18 08:16:16 Installed: python-requests-2.6.0-8.el7_7.noarch
Feb 18 08:16:17 Installed: python-babel-0.9.6-8.el7.noarch
Feb 18 08:16:18 Installed: python-jinja2-2.7.2-4.el7.noarch
Feb 18 08:16:18 Installed: libsodium-1.0.18-1.el7.x86_64
Feb 18 08:16:18 Installed: python2-msgpack-0.5.6-5.el7.x86_64
Feb 18 08:16:18 Updated: cryptsetup-libs-2.0.3-5.el7.x86_64
Feb 18 08:16:20 Updated: systemd-219-67.el7_7.3.x86_64
Feb 18 08:16:20 Installed: systemd-python-219-67.el7_7.3.x86_64
Feb 18 08:16:20 Installed: openpgm-5.2.122-2.el7.x86_64
Feb 18 08:16:20 Installed: zeromq-4.1.4-7.el7.x86_64
Feb 18 08:16:21 Installed: python-zmq-15.3.0-3.el7.x86_64
Feb 18 08:16:21 Installed: python2-futures-3.1.1-5.el7.noarch
Feb 18 08:16:21 Updated: pciutils-libs-3.5.1-3.el7.x86_64
Feb 18 08:16:21 Installed: pciutils-3.5.1-3.el7.x86_64
Feb 18 08:16:21 Installed: python2-psutil-2.2.1-5.el7.x86_64
Feb 18 08:16:26 Installed: salt-2018.3.5-1.el7.noarch
Feb 18 08:16:26 Installed: salt-minion-2018.3.5-1.el7.noarch
Feb 18 08:16:26 Updated: systemd-sysv-219-67.el7_7.3.x86_64
Feb 18 08:16:26 Updated: libgudev1-219-67.el7_7.3.x86_64
但是,/tmp/bootstrap-salt.log准确显示了哪些包被请求,哪些只是依赖项:
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
PyYAML x86_64 3.11-1.el7 saltstack 160 k
yum-utils noarch 1.1.31-52.el7 base 121 k
Updating:
chkconfig x86_64 1.7.4-1.el7 base 181 k
Installing for dependencies:
libxml2-python x86_64 2.9.1-6.el7_2.3 base 247 k
libyaml x86_64 0.1.4-11.el7_0 base 55 k
python-chardet noarch 2.2.1-3.el7 base 227 k
python-kitchen noarch 1.1.1-5.el7 base 267 k
Updating for dependencies:
libxml2 x86_64 2.9.1-6.el7_2.3 base 668 k
python-urlgrabber noarch 3.10-9.el7 base 108 k
rpm x86_64 4.11.3-40.el7 base 1.2 M
rpm-build-libs x86_64 4.11.3-40.el7 base 107 k
rpm-libs x86_64 4.11.3-40.el7 base 278 k
rpm-python x86_64 4.11.3-40.el7 base 83 k
yum noarch 3.4.3-163.el7.centos base 1.2 M
Transaction Summary
================================================================================
Install 2 Packages (+4 Dependent packages)
Upgrade 1 Package (+7 Dependent packages)
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
salt-minion noarch 2018.3.5-1.el7 saltstack 37 k
以下是 Amazon Linux 的类似日志:
Installing:
m2crypto x86_64 0.31.0-4.el7 saltstack-repo 287 k
python-crypto x86_64 2.6.1-2.el7 saltstack-repo 470 k
python-msgpack x86_64 0.4.6-1.el7 saltstack-repo 73 k
python-zmq x86_64 15.3.0-3.el7 saltstack-repo 520 k
Updating for dependencies:
PyYAML x86_64 3.11-1.el7 saltstack-repo 160 k
procps-ng x86_64 3.3.10-26.amzn2 amzn2-core 292 k
python-requests noarch 2.6.0-7.amzn2 amzn2-core 95 k
Installing for dependencies:
libsodium x86_64 1.0.16-1.el7 saltstack-repo 140 k
openpgm x86_64 5.2.122-2.el7 saltstack-repo 172 k
python2-typing noarch 3.5.2.2-4.el7 saltstack-repo 39 k
zeromq x86_64 4.1.4-7.el7 saltstack-repo 555 k
因此,对于 CentOS/Amazon,您可能需要显式删除salt-minion、PyYAML、m2crypto、python-zmq、python-crypto和python-msgpack,然后自动删除依赖项。
列出依赖项pip
如果您通过 安装了一些 Salt 依赖项pip,也值得检查它们:
% sudo salt -C "G@kernel:Linux" cmd.run 'pip freeze --local'
% sudo salt -t 30 -C "G@os:Windows" cmd.run 'pip.exe freeze --local' cwd='C:\salt\bin\scripts\'
在 CentOS、Amazon 和 Windows 上,该命令会显示 Python 包的完整列表,因此您需要将其与默认包进行比较以找出不同之处。
升级盐大师
从常见问题解答:
问:我可以在我的 Master 和 Minion 上运行不同版本的 Salt 吗?
答:这取决于版本。一般来说,建议 Master 和 Minion 版本匹配。升级 Salt 时,应始终先升级 master。不保证运行比其 master 更新版本的 Salt 的 minions 的向后兼容性。
升级 Salt Master 有两种常用方法:
选项1
就地升级过程:
- 备份/etc/salt/pki目录(以防万一)
- 删除旧的 Salt 存储库
- 卸载旧的 salt-master 包及其所有依赖项
- 添加新的仓库(py3)
- 安装新的 salt-master
选项 2
如果在升级过程中不能一次断开所有的minions,可以多开一个master server,逐个迁移minions:
- 设置新的 salt-master (py3)
- 将旧master的目录复制/etc/salt/pki到新的master上,保证master和minion的key是一样的
- 迁移奴才:
# migrate_minion.sls
migrate_to_new_master:
file.replace:
- name: "{{ salt['config.get']('conf_file') }}"
# Alternative variant if you keep master address in a separate config file
# - name: "{{ salt['file.join'](salt['config.get']('config_dir'), 'minion.d', 'master.conf') }}"
- pattern: '^master:\s+{{ salt["config.get"]("master") | regex_escape }}#39;
- repl: 'master: new-master.example.com'
# Restart salt minion after the the config option is set
# A naive module.run with service.restart stopped working in 2019.2.1
# (https://github.com/saltstack/salt/issues/55201), so we have to use salt-call
# https://docs.saltstack.com/en/latest/faq.html#restart-using-states
restart_salt_minion:
cmd.run:
- name: 'salt-call service.restart salt-minion'
- bg: true
- onchanges:
- file: migrate_to_new_master
为了安全起见,您可以批量迁移 minions:
% sudo salt -G 'master:old-master.example.com' --batch-size 10% state.apply migrate_minion
在 Windows 上升级 Salt
用winrepo
如果您使用,在 Windows 领域中事情会非常简单winrepo-ng:
1. 更新你的 winrepo 定义
如果你不想带整个winrepo-ng,只需将以下两个文件放入salt://win/repo-ng:
- salt-minion-py2.sls
- salt-minion-py3.sls
2.重建包数据库
% sudo salt -t 30 -C "G@os:Windows and G@pythonversion:0:2" pkg.refresh_db
3.列出当前安装的版本
% sudo salt -t 30 -C "G@os:Windows and G@pythonversion:0:2" pkg.version salt-minion
3.确保目标版本可用
% sudo salt -t 30 -C "G@os:Windows and G@pythonversion:0:2" pkg.list_available salt-minion-py3
4.运行升级命令
% sudo salt -t 30 -C "G@os:Windows and G@pythonversion:0:2" pkg.install salt-minion-py3 version=2019.2.3
您可能想要--batch-size X为分阶段推出添加参数。
没有winrepo
根本不想使用 winrepo?以下是升级 Windows minions 的另一种方法。
1.获取安装程序
% sudo salt -t 30 -C "G@os:Windows and G@pythonversion:0:2 and G@cpuarch:AMD64" \
cp.get_url http://repo.saltstack.com/windows/Salt-Minion-2019.2.3-Py3-AMD64-Setup.exe
win10:
c:\salt\var\cache\salt\minion\extrn_files\base\repo.saltstack.com\windows\Salt-Minion-2019.2.3-Py3-AMD64-Setup.exe
您还可以包含校验和以防止重新下载(适用于 Salt 2018.3.0 或更高版本):
% sudo salt -t 30 -C "G@os:Windows and G@pythonversion:0:2 and G@cpuarch:AMD64" \
cp.get_url http://repo.saltstack.com/windows/Salt-Minion-2019.2.3-Py3-AMD64-Setup.exe \
source_hash=$(curl -s http://repo.saltstack.com/windows/Salt-Minion-2019.2.3-Py3-AMD64-Setup.exe.sha256 |\
iconv -f utf-16 -t utf-8 | awk '{print $1;}' | tr A-Z a-z)
win10:
c:\salt\var\cache\salt\minion\extrn_files\base\repo.saltstack.com\windows\Salt-Minion-2019.2.3-Py3-AMD64-Setup.exe
默认下载位置很好,因为自 2017.7.2 以来Salt 安装程序不会删除缓存目录。
2.运行升级命令
% sudo salt -t 30 -C "G@os:Windows and G@pythonversion:0:2 and G@cpuarch:AMD64" cmd.run \
'START /B c:\salt\var\cache\salt\minion\extrn_files\base\repo.saltstack.com\windows\Salt-Minion-2019.2.3-Py3-AMD64-Setup.exe /S'
在 Ubuntu 和 Debian 上升级 Salt
有几个关键部分:
1.删??除旧的repo和key
remove_salt_repo:
pkgrepo.absent:
- name: deb https://repo.saltstack.com/apt/ubuntu/18.04/amd64/archive/2018.3.5 bionic main
# - name: deb https://repo.saltstack.com/apt/debian/9/amd64/archive/2018.3.5 stretch main
- keyid: 0E08A149DE57BFBE
也可以删除 Ubuntu 和 Debian 上所有现有的 Salt 存储库和密钥:
{% for repo_key, repo_data in salt['pkg.list_repos']().items() -%}
{% for repo in repo_data -%}
{% if not repo.get('disabled') and 'saltstack' in repo.get('line', '') -%}
Remove repo {{ repo['line'] }}:
pkgrepo.absent:
- name: {{ repo['line'] }}
{% endif %}
{% endfor %}
{%- endfor %}
{% for key_id, key_data in salt['pkg.get_repo_keys']().items() -%}
{% if 'saltstack' in key_data.get('uid', '') -%}
Remove key {{ key_data['keyid'] }}:
module.run:
{%- if 'module.run' in salt['config.get']('use_superseded', []) %}
- pkg.del_repo_key:
- keyid: {{ key_data['keyid'] }}
{%- else %}
- name: pkg.del_repo_key
- kwargs:
keyid: {{ key_data['keyid'] }}
{% endif %}
{% endif %}
{%- endfor %}
2.停止salt-minion服务
systemctl stop salt-minion.service
3. 取出包裹
下面的代码片段应该适应您的特定环境(即,删除所有依赖项,但不要触及任何对生产工作负载至关重要的包):
apt-get -y remove --auto-remove salt-minion
apt-get -y remove --auto-remove python-requests python-yaml python-apt
4.安装小兵
虽然可以只apt-get install使用必要的软件包:
apt-get -y -o DPkg::Options::=--force-confold install python3-requests python3-yaml python3-apt
apt-get -y -o DPkg::Options::=--force-confold install salt-minion
我觉得使用salt-bootstrap.sh更简单,支持更多平台:
rm -rf /var/cache/salt/minion
curl -Ls https://bootstrap.saltstack.com | sh -s -- -x python3 stable 2019.2.3
删除缓存目录是可选的,但前段时间在 Windows 上推荐过(自2017.7.2起不再如此)。此外,此注释暗示了缓存序列化格式之间可能存在的不兼容性。最后,如果您使用特定于版本的自定义模块,这可能很重要。
5. 结果状态
# upgrade/ubuntu_debian.sls
{% for repo_key, repo_data in salt['pkg.list_repos']().items() -%}
{% for repo in repo_data -%}
{% if not repo.get('disabled') and 'saltstack' in repo.get('line', '') -%}
Remove repo {{ repo['line'] }}:
pkgrepo.absent:
- name: {{ repo['line'] }}
# - keyid: 0E08A149DE57BFBE
{% endif %}
{% endfor %}
{%- endfor %}
{% for key_id, key_data in salt['pkg.get_repo_keys']().items() -%}
{% if 'saltstack' in key_data.get('uid', '') -%}
Remove key {{ key_data['keyid'] }}:
module.run:
{%- if 'module.run' in salt['config.get']('use_superseded', []) %}
- pkg.del_repo_key:
- keyid: {{ key_data['keyid'] }}
{%- else %}
- name: pkg.del_repo_key
- kwargs:
keyid: {{ key_data['keyid'] }}
{% endif %}
{% endif %}
{%- endfor %}
install_at:
pkg.installed:
- name: at
upgrade_salt_minion:
cmd.run:
- name: |
echo "systemctl stop salt-minion.service
apt-get -y remove --auto-remove salt-minion
apt-get -y remove --auto-remove python-requests python-yaml python-apt
rm -rf /var/cache/salt/minion
curl -Ls https://bootstrap.saltstack.com | sh -s -- -x python3 stable 2019.2.3" | at now
这个at技巧曾经在官方文档中被推荐过。如果您喜欢考古,请参阅以下问题:#5721、#7997、#22993、#32593、#39952、#43340、#46709。
你也可以试试这个systemd-run --scope方法。
6.运行升级命令
% sudo salt -C "( G@os:Ubuntu or G@os:Debian ) and G@pythonversion:0:2" state.apply upgrade.ubuntu_debian
您可能想要--batch-size X为分阶段推出添加参数。
在 CentOS 和 Amazon Linux 上升级 Salt
有几个关键部分:
1. 删除旧仓库
remove_salt_repo:
pkgrepo.absent:
- name: saltstack
也可以删除任何基于 rpm 的发行版上的所有现有 Salt 存储库:
{% for key, repo in salt['pkg.list_repos']().items() -%}
{% if repo.get('enabled', '1') == '1' and 'saltstack' in key -%}
Remove repo {{ key }}:
pkgrepo.absent:
- name: {{ key }}
{% endif -%}
{% endfor %}
2.停止salt-minion服务
systemctl stop salt-minion.service
3. 取出包裹
下面的代码片段应该适应您的特定环境(即,删除所有依赖项,但不要触及任何对生产工作负载至关重要的包):
yum -y remove salt-minion
yum -y remove PyYAML m2crypto python-zmq zeromq python-crypto python-msgpack
yum -y autoremove
4.安装minion而不启动它
rm -rf /var/cache/salt/minion
curl -Ls https://bootstrap.saltstack.com | sh -s -- -X -x python3 stable 2019.2.3
删除缓存目录是可选的,但前段时间在 Windows 上推荐过(自2017.7.2起不再如此)。此外,此注释暗示了缓存序列化格式之间可能存在的不兼容性。最后,如果您使用特定于版本的自定义模块,这可能很重要。
5.重用旧配置
下面的代码段应该适应您的特定环境:
[-f /etc/salt/minion.rpmsave] && \
( cp -f /etc/salt/minion /etc/salt/minion.bak; \
mv -f /etc/salt/minion.rpmsave /etc/salt/minion )
6.启动salt-minion服务
systemctl is-enabled salt-minion.service || \
(systemctl preset salt-minion.service && \
systemctl enable salt-minion.service)
systemctl start salt-minion.service
7. 结果状态
# upgrade/centos_amazon.sls
{% for key, repo in salt['pkg.list_repos']().items() -%}
{% if repo.get('enabled', '1') == '1' and 'saltstack' in key -%}
Remove repo {{ key }}:
pkgrepo.absent:
- name: {{ key }}
{% endif -%}
{% endfor %}
install_at:
pkg.installed:
- name: at
atd_service:
service.running:
- name: atd
# - enable: True
upgrade_salt_minion:
cmd.run:
- name: |
echo "systemctl stop salt-minion.service
yum -y remove salt-minion
yum -y remove PyYAML m2crypto python-zmq zeromq python-crypto python-msgpack
yum -y autoremove
rm -rf /var/cache/salt/minion
curl -Ls https://bootstrap.saltstack.com | sh -s -- -X -x python3 stable 2019.2.3
[-f /etc/salt/minion.rpmsave] && \
( cp -f /etc/salt/minion /etc/salt/minion.bak; \
mv -f /etc/salt/minion.rpmsave /etc/salt/minion )
systemctl is-enabled salt-minion.service || \
(systemctl preset salt-minion.service && \
systemctl enable salt-minion.service)
systemctl start salt-minion.service" | at now
这个at技巧曾经在官方文档中被推荐过。如果您喜欢考古,请参阅以下问题:#5721、#7997、#22993、#32593、#39952、#43340、#46709。
你也可以试试这个systemd-run --scope方法。
8.运行升级命令
% sudo salt -C "( G@os:CentOS or G@os:Amazon ) and G@pythonversion:0:2" state.apply upgrade.centos_amazon
您可能想要--batch-size X为分阶段推出添加参数。
在其他操作系统上升级 Salt
如果您曾在任何其他操作系统(Red Hat、Fedora、SUSE、Gentoo、Arch、Raspbian、macOS、Solaris、FreeBSD、OpenBSD 等)上完成此操作,请随时分享您的经验和可能遇到的问题。我很乐意用任何特定的食谱更新这篇文章!
监控升级过??程
升级过程可能需要一些时间。有三种方法可以在 Minions 重新连接时对其进行监控:
看主日志
% sudo tail -f /var/log/salt/master
观看主事件总线
% sudo salt-run state.event tagmatch='salt/minion/*/start' pretty=true
列出 Py2/Py3 的 minion 计数
% sudo salt "*" grains.get pythonversion --out json --static | jq '.[] | "\(.[0]).\(.[1]).\(.[2])"' | sort | uniq -c
1 "2.7.13"
1 "2.7.17"
1 "2.7.5"
1 "3.5.3"
1 "3.6.8"
1 "3.6.9"
% sudo salt "*" grains.get pythonversion --out json --static | jq '.[] | "\(.[0])"' | sort | uniq -c
3 "2"
3 "3"
升级自动化
如果您需要对升级过程进行更多控制(处理重试和升级失败,定义特定的编排顺序等),您可以使用 Salt 编排或最好编写自定义运行器。另一种变体是使用salt-apiand pepper。
使用fabricor进行带外升级salt-ssh也是一种选择。
相关推荐
- python入门到脱坑经典案例—清空列表
-
在Python中,清空列表是一个基础但重要的操作。clear()方法是最直接的方式,但还有其他方法也可以实现相同效果。以下是详细说明:1.使用clear()方法(Python3.3+推荐)...
- python中元组,列表,字典,集合删除项目方式的归纳
-
九三,君子终日乾乾,夕惕若,厉无咎。在使用python过程中会经常遇到这四种集合数据类型,今天就对这四种集合数据类型中删除项目的操作做个总结性的归纳。列表(List)是一种有序和可更改的集合。允许重复...
- Linux 下海量文件删除方法效率对比,最慢的竟然是 rm
-
Linux下海量文件删除方法效率对比,本次参赛选手一共6位,分别是:rm、find、findwithdelete、rsync、Python、Perl.首先建立50万个文件$testfor...
- 数据结构与算法——链式存储(链表)的插入及删除,
-
持续分享嵌入式技术,操作系统,算法,c语言/python等,欢迎小友关注支持上篇文章我们讲述了链表的基本概念及一些查找遍历的方法,本篇我们主要将一下链表的插入删除操作,以及采用堆栈方式如何创建链表。链...
- Python自动化:openpyxl写入数据,插入删除行列等基础操作
-
importopenpyxlwb=openpyxl.load_workbook("example1.xlsx")sh=wb['Sheet1']写入数据#...
- 在Linux下软件的安装与卸载(linux里的程序的安装与卸载命令)
-
通过apt安装/协助软件apt是AdvancedPackagingTool,是Linux下的一款安装包管理工具可以在终端中方便的安装/卸载/更新软件包命令使用格式:安装软件:sudoapt...
- Python 批量卸载关联包 pip-autoremove
-
pip工具在安装扩展包的时候会自动安装依赖的关联包,但是卸载时只删除单个包,无法卸载关联的包。pip-autoremove就是为了解决卸载关联包的问题。安装方法通过下面的命令安装:pipinsta...
- 用Python在Word文档中插入和删除文本框
-
在当今自动化办公需求日益增长的背景下,通过编程手段动态管理Word文档中的文本框元素已成为提升工作效率的关键技术路径。文本框作为文档排版中灵活的内容容器,既能承载多模态信息(如文字、图像),又可实现独...
- Python 从列表中删除值的多种实用方法详解
-
#Python从列表中删除值的多种实用方法详解在Python编程中,列表(List)是一种常用的数据结构,具有动态可变的特性。当我们需要从列表中删除元素时,根据不同的场景(如按值删除、按索引删除、...
- Python 中的前缀删除操作全指南(python删除前导0)
-
1.字符串前缀删除1.1使用内置方法Python提供了几种内置方法来处理字符串前缀的删除:#1.使用removeprefix()方法(Python3.9+)text="...
- 每天学点Python知识:如何删除空白
-
在Python中,删除空白可以分为几种不同的情况,常见的是针对字符串或列表中空白字符的处理。一、删除字符串中的空白1.删除字符串两端的空白(空格、\t、\n等)使用.strip()方法:s...
- Linux系统自带Python2&yum的卸载及重装
-
写在前面事情的起因是我昨天在测试Linux安装Python3的shell脚本时,需要卸载Python3重新安装一遍。但是通过如下命令卸载python3时,少写了个3,不小心将系统自带的python2也...
- 如何使用Python将多个excel文件数据快速汇总?
-
在数据分析和处理的过程中,Excel文件是我们经常会遇到的数据格式之一。本文将通过一个具体的示例,展示如何使用Python和Pandas库来读取、合并和处理多个Excel文件的数据,并最终生成一个包含...
- 【第三弹】用Python实现Excel的vlookup功能
-
今天继续用pandas实现Excel的vlookup功能,假设我们的2个表长成这样:我们希望把Sheet2的部门匹在Sheet1的最后一列。话不多说,先上代码:importpandasaspd...
- python中pandas读取excel单列及连续多列数据
-
案例:想获取test.xls中C列、H列以后(当H列后列数未知时)的所有数据。importpandasaspdfile_name=r'D:\test.xls'#表格绝对...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python自定义函数 (53)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python人脸识别 (54)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)