Ansible: TRANSFORM_INVALID_GROUP_CHARS 没有记录有效的组模式

创建于 2019-05-24  ·  104评论  ·  资料来源: ansible/ansible



概括

添加TRANSFORM_INVALID_GROUP_CHARS 。 除了阅读源代码之外,尚不清楚哪些字符必须避免继续使用,只是警告(带有-vvvv )指出您当前使用的哪些字符无效。

请澄清您正在将名称推送为有效的 python 变量。 cfg 选项的文档、警告和在线文档中缺少此内容

(https://github.com/ansible/ansible/commit/d241794daa6d413e6447890e2a4f11e0d818cf0e#diff-b77962b6b54a830ec373de0602918318R122)

https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_2.8.html上似乎也没有提到这一点。

问题类型
  • 文件报告
组件名称


团体

ANSIBLE 版本

ansible 2.8.0
  config file = /home/awoodward/ansible-skynet/ansible.cfg
  configured module search path = [u'/home/awoodward/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.5 (default, Apr  9 2019, 14:30:50) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
配置

不适用

操作系统/环境

不适用

附加信息

不适用

affects_2.8 docs has_pr module core system

最有用的评论

从组名中删除破折号的原因是什么? 我真的很难找到合适的理由,特别是因为这将需要大量的代码重构。

所有104条评论

描述中标识的文件:

如果这些文件不准确,请更新说明的component name部分或使用!component bot 命令。

单击此处获取机器人帮助

我开始收到此警告,但在移植指南中没有找到任何参考,也没有参考如何修复或修复什么。

我的大部分警告来自 ec2.py,其中 instance_id 使用了- (例如: i-033f62b586143dff7 )和区域(例如: eu-central-1c ),所以我们没有真正解决这个问题

最后,这打破了我的一些剧本,我使用了when: ansible_hostname in groups['varnish']ansible_hostnamevarnish-eu-central-1c-001
过去这很好用,现在我需要使用inventory_hostname来获得varnish_eu_central_1c_001并获得与groups['varnish']的匹配

所以这至少需要在移植指南中紧急警告inventory_hostnamegroups[]可能返回不同的数据

从组名中删除破折号的原因是什么? 我真的很难找到合适的理由,特别是因为这将需要大量的代码重构。

@ssbarnea一方面,我们正在推动只允许变量名和其他类似的键,它们是有效的 python 标识符。 为了进一步解释组名,它会给尝试使用诸如groups.foo-group类的“点语法”的用户带来问题,这与用户期望的不一样。 由此类小问题引起的问题和支持请求的数量使我们走上了保护名称的道路,以确保不会发生此类问题。

对于那些想要保留我们认为无效字符的人,可以选择退出此功能。

我们必须做什么才能选择退出此功能? 我们本地的 Ansible 部署脚本中到处都是包含连字符的组名。 当然,我们不将它们与点符号一起使用。 但改变所有这些将是一项真正艰巨的任务。 我更愿意选择退出,同时鼓励我的团队在未来避免使用连字符,并在可能的情况下将连字符转换为下划线,虽然最后一部分并不总是像看起来那么简单。

那么,是否简单地在 ansible.cfg 中设置force_valid_group_names = false ? 这似乎是基于https://github.com/ansible/ansible/commit/d241794daa6d413e6447890e2a4f11e0d818cf0e#diff -fd24ad93fbc32f454761746c1ac908f2

我们必须做什么才能选择退出此功能? 我们本地的 Ansible 部署脚本中到处都是包含连字符的组名。 当然,我们不将它们与点符号一起使用。 但改变所有这些将是一项真正艰巨的任务。 我更愿意选择退出,同时鼓励我的团队在未来避免使用连字符,并在可能的情况下将连字符转换为下划线,虽然最后一部分并不总是像看起来那么简单。

那么,是否简单地在 ansible.cfg 中设置force_valid_group_names = false ? 这似乎是基于d241794#diff-fd24ad93fbc32f454761746c1ac908f2

export ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=neverexport ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=ignore -- 后者不在文档中: https :

谢谢,詹姆斯。 由于人们来到此问题以跟进警告消息,因此我提供了我认为可能有用的信息:

要更便携/永久地禁用 ≥2.10 组名称自动转换,直到您准备好从库存中清除无效组为止,请将force_valid_group_names = never[defaults] INI 部分ansible.cfg

要查看触发警告的所有组和无效字符(也许以便您可以将它们作为逐步淘汰的目标),您可以执行以下 ansible CLI no-op 操作:

ansible-inventory -vvvv --host=localhost 2>&1 | grep replacing

这些无效字符(截至 2019 年INVALID_VARIABLE_NAMES日)被定义为常量
https://github.com/ansible/ansible/blob/devel/lib/ansible/constants.py#L119
作为'^[\d\W]|[^\w]'
即: any leading non-alpha character OR any character other than alpha-numeric and underscore
(我希望我做对了)

如果您发现弃用警告很烦人,您还可以通过将deprecation_warnings = False到相同的[defaults]来永久禁用任何ansible-命令或ansible ad-hoc 命令的警告[defaults] ansible.cfg ,但我建议不要这样做(因为您可能会错过重要新闻),而是使用内联 shell 环境变量,如下所示:
ANSIBLE_DEPRECATION_WARNINGS=False ansible-inventory --host=localhost

但是,库存解析[WARNING]不会消失。 没有特定的配置或环境变量来关闭所有警告(还没有?),但如果它真的让你感到困扰,你可以将所有标准错误发送到/dev/null (在此处插入“最佳实践”警告):

2>/dev/null ansible-inventory --host=localhost

希望这可以帮助某人,某处。

我只在不提供迁移路径时才发现弃用警告消息很烦人。 考虑到空间有限并且修复可能需要更新,我会发现提供指向票证的链接非常有用,这些票证可以记录解决方案、变通方法、...

这样的方法可以节省改进不完整警告消息所需的额外工作,因为我们不必更新消息,将其向后移植到几个版本。

附注。 禁用弃用警告是我不会向任何人推荐的事情,也许只有在项目已经面临其最终命运的情况下;)

我开始收到此警告,但在移植指南中没有找到任何参考,也没有参考如何修复或修复什么。

我的大部分警告来自 ec2.py,其中 instance_id 使用了- (例如: i-033f62b586143dff7 )和区域(例如: eu-central-1c ),所以我们没有真正解决这个问题

最后,这打破了我的一些剧本,我使用了when: ansible_hostname in groups['varnish']ansible_hostnamevarnish-eu-central-1c-001
过去这很好用,现在我需要使用inventory_hostname来获得varnish_eu_central_1c_001并获得与groups['varnish']的匹配

所以这至少需要在移植指南中紧急警告inventory_hostnamegroups[]可能返回不同的数据

我想回应有关EC2 动态清单脚本生成的警告的声明。 我注意到有一个ec2.ini配置设置可以通过 instance_id ( group_by_instance_id = False ) 禁用分组主机,但是设置并没有像我预期的那样为我解决警告 - 我确保我清除本地库存缓存。

EC2 动态库存的任何变通方法?

这些无效字符(截至 2019 年 6 月 4 日)被定义为常量INVALID_VARIABLE_NAMES ,在:
https://github.com/ansible/ansible/blob/devel/lib/ansible/constants.py#L119
作为'^[\d\W]|[^\w]'
即: any leading non-alpha character OR any character other than alpha-numeric and underscore
(我希望我做对了)

对我来说听起来很准确。 您应该提交包含该信息的文档 PR。

如果您发现弃用警告很烦人,您还可以通过将deprecation_warnings = False到相同的[defaults]来永久禁用任何ansible-命令或ansible ad-hoc 命令的警告[defaults] ansible.cfg ,但我建议不要这样做(因为您可能会错过重要新闻),而是使用内联 shell 环境变量,如下所示:
ANSIBLE_DEPRECATION_WARNINGS=False ansible-inventory --host=localhost

但是,库存解析[WARNING]不会消失。 没有特定的配置或环境变量来关闭所有警告(还没有?),但如果它真的让你感到困扰,你可以将所有标准错误发送到/dev/null (在此处插入“最佳实践”警告):

未记录的ignore选项提供了此功能。 文档公关在这里: https :

从 2.8.2 开始,如果您明确设置任何选项,则此弃用警告将被压制。

ansible 开发团队在哪里讨论此类决策? 我们用户很难理解其中的原因。 如果是纯粹的“python 风格”推理,而不是实际推理,是否值得重新考虑? 如果组名中的破折号破坏了 ansible 未来版本中的内容,那么这可能是实现的问题,而不是组的命名?

对我来说,这听起来更像是一种表面上的改变,而不是经过适当考虑的事情。

组名不是变量名,而是变量名。 连字符/破折号只是一个字符,这也恰好是在命名约定中对信息进行分组的一种非常流行的方式。 与感叹号或星号相比,它在限制子句中没有特殊含义。

缓解此问题的成本是巨大的,因为数千个站点不仅必须更改清单中的组名称,而且还必须检查所有剧本和自有角色,并再次测试它们。

如果“农民”有什么办法可以让他们的声音被听到,我很乐意发表我的意见并尝试了解这个想法是如何产生的。

我开始明白对 ansible 进行的更改是因为用户犯了错误,例如尝试使用groups.group-name而不是groups['group-name'] 。 AIUI,它纯粹是为了减少支持问题而进行的更改。 (我个人反对这种改变。)

旧的行为不会消失; 如果没有明确选择旧行为,它将变得不可用。

很难过。

我的用例是,我将命令“ansible-inventory”嵌入到 Vagrant 文件中,在这种情况下,将东西放入 ansible.cfg 是不礼貌的,并且能够覆盖作为命令行选项(不是环境变量)的行为。

通常像这样的改变是出于好意,但可能并不总是导致人们想到的结果。

我对此更改的问题是组名现在变得有些“特殊” - 主机名中允许使用破折号,但组名中不允许使用破折号,考虑到hosts:部分的剧本开头,这使得它有点奇怪我可以写主机名和/或组名。

@sivel给出的解释真的是这种变化背后的唯一原因吗? 那么hosvars['foo-host']呢? 我希望没有人考虑在清单主机名中也使用破折号无效字符......
除了hostvars还有很多其他示例无法使用“点符号”,因此需要知道何时使用哪种形式。 我发现挑出组名是相当随意的。

虽然点符号参数是一个有点有效的借口,但我认为这不会解决您的支持问题而不改进文档。 如果您的用户正在做一些愚蠢的事情,那么您的文档就不够用了。 所有开发人员都成功地疏远了很多用户。 我将组名称视为任意字符串值。 老实说,限制使用字母数字和下划线有点痛苦,尤其是当主机名 RFC 允许破折号、句点等时......如果下划线是命名约定的事实上的标准,我认为这不会成为问题。 连字符广泛用于描述符字符串。 如果您想减少支持量,请尝试从另一个方向解决点符号问题; 构建您的支持团队可以提供的验证脚本,以检查最佳实践问题并提供警告或指导作为示例。 将有关点符号警告的文档更新为大的、粗体的、红色的、闪烁的,等等……如果您的文档已经涵盖了该问题,则此类支持案例最终会在 1 分钟内完成。 接电话,看问题,提供文档链接,大功告成。

组名中的破折号既是有效的 INI 又是有效的 YAML,我不明白为什么我作为用户必须重命名我的所有组,因为这些名称不能用作 Python 变量名?

还质疑在组名中弃用-决定背后的理由。 不能在动态库存中使用破折号keyed_groups已经够烦人了,但是为了避免假设的与语法相关的支持问题而不得不重命名库存文件和ansible-playbook -l ...命令中的所有组是会很痛苦。

FWIW 我们有命名角色组的约定,如foo_server和主机组如foo-devfoo-test 。 我们几乎 100% 的 Ansible 使用都是像ansible-playbook -l foo-dev这样的命令,所以这个改变需要付出很多努力来对抗肌肉记忆。

不确定在此处添加另一个me 2是否会鼓励推翻这一特定决定,但我倾向于同意要求组名是有效 python 标识符的批评者。

请在组名中支持连字符、字母、数字和下划线(但我也没有反对点)!

我们在组名中大量使用连字符。 两者都用于像这样对名称进行分组:

[server-3x]
server-31.example.com
server-32.example.com
server-33.example.com

并 _abuse_inventory 将主机列表保存在一个地方(而不是在不同的 var 文件中维护主机名),如下所示:

[prometheus_node-exporter_cluster1:children]
server-3x
server-5x
````
We use such groups in templates like this:

{% set _hostgroup = [_service, _job, _cluster]|join('_') %}
{% set _hostlist = groups[_hostgroup]|d([])|sort %}
{% if _hostlist %}
{% 用于 _hostlist %} 中的主机
...
``

我们不只是为了在组名和主机名之间产生明显的差异而使用点。

TRANSFORM_INVALID_GROUP_CHARS中的INVALID一词并不能让人相信可以长期继续使用它们。

如果目的是避免使用这些字符,那么最好将它们称为 _UNSAFE_ 字符,显示警告并让用户决定是否看到此警告。 但永远不要禁止或替换这些字符!

用户应该 a) 忽略这个警告(使用像 ALLOW_UNSAFE_GROUP_CHARS 这样的关键字),b)更改他们的组名(如果可能)或 c) 只接受该警告。 无论如何,大多数人会在前两个选项之间进行选择。

