龙空技术网

将 Salt 升级到 Python 3

Python大本营 52

前言:

此刻大家对“centosaltas”都比较看重,小伙伴们都需要学习一些“centosaltas”的相关知识。那么小编也在网络上收集了一些对于“centosaltas””的相关内容,希望我们能喜欢,姐妹们快快来学习一下吧!

更多分享微信公众号:【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.versionsMaster:    2019.2.3Minion requires update:    ----------    minion1:        2018.3.5    minion2:        2018.3.5    minion3:        2018.3.5    win10:        2018.3.5sudo 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  bionic main""deb  bionic main"% sudo salt -G "os:Debian" pkg.list_repos --static --out json | jq '.[] | with_entries(select(.key|contains("saltstack"))) | .[][].line'"deb  stretch main""deb  stretch main"% sudo salt -G "os:CentOS" pkg.list_repos --static --out json | jq '.[] | with_entries(select(.key|contains("saltstack"))) | .[].baseurl'";";
针对 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
其他有用的目标谷物cpuarchlsb_distrib_codenamelsb_distrib_idlsb_distrib_releaseososarchoscodenameosfingerosmajorreleaseosreleaseosversionpythonexecutablepythonversionsaltpathsaltversion调查

任何模块调用(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  bionic/mainsalt-minion  bionic/mainpython-jinja2  stretch/mainsalt-common  stretch/mainsalt-minion  stretch/main

此外,您可以首先检查 Salt Minion 的安装方式。您需要确定显式安装了哪些软件包(可以自动删除其余的依赖项)。查看/var/log/apt/history.log:

德比安:

Start-Date: 2020-02-18 05:15:02Commandline: apt-get install -y -o DPkg::Options::=--force-confold procps pciutils python-yamlRequested-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:02Start-Date: 2020-02-18 05:15:05Commandline: apt-get install -y -o DPkg::Options::=--force-confold wget gnupg2 apt-transport-https ca-certificatesRequested-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:06Start-Date: 2020-02-18 05:15:35Commandline: apt-get install -y -o DPkg::Options::=--force-confold salt-minionRequested-By: vagrant (1000)

Ubuntu:

Start-Date: 2020-02-18 05:15:08Commandline: apt-get install -y -o DPkg::Options::=--force-confold wget gnupg apt-transport-https ca-certificatesRequested-By: vagrant (1000)Install: apt-transport-https:amd64 (1.6.12)End-Date: 2020-02-18 05:15:08Start-Date: 2020-02-18 05:15:49Commandline: apt-get install -y -o DPkg::Options::=--force-confold python2.7 python-apt python-requests python-yaml procps pciutilsRequested-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:56Start-Date: 2020-02-18 05:16:11Commandline: 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-commonSuggested 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-augeasRecommended packages:  sfdisk e2fprogsThe 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 saltstackPyYAML.x86_64 3.11-1.el7 @saltstackpython-zmq.x86_64 15.3.0-3.el7 @saltstacksalt.noarch 2018.3.5-1.el7 @saltstacksalt-minion.noarch 2018.3.5-1.el7 @saltstackzeromq.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_64Feb 18 08:15:37 Updated: rpm-4.11.3-40.el7.x86_64Feb 18 08:15:38 Updated: rpm-build-libs-4.11.3-40.el7.x86_64Feb 18 08:15:38 Updated: rpm-python-4.11.3-40.el7.x86_64Feb 18 08:15:38 Installed: python-chardet-2.2.1-3.el7.noarchFeb 18 08:15:38 Installed: python-kitchen-1.1.1-5.el7.noarchFeb 18 08:15:38 Installed: libyaml-0.1.4-11.el7_0.x86_64Feb 18 08:15:38 Updated: libxml2-2.9.1-6.el7_2.3.x86_64Feb 18 08:15:38 Installed: libxml2-python-2.9.1-6.el7_2.3.x86_64Feb 18 08:15:38 Updated: python-urlgrabber-3.10-9.el7.noarchFeb 18 08:15:39 Updated: yum-3.4.3-163.el7.centos.noarchFeb 18 08:15:39 Installed: yum-utils-1.1.31-52.el7.noarchFeb 18 08:15:39 Installed: PyYAML-3.11-1.el7.x86_64Feb 18 08:15:39 Updated: chkconfig-1.7.4-1.el7.x86_64Feb 18 08:16:15 Installed: lz4-1.7.5-3.el7.x86_64Feb 18 08:16:15 Updated: systemd-libs-219-67.el7_7.3.x86_64Feb 18 08:16:15 Installed: python-ipaddress-1.0.16-2.el7.noarchFeb 18 08:16:15 Installed: python-markupsafe-0.11-10.el7.x86_64Feb 18 08:16:15 Installed: python-six-1.9.0-2.el7.noarchFeb 18 08:16:15 Installed: libtommath-0.42.0-6.el7.x86_64Feb 18 08:16:15 Installed: libtomcrypt-1.17-26.el7.x86_64Feb 18 08:16:16 Installed: python2-crypto-2.6.1-16.el7.x86_64Feb 18 08:16:16 Installed: python-backports-1.0-8.el7.x86_64Feb 18 08:16:16 Installed: python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarchFeb 18 08:16:16 Installed: python-tornado-4.2.1-5.el7.x86_64Feb 18 08:16:16 Installed: python-urllib3-1.10.2-7.el7.noarchFeb 18 08:16:16 Installed: python-requests-2.6.0-8.el7_7.noarchFeb 18 08:16:17 Installed: python-babel-0.9.6-8.el7.noarchFeb 18 08:16:18 Installed: python-jinja2-2.7.2-4.el7.noarchFeb 18 08:16:18 Installed: libsodium-1.0.18-1.el7.x86_64Feb 18 08:16:18 Installed: python2-msgpack-0.5.6-5.el7.x86_64Feb 18 08:16:18 Updated: cryptsetup-libs-2.0.3-5.el7.x86_64Feb 18 08:16:20 Updated: systemd-219-67.el7_7.3.x86_64Feb 18 08:16:20 Installed: systemd-python-219-67.el7_7.3.x86_64Feb 18 08:16:20 Installed: openpgm-5.2.122-2.el7.x86_64Feb 18 08:16:20 Installed: zeromq-4.1.4-7.el7.x86_64Feb 18 08:16:21 Installed: python-zmq-15.3.0-3.el7.x86_64Feb 18 08:16:21 Installed: python2-futures-3.1.1-5.el7.noarchFeb 18 08:16:21 Updated: pciutils-libs-3.5.1-3.el7.x86_64Feb 18 08:16:21 Installed: pciutils-3.5.1-3.el7.x86_64Feb 18 08:16:21 Installed: python2-psutil-2.2.1-5.el7.x86_64Feb 18 08:16:26 Installed: salt-2018.3.5-1.el7.noarchFeb 18 08:16:26 Installed: salt-minion-2018.3.5-1.el7.noarchFeb 18 08:16:26 Updated: systemd-sysv-219-67.el7_7.3.x86_64Feb 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 kUpdating: chkconfig x86_64 1.7.4-1.el7 base 181 kInstalling 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 kUpdating 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 MTransaction 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 kUpdating 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 kInstalling 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.slsmigrate_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 }}$'    - 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# (), so we have to use salt-call# :  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.slssalt-minion-py3.sls2.重建包数据库

% 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 :    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  \  source_hash=$(curl -s  |\  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  bionic main# - name: deb  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-minionapt-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-aptapt-get -y -o DPkg::Options::=--force-confold install salt-minion

我觉得使用salt-bootstrap.sh更简单,支持更多平台:

rm -rf /var/cache/salt/minioncurl -Ls  | 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: atupgrade_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  | 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-minionyum -y remove PyYAML m2crypto python-zmq zeromq python-crypto python-msgpackyum -y autoremove
4.安装minion而不启动它
rm -rf /var/cache/salt/minioncurl -Ls  | 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: atatd_service:  service.running:    - name: atd    # - enable: Trueupgrade_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  | 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也是一种选择。

标签: #centosaltas #centos修复python #centos7saltstack #libsodiumcentos #centoslibsodium安装