在进行了很好的训练之后,我正在试着把手放在Ansible身上。目前,我的任务是创建一个设置PostgreSQL集群的剧本(使用Patroni和etcd)。
然而,虽然安装PostgreSQL应该是一个相当容易的任务,但是使用zypper插件进行安装会引发一个错误。首先,应该安装PostgreSQL的剧本部分:
- name: Installation PostgreSQL 14 Latest ohne Recommendations
become: true
zypper:
disable_recommends: true
name:
postgresql14-server
postgresql14-contrib
postgresql14-devel
update_cache: true
when: ansible_host in pgservers给出的错误消息如下:
fatal: [goeccdb22l]: FAILED! => {"changed": false, "cmd": ["/usr/bin/zypper", "--quiet", "--non-interactive", "--xmlout", "install", "--type", "package", "--auto-agree-with-licenses", "--no-recommends", "--", "+postgresql14-server postgresql14-contrib postgresql14-devel"], "msg": "No provider of '+postgresql14-server postgresql14-contrib postgresql14-devel' found.", "rc": 104, "stderr": "", "stderr_lines": [], "stdout": "<?xml version='1.0'?>\n<stream>\n<message type=\"error\">No provider of '+postgresql14-server postgresql14-contrib postgresql14-devel' found.</message>\n</stream>\n", "stdout_lines": ["<?xml version='1.0'?>", "<stream>", "<message type=\"error\">No provider of '+postgresql14-server postgresql14-contrib postgresql14-devel' found.</message>", "</stream>"]}让我们提取错误消息:
"msg": "No provider of '+postgresql14-server postgresql14-contrib postgresql14-devel' found."我试图在目标服务器上使用shell复制这个问题。但是,运行命令似乎能够安装包:
ansible@goeccdb22l:~> sudo /usr/bin/zypper install --type package --auto-agree-with-licenses --no-recommends -- +postgresql14-server postgresql14-contrib postgresql14-devel
Loading repository data...
Reading installed packages...
Resolving package dependencies...
The following 12 NEW packages are going to be installed:
libecpg6 libopenssl-1_1-devel libpq5 postgresql postgresql14 postgresql14-contrib postgresql14-devel postgresql14-server postgresql-contrib postgresql-devel postgresql-server zlib-devel
The following package needs additional customer contract to get support:
postgresql14
12 new packages to install.
Overall download size: 8.0 MiB. Already cached: 0 B. After the operation, additional 35.4 MiB will be used.
Continue? [y/n/v/...? shows all options] (y):我只从命令中删除了--quiet和--non-interactive选项,但保留了所有其他给定选项。
我的最佳想法是,用户/权限提升工作可能与我以Ansible用户身份登录到目标并在命令之前使用sudo不同。
编辑1:我已经想出了一个问题可能是什么。正如我前面提到的,在测试命令时,我删除了两个选项:--quiet和--non-interactive。使用这两个选项测试命令会给出如下消息:
The flag --quiet is not known.但是,使用man zypper,我可以清楚地看到,--quiet是一个有文档记录的选项:
-q, --quiet
Suppress normal output. Brief (esp. result notification) messages and error messages will still be printed, though. If used together with conflicting --verbose option, the --verbose option takes preference.现在,我的想法是,Ansible调用它在返回XML中文档的命令,但是由于不知何故不理解--quiet,它将其解释为没有提供所请求的包列表。因此,这将留下两个问题:
--quiet没有被理解,却被记录在案?这是SLES和OpenSuse?由于Ansible zypper模块没有禁止--quiet选项的选项,所以我看不到有任何可能使用参数来处理它。最后一种选择是将zypper任务拆分为更小的shell任务,如果可能的话,我想避免这种情况。
发布于 2022-08-15 07:33:02
因此,在一位知识渊博的系统管理员的帮助下,我能够诊断出问题。
上面记录的软件包清单实际上不是一个清单。由于我错过了包前面的破折号,Ansible接受了带有换行符和所有内容的包,并尝试安装它。
解决方案是通过在包前面加上破折号/减号,将包更改为包列表。
--quiet的问题是它是一个位置参数,我在测试它时使用了错误的位置。
https://stackoverflow.com/questions/73303961
复制相似问题