我也觉得这是毫无意义的,因为破折号“-”是几乎所有类型的计算机相关工具中使用的标准分隔符,试图符合一个“宗教”似乎很受限制!!!

旧的行为不会消失; 如果没有明确选择旧行为,它将变得不可用。

如果实际上可以选择加入组名称中的破折号,我就不会担心这种弃用。 那么从新用户的角度来看,它可能是可以理解的。

然而,弃用警告意味着TRANSFORM_INVALID_GROUP_CHARS=never选项将在 Ansible 2.10 中消失,所以我们需要在 Ansible 2.10 发布之前开始重命名我们的所有组?

[DEPRECATION WARNING]:默认情况下,TRANSFORM_INVALID_GROUP_CHARS 设置被设置为允许组名称中出现错误字符,这将改变,但仍可由用户在弃用时进行配置。 此功能将在 2.10 版中删除。 可以通过在 ansible.cfg 中设置 deprecation_warnings=False 来禁用弃用警告。

此外,使用动态库存插件keyed_groups强制转换组名,即使设置了TRANSFORM_INVALID_GROUP_CHARS=neverhttps : https://github.com/ansible/ansible/blob/db0fe4b1884e6bb9c25e970c7585abb7edd9d664/lib/ansible/inventory/group.py#L39

期望的行为

  • 使用TRANSFORM_INVALID_GROUP_CHARS=never需要在未来继续得到支持

    编辑:阅读代码,听起来意图是保留TRANSFORM_INVALID_GROUP_CHARS但在 2.10 中将默认值更改为always - 在这种情况下,弃用警告的措辞不是很好: https:/ /github.com/ansible/ansible/blob/db0fe4b1884e6bb9c25e970c7585abb7edd9d664/lib/ansible/inventory/group.py#L50

  • 使用TRANSFORM_INVALID_GROUP_CHARS=never应该使弃用警告静音

    使用未记录的ignore选项似乎已经可以实现: https :

  • 使用TRANSFORM_INVALID_GROUP_CHARS=never还应该允许在动态库存中使用破折号keyed_groups

    编辑:这显然是为了向后兼容 Ansible 2.7,它无条件地转换了生成的组名。 对此有明确的选择退出会很棒。

关于变量名,我不明白为什么字典键的格式应该与变量名的语法相等? AFAIK 没有任何编程语言有这样的限制。 在 Python 中,您可以使用几乎任何字符串作为字典键。

“组”不是字典类型变量,主机名和组名都只是 Ansible 中的普通字典键。 它们本身不是属性或变量,还是?

我宁愿禁止groups.foo-group 语法而不是groups["foo-group"]。 如果g = "foo-group",那么你使用groups.g 还是groups[g]?

使用ansible.cfg [default] force_valid_group_names = ignoreexport ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=ignore似乎不适用于 Ansible 2.8.1。 它仍然给出弃用警告。

$ ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=ignore ANSIBLE_VAULT_PASSWORD_FILE=vault-password.secret ansible-playbook --diff -i xyz-dev.ini xyz-infra-install.yml -l xyz-dev --check
[DEPRECATION WARNING]: The TRANSFORM_INVALID_GROUP_CHARS settings is set to allow bad characters in group names by default, this will change, but still be user configurable on deprecation. This feature will be removed in version 2.10. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

这是因为它尚未列在有效的choices吗? https://github.com/ansible/ansible/blob/v2.8.1/lib/ansible/config/base.yml#L1501

使用ansible.cfg [default] force_valid_group_names = ignoreexport ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=ignore似乎不适用于 Ansible 2.8.1。 它仍然给出弃用警告。

$ ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=ignore ANSIBLE_VAULT_PASSWORD_FILE=vault-password.secret ansible-playbook --diff -i xyz-dev.ini xyz-infra-install.yml -l xyz-dev --check
[DEPRECATION WARNING]: The TRANSFORM_INVALID_GROUP_CHARS settings is set to allow bad characters in group names by default, this will change, but still be user configurable on deprecation. This feature will be removed in version 2.10. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

这是因为它尚未列在有效的choices吗? https://github.com/ansible/ansible/blob/v2.8.1/lib/ansible/config/base.yml#L1501

这是在即将发布的版本 2.8.2 中修复的错误。 您将能够export ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=ignore并且它将压缩所有警告。

(仍然没有记录忽略选项:https://github.com/ansible/ansible/pull/57318)

这会让每个人都崩溃。 错误的决定。

有没有办法与维护者就此进行推理?

也许其中一位维护者可以在这里详细说明一下,如果这只是一个支持问题,或者他们是否正在使用真正中断的 python 结构?

我只是想补充一点,这很烦人,无法真正找出问题也很烦人,我几乎不得不做ansible-playbook "insert yaml file here" > output.txt来找出问题所在。

同意这里的大部分海报。 从组名中删除破折号似乎是一个深思熟虑的决定,或者是一个实现而不是语义驱动的决定。

这种变化对我来说完全没有意义。 Ansible 开发人员想要强迫成千上万的用户更改他们的组命名仅仅是因为他们想要一种额外的语法(而不是缺失的语法)来访问组? 这是开玩笑吗?

我们在大设置中使用破折号和点。
我们的模式是product-name.environment.datacenter ,它让事情变得非常清楚。
我无法想象丢弃-. ,因为这会使库存完全不可读。

我们正在使用 ansible 清单插件查询本地 CMDB 以获取包含(并将继续包含)破折号的组名称。 如果这在将来无效,它会破坏很多东西。

我们在大设置中使用破折号和点。
我们的模式是product-name.environment.datacenter ,它让事情变得非常清楚。
我无法想象丢弃-. ,因为这会使库存完全不可读。

我们正在使用类似的分层命名方案(受 java 启发,例如 org.company.product-name.component)。
不得不恢复到下划线将是绝对的恐怖。

呵呵。 我们也面临这个问题。 我们在我们的组名中大量使用破折号。
如果有人可以解释什么问题是由于字典中的破折号使用引起的,我会很高兴知道

我主要是重申其他人所说的话,但我想补充一些意见。 我认为如果实施此更改,则应保留和维护允许破折号的标志。 虽然我知道 Python 需要下划线,但短划线通常用于主机名和主机组名。 在我们的环境中,我们从 LDAP/Kerberos 目录中的主机和主机组动态生成清单。 我提到这一点是因为虽然我们可以更改主机名和组名,但这不是可取的。

我们必须做什么才能选择退出此功能? 我们本地的 Ansible 部署脚本中到处都是包含连字符的组名。 当然,我们不将它们与点符号一起使用。 但改变所有这些将是一项真正艰巨的任务。 我更愿意选择退出,同时鼓励我的团队在未来避免使用连字符,并在可能的情况下将连字符转换为下划线,虽然最后一部分并不总是像看起来那么简单。

那么,是否简单地在 ansible.cfg 中设置force_valid_group_names = false ? 这似乎是基于d241794#diff-fd24ad93fbc32f454761746c1ac908f2

在 Ansible 2.8.2 上测试,我相信这个 INI 设置没有按预期工作,这只会删除弃用警告,而我想要的是让 Ansible 使用我的组与破折号而不会抱怨。

以下是没有的结果:

[DEPRECATION WARNING]:默认情况下,TRANSFORM_INVALID_GROUP_CHARS 设置被设置为允许组名称中出现错误字符,这将改变,但仍可由用户在弃用时进行配置。 此功能将在 2.10 版中删除。 弃用
可以通过在 ansible.cfg 中设置 deprecation_warnings=False 来禁用警告。
[警告]:在组名中发现无效字符但未替换,使用 -vvvv 查看详细信息

并将 ansible.cfg 中的设置设置为“false”

[警告]:组名中发现无效字符并自动替换,使用-vvvv查看详细信息

使用ansible.cfg [default] force_valid_group_names = ignoreexport ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=ignore似乎不适用于 Ansible 2.8.1。 它仍然给出弃用警告。

$ ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=ignore ANSIBLE_VAULT_PASSWORD_FILE=vault-password.secret ansible-playbook --diff -i xyz-dev.ini xyz-infra-install.yml -l xyz-dev --check
[DEPRECATION WARNING]: The TRANSFORM_INVALID_GROUP_CHARS settings is set to allow bad characters in group names by default, this will change, but still be user configurable on deprecation. This feature will be removed in version 2.10. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

这是因为它尚未列在有效的choices吗? https://github.com/ansible/ansible/blob/v2.8.1/lib/ansible/config/base.yml#L1501

这是在即将发布的版本 2.8.2 中修复的错误。 您将能够export ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS=ignore并且它将压缩所有警告。

(仍然没有记录忽略选项:#57318)

但这只是压制警告,还是允许我们继续成组使用破折号?
这不是很清楚。

我同意这里所有的批评者。

除了打破剧本之外,这还导致了我所说的 ansible 惯例混乱。 现在主机名和组名有不同的约定,仅仅是因为一些孤立的初学者偶然发现了点符号中的连字符问题? 你猜怎么着 ? 他们仍然会偶然发现它,并且该功能将成功激怒人们而不解决任何问题。 太棒了。

Ansible 组名应该能够尊重它们所代表的现实世界组的命名。

如果所有其他工具都调用一组主机my-backend-service为什么 ansible 应该强制操作员将其转换为my_backend_service以满足 python 的命名规则。

今天真是令人难过的一天.. 当一位 JR 同事向我提出这种反对意见时,我觉得 Ansible 团队不可能如此脱离现实做出如此自私的选择。 我非常喜欢 Ansible,因为它可以完成的工作(从用户角度来看,它与用 Python 编写的零关系) 这里向最终用户推动 PEP 标准的方向让我完全不相信核心 Ansible 开发团队的能力理性的决定。 我希望 IBM 理顺它..
或者
也许会有一个我们可以转移到的新的闪亮的 GO 等价物。

由于这种行为显然非常有争议,我问自己这是否已经完成,并且无论如何都会实施?

我非常感谢这个决定背后的人的回应,并希望在“这是一个 python 标准的东西”之外进行一些详细说明。

由于这种行为显然非常有争议,我问自己这是否已经完成,并且无论如何都会实施?

我非常感谢这个决定背后的人的回应,并希望在“这是一个 python 标准的东西”之外进行一些详细说明。

我同意你的看法。 就在最近,“go”项目退出了一个不受欢迎的提案(见 https://github.com/golang/go/issues/32437#issuecomment-512035919),所以像这样的事情可以(有时应该)重新审视并最终也退了。

这也是一个有趣的话题和讨论,也许不仅仅是为了这个功能的变化。 很难弄清楚 Ansible 作为产品的治理是如何运作的。 也许 _someone_ 应该带他们到https://www.ansible.com/ansiblefest

由于我们中的许多人都在挠头,不明白字符串/变量内容/组名称如何以任何方式对 python 编码风格造成任何问题,很高兴在这里得到维护者的答复,争论为什么会这样一个问题。

我可以理解他们是否想要为变量名称和结构保留编码风格,但是数组或变量的内容?

这是关于 dicts 的点表示法的快速讨论。 这是可能的,但很丑。 https://stackoverflow.com/questions/16279212/how-to-use-dot-notation-for-dict-in-python

在我看来,围绕此存在支持问题的事实是文档问题而不是功能问题。 如果有的话,我认为组名不应该是变量。

事实上,此更改是在任何文档可用之前实施的。

这种变化有什么影响? 我是否必须仔细编辑我所有的 ansible 库存以确保我的组名中没有破折号?

@CMoH IMO 目前最好的解决方法是将force_valid_group_names = ignore到您的配置中并运行 ansible 2.8.2 或更高版本。

@skyscooby ,即使这是一个 PITA。 不可能将此行作为默认值放在/etc/ansible.cfg并在 playbook 目录中使用本地ansible.cfg进行其他配置。 这意味着所有退出的ansible.cfg文件都需要更改。

或者有什么方法可以设置全局默认值(无需向用户环境添加另一个变量)?

@Cougar同意

然而,您的问题并不是此设置所独有的。一些模糊的原因需要一个特定的设置,我们要求他们使用 ENV 方法,剩下的设置他们不需要更改设置为企业标准。 我们使用这种标准配置构建了一个基本的 docker 容器,并且各个项目只需将 ENV 条目添加到他们自己的 Dockerfile 中,同时基于他们的基本 ansible 容器的映像。 所有 ansible 都在容器内执行,因此我们确信所有 pip 模块、ansible 版本和运行时工具端到端都是相同的。

编辑:这也使我们能够在公司中的每个人都受到打击之前,提出新版本的 ansible 和控制问题:)

我做了一些挖掘。

此功能最初是在 PR https://github.com/ansible/ansible/pull/52748 中添加的,据称是为了支持功能请求https://github.com/ansible/ansible/issues/40581

目标的一种描述: https :

此症状的第一个版本(尽管原因不同): https :

伙计,我已经多次阅读#52748。

据我了解,以前在插件和核心中对组名进行了清理,并且有人(无论出于何种原因,因为我仍然完全不清楚为什么)决定组名应遵循 python 变量命名约定。

所以#52748 将卫生设施推到了库存中,这对很多人来说都是坏事。 尤其是那些使用巧妙命名约定(例如在 AWS、Azure 等中)将主机映射到组的人。

如果我们对主机名使用相同的标准/命名约定,我们肯定会失去动力并失去用户。

组名是名称,而不是变量。 在组名中使用破折号(就像在主机名中一样)是有意义的。 翻译(卫生)不应该需要在库存级别(由我们,用户)完成,并且在最好的情况下实际上永远不会。

我真的没有看到强制执行的好处。 讨论似乎也涵盖了“。” 和“:”,有些人喜欢在组名中使用它。 我个人不使用它们,但我也不认为这样做有什么害处。

只要云提供商在他们的元信息中使用破折号,我们就应该能够使用它们进行分组。 实际上,那甚至不应该是驱动程序。 如果我想命名一个组 abcde,这应该不是问题。 这是一个非常有用的分隔符。

不过,这个线程似乎并没有引起开发人员或维护人员的任何关注。 我认为我们是在充耳不闻。

开发人员/维护人员:拜托,请允许在组名中使用破折号!

为了澄清一些误解,其中一部分是由于我的错误和使初始消息不清楚,最新版本修复了人们一直在这里提出的一些问题,其他修复仍在进行中:

只是说一次,很明显,您将始终能够在组名中使用破折号,也可以使用现在被视为“无效”的点和其他字符,只是默认情况下不是。 此“默认”已被弃用,2.11 中的默认设置为“安全”,但您始终可以选择“选择加入”旧行为。

并解释我们如何以及为何来到这里:

首先,组名总是经过清理,它们只是有不同的不一致规则,这取决于您使用的库存类型,脚本无处不在,YAML 和 INI 格式各有各的特点。 主要的变化是“集中和规范卫生”,这是在 2.4 中决定的,但直到 2.8 才完全实施。 目的是提供一个规范或基线,所有这些都可以在 Ansilbe 中安全使用,也就是说我们认识到有很多人使用“不安全”或“无效”字符作为变量,因此我们将其设置为可配置的,不仅在全球范围内,而且在一些库存插件。

最初的实现有一些问题和很多讨论(不,我们不会隐瞒这一点,我们在 irc 举行公开会议,欢迎大家参加,https://github.com/ansible/community/blob/master /meetings/README.md) 和许多反馈被纳入(这些也被记录下来,所以你可以回去查看讨论和推理,但为了避免“日志垃圾箱潜水”,我将在下面解释大部分问题) . 在 2.8 发布后,我们得到了另一轮反馈,我们一直在修复一些错误,例如总是被弃用,而不仅仅是在使用默认值时,特别是在文档和警告的措辞上。

  • “为什么用 Python 命名?”
    主要是因为 Ansible 使用 Python 和 JInja(它也使用 Python)和一些组的使用(主要是在我们早期的例子中,但也有很多 3rd 方的)会在剧本中产生错误,即stuff: '{{ groups.gropup-name-with-dash ... }}'或更糟的是group.name.with.dots 。 这让许多想要使用“变量访问点符号”的 Jinja 功能的用户感到困惑,这就是为什么默认值应该对所有用户都是安全的。 这篇文章中的大多数人可能不同意这一点,但这对很多人来说是一个真正的问题,不应该成为等待新老 Ansible 用户的“陷阱”。 然后那些“选择退出”的人负责避免 Ansible 其他部分的中断使用。

  • “如果我喜欢每个库存都有不同的卫生条件怎么办?”
    好吧,您仍然可以关闭“中央”卫生并为您的特定库存源启用一个,替代旧脚本的最流行的新库存插件已添加选项来模拟脚本行为,最坏的情况下,您仍然可以使用库存脚本。

  • “为什么不是主机名/接下来是主机名?”
    像组一样,主机名的净化一直存在,但没有改变,主机名有不同的要求,比如 DNS 可解析
    用于网络连接或 chroot 连接的有效路径。 此外,幸运的是,几乎没有使用点表示法的主机名的例子,这不是一种常见的做法,如果人们突然开始使用它们就会成为一个问题,但与组名不同,这是我们迄今为止一直避免的事情。 如果它成为未来的问题......我也没有看到好的解决方案。

请注意,这个特定的票证(描述/信息不够好)是我已经解决的问题,希望尽快解决。 至于其余的讨论,开发人员不使用 Github 作为论坛,一些工单转移到了那个领域,之前关闭的并且还有一个长线程的工单直到最近才被忽略,主要是因为开发人员过滤掉了已关闭的问题和期待在 IRC 邮件列表或新问题中的讨论。

我希望这能解决所有主要问题,我们一如既往地开放讨论,请随时访问 ML 或 IRC,我们只是避免使用 github,因为它不是处理此类事情的好地方。

非常感谢您的澄清。

感谢您花时间进行解释,即使停止支持点表示法并在几个版本中弃用该支持会简单得多。 与在其组名中使用无效字符的人数相比,使用它的人更少。 生活

@skyscooby问题在于它不是 Ansible,而是 Jinja。

只是说一次,很明显,您将始终能够在组名中使用破折号,也可以使用现在被视为“无效”的点和其他字符,只是默认情况下不是。

好的,很高兴知道,感谢您的澄清。 但是,用户体验确实需要改进。 你有“知识的诅咒”。 试着想象一下你自己站在看到这个的用户的角度

[DEPRECATION WARNING]:TRANSFORM_INVALID_GROUP_CHARS 设置默认设置为允许组名中的坏字符,这会改变,但仍然是
用户可配置弃用。 此功能将在 2.10 版中删除。 可以通过在 ansible.cfg 中设置 deprecation_warnings=False 来禁用弃用警告。
[警告]:在组名中发现无效字符但未替换,使用 -vvvv 查看详细信息

这是一个很长很长的路要走

[弃用警告] 组名“my-servers”包含“-”,默认情况下从 Ansible 2.11 开始无效。 将 ansible.cfg 中的 force_valid_group_names 或 ANSIBLE_TRANSFORM_INVALID_GROUP_CHARS 环境变量设置为“忽略”以抑制这种情况。 有关更多信息,请参阅https://docs.ansible.com/something

......这是我作为用户真正想看到的。 它可以为我节省一个多小时。 现在乘以已经或将遇到此问题的人数。

组名中的破折号和点无效并不是明智的默认设置。 人们总是将它们放在他们的组名中。 要求他们在配置文件中设置另一个变量以启用明智的行为是恕我直言站不住脚的。

感谢@bcoca在上面发表评论。 非常感谢。

虽然我对这个决定不满意,但我理解进行了讨论并做出了决定。 如果该决定仍有待讨论,则应在邮件列表或 irc 上继续讨论,但可能无法解决此问题。

对于这个问题的主题,我想在官方文档和移植指南中找到以下信息,以了解此更改。

  • 默认情况下有效的组名称是什么?
  • 如何继续使用包括破折号、连字符、点和冒号在内的组名?

因为我们在所有组名和主机名中都使用了破折号,我们不会更改它。 因此,每次我设置新的安装/环境时,我都必须选择加入并更改我的ansible.cfg 。 这对我来说很不幸,但我必须以某种方式处理它。 我最不希望的是,这是相应地记录在案。

为了继续讨论这种更改是否明智,我在 Ansible 开发组中开了一个帖子

此致,
特隆德

我要感谢在这个问题上的所有贡献者。 根据我在这里读到的内容,我决定写一篇博客文章https://docs.sbarnea.com/ansible/naming-hosts-and-groups —— 希望它能总结用户需要做什么。

@loop-evgeny 我同意我们作为核心团队确实有“知识诅咒”,它阻止我们创建对每个人都有用的文档和错误。 我们也完全依赖社区来帮助我们塑造 ansible 并为尽可能多的用户保持简单,所以当人们对改进我们的文档和我们的错误/警告消息有建议时,我总是鼓励他们通过发送拉请求。 您指出的消息保存在以下文件中,如果您能向我们发送带有建议更改的 PR,我们将不胜感激...

https://github.com/ansible/ansible/blob/4ef2545eb5d661566e06629015967c2d1b8924e3/lib/ansible/inventory/group.py#L54 -L55

@jctanner通常,我很乐意提交 PR 以改进我使用的免费且有用的程序。 然而,Ansible 开发人员对可用性的普遍态度,他们渴望关闭“按预期工作”的问题,我认为这些问题是不言而喻的错误(即使是设计错误)以及 Ansible 目前有 2025(即2000 !)公开的 PR 给了我很少的信心,我的工作不会浪费。 如果您真的想“依赖社区”,正如您所说,那么恕我直言,需要进行实质性的文化变革。

嗯..这个机会也击中了我。

不幸的是,我们使用网络名称作为组名称,这不容易更改。 我很乐意为组名选择不使用点语法糖,因为我从未使用过它(尽管我将它与其他变量一起使用)。

将来最好使用ansible-playbook whatever.yaml -l some.network.to.use 。 使用网络以外的任何其他名称作为组名将大大减少用例。

你好,
我现在有些困惑。 有人能告诉我我必须在ansible.cfg设置什么以允许将来在组名中使用无效字符吗?

force_valid_group_names = ignore

ansible 重新升级到这个问题的未来版本是什么? 有时 ansible 会拒绝组名中的所有破折号而不使用force_valid_group_names吗? (没有听到因更改而受到影响的用户的反馈,以及从未因在组名称中使用连字符而遇到问题的用户的反馈)

抱歉,请阅读@bcoca的评论,

你好,
我看到了同样的警告,但是,我不明白我应该改变什么,以及我们是否应该改变它。
它与python有关吗?
怎么解决?

如果我使用 force_valid_group_names = ignore 忽略,那将是必要的,当我升级到 Ansible >= 2.10 时?

问候,
塞萨尔·豪尔赫

如果我没有理解这个正确。 唯一不推荐使用的是组名称的自动转换。 这意味着在 2.10 及更高版本之后设置force_valid_group_names = ignore应该完全没问题。

继续在组名中使用破折号和任何你想要的东西也应该完全没问题。 Ansible 将来不会做的是对它们进行消毒,这样即使对于“无效”组名称,您也可以使用虚线表示法。 例如:

您的清单包含一个名为foo-bar.xyz 。 现在您要编写一个模板来创建属于该组的主机列表:

{% for host in groups['foo-bar.xyz'] %}
{{ host }}
{% endfor %}

请注意,以下版本的模板将不起作用:

{% for host in groups.foo-bar.xyz %}
{{ host }}
{% endfor %}

这是因为-.在这种情况下具有特殊含义。 但是,如果您的组的名称foo_bar_xyz则点符号完全没问题,因为模板随后变为:

{% for host in groups.foo_bar_xyz %}
{{ host }}
{% endfor %}

这当然完全没问题。

为了让用户更轻松,Ansible 显然总是对组名进行一些清理。 这意味着它是(直到 2.10 仍然是)可以在上面的例子中使用foo_bar_xyz ,即使该组实际上被称为foo-bar.xyz 。 我个人认为这根本不会让事情变得更容易,而且现在核心团队似乎也同意这一点。
因此,他们解决该问题的下一个尝试首先是使“无效”组名称成为不可能。 但是,据我所知,始终可以通过设置force_valid_group_names = ignore来选择退出此限制。

长话短说,实际上是两种不同的变化相互交织[1]。 令人困惑的警告名称和措辞由此而来。

同样,这只是我理解这个问题的方式。 如果我错了,请纠正我!

[1]了解更多详情,请参阅

我只想留下我的 2 美分,因为我坚决支持破折号 > 下划线。 只需对此事进行快速的

即使情况并非如此,我看到破折号比下划线更频繁地用于服务器标签和组等事物的事实意味着这将是另一件事,我必须确保将其添加到我的所有内容中和我客户的ansible.cfg文件(我倾向于每个剧本都有一个)。

我对 Ansible 尝试强制使用更严格的默认值没有任何问题,它可以改善体验,但首先你是为了我角色名称中的破折号(有时允许对祖父角色的旧角色使用单数例外),然后你来了破折号我的收藏品(不允许以任何方式、形状或形式出现),现在您来我的库存中寻找破折号!

这是一场反对破折号的战争......我想在某处划一条线——在这种情况下,这是我实际上不可能阻止人们使用破折号的地方,因为许多动态库存提供者创建基于组的在服务器名称和标签上,许多(如果不是大多数)组织似乎使用破折号标记事物(例如us-east-1a ,而不是us_east_1a )。

拥有一个几乎总是必须被覆盖才能使软件工作的默认值并不有趣,但听起来从 Ansible 2.11 开始,情况就会如此。

如果这完全是因为一些不熟悉 Jinja2 和 Python 的用户没有意识到something.with-some-dashes是无效的,我认为最好教他们“如果有破折号,你应该使用括号表示法进行 dict 访问,例如something['with-some-dashes'] 。如果需要,您甚至可以将两者混合。这不是超级纯粹和全面的,但我们并不是这里的所有 Rust 开发人员......

说得很好,杰夫。 我在这里非常同意你的观点 - 这种变化将是非常具有破坏性的,不仅需要一次性迁移,还将改变大量用户的工作流程。 Ansible 将不再开箱即用。

主机名不能包含下划线,因此在正常情况下,不会强制inventory_hostname。 这意味着我们的清单现在看起来非常不一致,主机名不能包含下划线,组不能包含连字符。

请不要切换默认设置。

https://en.m.wikipedia.org/wiki/Hostname

你好,
我完全同意杰夫的看法。

但是正如@bcoca上面所说的,大多数开发人员不会定期查看这些讨论,这个问题可能不是讨论更改的合适场所,因为它与正确的文档有关。

如需讨论,请加入线程更改 TRANSFORM_INVALID_GROUP_CHARS 的默认设置是个好主意吗? 在 Google 网上论坛中。

杰夫的好点子。

拥有一个几乎总是必须被覆盖才能使软件工作的默认值并不有趣,但听起来从 Ansible 2.11 开始,情况就会如此。

这是我从所有这些讨论中得到的最大收获。 我理解需要解决的问题,但解决方案似乎与需要的相反。 它使支持变得更容易,但对用户来说却很难——这是一个倒退的解决方案。

如果这完全是因为一些不熟悉 Jinja2 和 Python 的用户没有意识到某些东西。with-some-dashes 是无效的,我认为最好教他们“如果有破折号,你应该使用括号表示法进行 dict 访问,例如something['with-some-dashes']。如果需要,您甚至可以将两者混合。

这是最好的解决方案,而不是破坏已经使用多年的东西。

来自@geerlingguy 的精彩评论 -

作为 Ansible 的用户,我想补充一点,为什么我需要知道有效的 Python 语法是什么? 使用 Ansible 已经很长时间了,我明白 Ansible(及其模块)是用 Python 编写的,但我为什么要关心它呢? 将这一事实暴露给最终用户只是糟糕的设计。

类似于只允许有效的 JavaScript/Ruby/.NET/任何符号表示 Web 应用程序中的用户名等。 为什么最终用户会关心应用程序是用哪种语言编写的?

除此之外,引入重大更改是一个困难的话题,如果可能,我会尽量避免这种情况。 如果我必须做出改变,我通常会保留旧的、现有的行为作为默认行为,让人们选择新行为。 为什么这里没有这样做? 为什么我必须更改我的配置,或者更糟的是我的整个库存? 为什么不反过来呢?

如果系统在内部需要严格兼容的令牌,则系统应在内部生成令牌并创建一个查找表,将内部令牌与用户数据相关联。 这样 Ansible 可以根据需要更改其令牌规则并限制对用户的影响。 用户应该能够按照他们或他们的客户认为合适的方式命名他们的库存、角色等。

在我看来,此更改可能与其预期效果相反(以减少支持查询):

现在主机名(应该是 DNS 可解析的,即不包含下划线)和组名(不应该包含破折号)都不支持(默认)分隔符。

绝对应该可以自由命名任何主机

El mié.,14 年前。 2019 16:16, Christian Pointner通知@github.com
escribió:

如果我明白这一点
https://github.com/ansible/ansible/issues/56930#issuecomment-516863432
正确。 唯一不推荐使用的是自动
组名的转换。 这意味着设置 force_valid_group_names 应该完全没问题
= 在 2.10 及以后忽略。

继续使用破折号和任何你想要的东西也应该完全没问题
不想在组名中。 Ansible 将来不会做的事情是 sanatize
因此,即使对于“无效”组名称,您也可以使用点号表示法。 为了
例子:

您的清单包含一个名为 foo-bar.xyz 的组。 现在你想写
创建属于该组的主机列表的模板:

{% 用于组中的主机['foo-bar.xyz'] %}
{{ 主持人 }}
{% 结束为 %}

请注意,此版本的模板不起作用:

{% 用于 group.foo-bar.xyz 中的主机 %}
{{ 主持人 }}
{% 结束为 %}

这是因为 - 和 . 在这种情况下具有特殊意义。 这
但是,如果您的小组有
命名 foo_bar_xyz 因为模板然后变成:

{% 为组中的主机.foo_bar_xyz %}
{{ 主持人 }}
{% 结束为 %}

这当然完全没问题。

为了让用户更轻松,Ansible 显然总是
对组名做了一些清理。 这意味着它是(直到 2.10
仍然是)可以在上面的例子中使用 foo_bar_xyz 即使
该组实际上称为 foo-bar.xyz。 我个人不认为这个
让事情变得更容易,现在核心团队似乎也同意
接着就,随即。
所以他们解决这个问题的下一个尝试是
首先是“无效”组名称。 不过据我了解
通过设置 force_valid_group_names 始终可以选择退出此限制
= 无视。

长话短说它实际上是两个不同的变化
相互交织[1]。 令人困惑的名称和措辞由此而来
警告。

同样,这只是我理解这个问题的方式。 如果我是,请纠正我
错误的!

[1] 详情请参阅 RFC1925
http://www.faqs.org/rfcs/rfc1925.html第 2 段,第 (5) 点


您收到此消息是因为您发表了评论。
直接回复本邮件,在GitHub上查看
https://github.com/ansible/ansible/issues/56930?email_source=notifications&email_token=AA5N2CJCIELW7JWHC6OJ35DQEQHSPA5CNFSM4HPRGLKKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD4I5U3Y#issuecomment-521263727
或静音线程
https://github.com/notifications/unsubscribe-auth/AA5N2CIVT5PLD2QCAGGBK6LQEQHSPANCNFSM4HPRGLKA
.

在我的诚实看来,这确实是一个错误的决定。 并且出于错误的原因。 减少支持请求的数量,真的吗?

Ansible 作为一种工具,不应将特定于语言的细节强加给最终用户。 我已经对 Terraform 将所有 Golang 强加于我的喉咙感到非常沮丧,现在 Ansible 和“pythonic”风格也发生了同样的事情。 不要误会我的意思,我在 Go 和 Python 上都工作得很好,但是当涉及到基础设施即代码时,我为什么要关心呢? 并且承诺让 YAML 规定要管理的代码库的形状发生了什么? “作为数据的基础设施,你可以阅读和运行”,我听过很多次......据我所知,YAML 根本不在乎破折号和下划线。

顺便说一句,有很多东西不支持下划线。 主机名、AWS 区域和 ID 几乎涵盖所有内容,仅提及一些非常重要的内容。 祝你好运保持所有应该发生转换的例外......

对于来这里只是想快速解决这个问题的人来说,只需将force_valid_group_names = ignore行添加到您的ansible.cfg

我的理解是无论如何你都不能对带有空格的变量使用点表示法,虽然我从不创建带有空格的变量,但不幸的是,很多供应商通过 json API 响应返回带有空格的字典键。 对我来说明智的选择似乎切换到方括号表示法。 希望将 force_valid_group_names 设置为 ignore 不会在以后的道路上造成不良影响,谁知道这个更改将来还有什么计划。

这是一个非常可怕的决定,尤其是在处理动态库存时,如 Openstack(和 AWS)。
包含“禁止字符”的实例名称和元数据键通常作为库存项目和/或来自底层云的组变量返回。 对于许多尝试使用元标签和/或实例 ID 来管理他们的队列的 Openstack(和 AWS)管理员来说,这将使他们的生活变得糟糕:
实例-8ca09c33-f255-440f-9544-b0ab318c79d9
meta-os_ubuntu

Ansible 开发人员应该认真对待@geerlingguy 的意见。 他是 Ansible Galaxy 的最大贡献者之一,他的角色被大量的人使用。 我认为这种变化对于拥有数千个名为$env-$role-[0..99]的主机的人来说真的很糟糕。 我们是否应该重命名所有内容以安抚我们的 Ansible 霸主?

@ssbarnea一方面,我们正在推动只允许变量名和其他类似的键,它们是有效的 python 标识符。 为了进一步解释组名,它会给尝试使用诸如groups.foo-group类的“点语法”的用户带来问题,这与用户期望的不一样。 由此类小问题引起的问题和支持请求的数量使我们走上了保护名称的道路,以确保不会发生此类问题。

对于那些想要保留我们认为无效字符的人,可以选择退出此功能。

用户可以选择退出这种行为多长时间? 在所有 ansible 版本中是否会有永久配置选项禁用此行为,还是仅在 2.11 之前支持? 我很高兴默认情况下打开该选项,只要我始终可以选择将其关闭。

如果这在 2.11+ 中成为一个硬性限制,那么您可能会发现自己失去了受组织约束约束的客户(并非所有 ansible 用户都有权决定其公司使用的命名约定)。 对于那些使用 ansible 来管理云基础设施的人来说,这种变化似乎也会带来重大挑战,其中破折号往往被大量使用。

只是为了提醒那些还没有在这里阅读整个主题的人。 devel 邮件列表上还有一个线程: https ://groups.google.com/forum/#!

恕我直言,这种变化是一个非常糟糕的选择。 次要版本中的代码破解语法更改阻止我们在我们的环境中扩展 Ansible 的使用。 因为当 Ansible 破坏了我的用户的剧本时,我将无法更新它。

但是正如@bcoca上面所说的,大多数开发人员不会定期查看这些讨论,这个问题可能不是讨论更改的合适场所,因为它与正确的文档有关。

@Tronde :有人会争辩说,在编写故事之前先咨询贡献者和客户,以了解影响并在有人编写解决方案之前收集反馈。 正如这里的几个人所提到的,这是我们不止一次看到的产品管理失败。

作为@andyfeller描述的有关此更改的情况的示例:

我们在我们的网站上遇到了这个问题。

我们使用 Red Hat Identity Manager 作为外部清单,我们不控制它,它包含许多带有破折号而不是下划线的主机组。 这不会改变(因为使用这些名称存在的所有其他事物)。

所以,我们需要:

  • 配置 Ansible 以保持当前行为
  • 使弃用警告静音
  • 为命令行 Ansible 和 Ansible Tower 执行此操作

仅供参考 PR https://github.com/ansible/ansible/pull/66650 (请不要在那里使用干草叉)定于 2.10(截至目前),这意味着当前看到此警告的任何人都会(一旦他们升级到 2.10,再次假设 PR 被合并)开始有剧本失败(直到他们在ansible.cfg设置force_valid_group_names = ignore ansible.cfg )。

只是为了可见性而发帖。 我仍然坚定地支持我之前的断言,即这是一个用户敌对的默认设置,因为仍有许多动态清单脚本(Ansible 本身的某些部分或现在移入“官方 ish”集合)生成带破折号或其他有效的 DNS 字符。

实际上,任何将 Ansible 与 AWS 结合使用的人都将不得不覆盖默认值。

@geerlingguy这是正确的公关#吗? 看起来这指向了这个问题。

仅供参考,这是在核心会议上讨论19:06:55

@apple4ever哎呀,更新了链接,它是https://github.com/ansible/ansible/pull/66650

所以我在上面看到了许多已经回答/揭穿/等的评论,所以只需链接我之前的帖子。

https://github.com/ansible/ansible/issues/56930#issuecomment -516863432

请不要添加不添加新项目供讨论的新帖子,因为它们隐藏了之前已经回答过的帖子。

顺便说一下,在 Python 文档中,关于有效变量名的样子,链接到哪里比较合适? 有https://docs.python.org/3/reference/lexical_analysis.html#grammar -token-identifier,但对于没有计算机科学背景的人来说,这不是真正的用户友好或可读的。

询问的原因是我不确定实际的初始投诉是否已得到实际处理。 只是有一个错误警告,但需要大量挖掘才能找出究竟是什么以及如何 - 如果愿意或能够 - 实际上可以选择有效的组名。 我希望至少有一个明确的“组名foo-bar包含无效字符( - )。有效的组名应该是有效的 Python 标识符(有关更多信息,请参阅https://docs.python.org/??? )”消息,而不仅仅是“有坏字符,再次检查 -vvvv 以实际找出哪些字符!”。 理想情况下,这也会提到这可以被禁用,但可能会导致其他意想不到的问题(例如让 Ansible 很难区分foo-barfoo.barfoo_bar )。

目前,它更像是“你做错了什么,修复它”的消息,没有明确的方式来说明如何继续,这也可能导致这里的强烈反应。

@geerlingguy评论 56930 中写道:

(直到他们在 ansible.cfg 中设置 force_valid_group_names = false)

文档没有提到“false”作为该键的有效值。 我已将值设置为“忽略”,这应该可以解决问题。 但是“false”是无效关键字还是正确且此处的文档不完整?

@bcoca在之前的评论中:

只是说一次,很明显,您将始终能够在组名中使用破折号,也可以使用现在被视为“无效”的点和其他字符,只是默认情况下不是。 此“默认”已被弃用,2.11 中的默认设置为“安全”,但您始终可以选择“选择加入”旧行为。

您已经反复声明可以保留当前行为,但是现在执行此操作并消除弃用警告所需的确切 ansible.cfg 设置是什么。

我已经尝试过@geerlingguy在评论 56930 中写道:

(直到他们在 ansible.cfg 中设置 force_valid_group_names = false)

这会导致我的剧本在找不到带有连字符的主机或组时失败(它们来自我们编写的清单插件顺便说一句,论文是否也必须进行转换,或者当 Ansible 从插件?)

我已经尝试过@geerlingguy在评论 56930 中写道:

(直到他们在 ansible.cfg 中设置 force_valid_group_names = false)

这会导致我的剧本在找不到带有连字符的主机或组时失败(它们来自我们编写的清单插件顺便说一句,论文是否也必须进行转换,或者当 Ansible 从插件?)

这在几条评论中提到并且在文档中。 您应该使用neverignore

那么我们是不是不应该再使用 EC2 动态清单脚本了,因为它按“us-east-1”、“us-east-2”等对所有内容进行分组? 或者有更新的计划吗? 我刚刚访问了 EC2 动态清单脚本的 Ansible 文档,并且在 Github 上下载它的链接不再有效,所以这很有趣。

我刚刚访问了 EC2 动态清单脚本的 Ansible 文档,并且在 Github 上下载它的链接不再有效,所以这很有趣。

https://github.com/ansible/ansible/issues/68419

对于那些不想阅读 IRC 日志的人,这里是决定,即没有决定:

19:15:40 <sivel> I've got to say, that brining this topic up all the time isn't a good use of time
19:15:52 <cyberpear> bcoca nominated it
19:16:07 <felixfontein> I think the aim was to solve this once and for all (like, again :) )
19:16:29 <cyberpear> since bcoca is not here, move on to next topic?
19:16:34 <sivel> honestly, I don't think this is going to be the right forum to make a decision on this
19:16:45 <jillr> +2 moving on
19:16:47 <cyberpear> sivel: what's the correct forum?
19:16:55 <felixfontein> sivel: what is the right forum for making that decision?
19:17:02 <cyberpear> "declaration from Red Hat On High"?
19:17:15 <sivel> I'm going to abstain on that, but this project is not a democracy
19:17:16 <cyberpear> -1 to "declaration from Red Hat On High"
19:17:24 <sivel> too many cooks in the kitchen distract
19:17:45 <sivel> We know the arguments at this point
19:17:59 <sivel> anywho, next topic

是的,有人写道“请随意使用 ML 或 IRC”。 不,“这个项目不是民主”。

是的,有人写道“请随意使用 ML 或 IRC”。 不,“这个项目不是民主”。

老实说,这对开源来说是错误的——如果它导致一种不流行的方式——人们可以分叉它,它可以分叉吗?

我可以看到在 ansible 中接受 PR 非常慢。 补丁看起来很明显需要和简单的改变,但它永远不会进入。幸运的是,ansible 本身很灵活,允许人们使用自定义插件,但似乎陈旧会使我的贡献减少 - 甚至更麻烦这样做。

有点难过,真的……

@sunshine69我感觉到你的痛苦。 但这是应该在 IRC 或 Google Group for Ansible Development 上进行的讨论。

这个问题不是它的正确位置。 因为很少有人在这里阅读。

@sunshine69我感觉到你的痛苦。 但这是应该在 IRC 或 Google Group for Ansible Development 上进行的讨论。

这个问题不是它的正确位置。 因为很少有人在这里阅读。

虽然在这些其他渠道中讨论可能更有成效,但对于专门关注此问题的人来说,透明度是值得赞赏的。 IRC 毕竟不是每个人的偏好。

仅供参考:昨天刚刚合并了对 TRANSFORM_INVALID_GROUP_CHARS 的弃用。 有 2.9 (https://github.com/ansible/ansible/pull/69487) 和 2.8 (https://github.com/ansible/ansible/pull/69488) 的反向移植 PRs 来删除那里的弃用警告。

描述中标识的文件:

如果这些文件不正确,请更新说明的component name部分或使用!component bot 命令。

单击此处获取机器人帮助

当我设置force_valid_group_names = ignore警告消失了,但弃用通知并没有消失。

最后我在文档中找到了: force_valid_group_names = silently它将进行替换并且不会阻塞输出 - 如果这是您想要做的。

尽管如此,如果一开始就没有进行这样无意义的更改,那么整个问题本来可以避免的。

@emmm-dee - 对于那个特定问题,我打开了https://github.com/ansible/ansible/issues/70908 - 请注意,这个问题仍然存在,因为仍然没有关于 _are_ 'valid' 组字符的官方文档.

感谢@geerlingguy的行动! 您是使 ansible 变得更好的人。

我正在为我们的反弹(启动/停止)应用程序工作,但我没有与应用程序主机连接。

我试过你发送的 ping 命令,它工作正常......

[ webadmin@vlodjumpts00 ~]$ ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) 字节数据。

来自 8.8.8.8 的 64 字节:icmp_seq=1 ttl=112 时间=10.6 ms

[ webadmin@vlodjumpts00 ~]$ mirrorlist.centos.org

-bash: mirrorlist.centos.org: 命令未找到

我想将它用于我们的组织。如果我运行“ansible all -m ping”命令。 面临错误,以下是详细信息:

[ aa63457@vlodjumpts00 bin]$ ansible all -m ping

更改,但仍然是用户可配置的弃用。 此功能将在 2.10 版中删除。 弃用警告可以是

通过在 ansible.cfg 中设置 deprecation_warnings=False 来禁用。

RTE3EPAdmin | 无法访问! => {

"changed": false,

"msg": "Failed to connect to the host via ssh: ###############################################################################\n# CenturyLink computers and the CenturyLink computer network are CenturyLink  #\n# property. Only authorized persons may use them and only for legal and proper#\n# purposes as determined solely by CenturyLink. You consent to the monitoring #\n# of their use. You must use CenturyLink computers and the network in         #\n# accordance with the CenturyLink Code of Conduct, subject to discipline for  #\n# misuse. Customer use is governed by the CenturyLink Acceptable Use Policy.  #\n###############################################################################\nUse CTL credentials (login/password) on this server.\nAUTH-NOTICE:\nAUTH-NOTICE: Use your cuid as your username\nAUTH-NOTICE:\nPermission denied (publickey,password).",

"unreachable": true

}

本地主机 | 成功 => {

"ansible_facts": {

    "discovered_interpreter_python": "/usr/bin/python"

},

"changed": false,

"ping": "pong"

}

请帮助我...我需要这样做。 实际上,我们没有用于连接主机的主机文件的 UN/PWD..

本地主机 ansible_connection=本地

[RTE3VFO]

RTE3VFOAdmin ansible_host=vlddwblasts001.test.intranet

RTE3VFOManaged ansible_host=vlddwblasts002.test.intranet

[RTE3EP]

RTE3EPAdmin ansible_host=vlddwblasts002.test.intranet

RTE3EPManaged ansible_host=vlddwblasts003.test.intranet

[RTE3RES]

RTE3RESAdmin ansible_host=vlddwblasts003.test.intranet

RTE3RESAManaged ansible_host=vlddwblasts004.test.intranet

[RTE3ORCH]

RTE3ORCHAdmin ansible_host=vlddwblasts004.test.intranet

RTE3ORCHManaged ansible_host=vlddwblasts005.test.intranet

[RTE3EASE]

RTE3EASEAdmin ansible_host=vlddwblasts005.test.intranet

RTE3EASEManaged ansible_host=vlddwblasts006.test.intranet

[RTE3RTS]

RTE3RTSAdmin ansibke_host=vlddwblasts006.test.intranet

[EASE-ASR-Test2:儿童]

RTE3VFO

RTE3EP

RTE3RES

RTE3ORCH

RTE3EASE

RTE3RTS

目录结构是:

[ webadmin@vlodjumpts00 ansible ]$ pwd

/etc/ansible

[ webadmin@vlodjumpts00 ansible ]$ ll

共 84 个

-rw------- 1 webadmin webadmin 607 2017 年 7 月 12 日 1

-rw-r--r-- 1 webadmin webadmin 17910 Sep 19 09:55 ansible.cfg

-rw-r--r-- 1 根 19985 2019 年 12 月 8 日 ansible.cfg.rpmnew

-rw------- 1 webadmin webadmin 213 Jul 3 2017 eeasr-rte2-ease.yml

-rwxr-xr-x 1 webadmin webadmin 1034 Sep 19 09:16 easy-hosts

-rwxr-xr-x 1 webadmin webadmin 1647 Sep 19 10:50 hosts

-rw------- 1 webadmin webadmin 2679 Jul 3 2017 hosts.bkp

-rw------- 1 webadmin webadmin 273 Jul 6 2017 lineinsfile_tst.yml

drwx------ 4 webadmin webadmin 4096 2017 年 11 月 2 日剧本

drwxr-xr-x 3 根根 2019 年 12 月 8 日 19 日角色

-rwxr-xr-x 1 webadmin webadmin 7321 2017 年 11 月 2 日 servmix_hosts

-rw------- 1 webadmin webadmin 208 Sep 19 10:55 test.yml

-rw------- 1 webadmin webadmin 122 Sep 19 10:54 vars.yaml


我们没有直接连接到主机...首先登录我们的跳转服务器而不是 ssh 主机...

跳转服务器是“vmdcltctws217”端口使用=22,连接类型=ssh

然后输入我们的 UN/PWD

之后我们做了 sudo 连接到主机服务器..

须藤 su - eseasqa

然后 ssh 主机服务器就像..

vlddwblasts001.test.intranet

然后我们从这里运行启动/停止命令..

请帮帮我,我能做什么?

此页面是否有帮助?
0 / 5 - 0 等级