users:
- name: hellouser
password: pw
accessToken: ""
readonly: false
- name: hellouser2
password: pw2
accessToken: ""
readonly: true
结果是:
fatal: [IP]: FAILED! => {"changed": false, "failed": true, "msg":
"AnsibleUndefinedVariable: 'unicode object' has no attribute 'name'"}
何时users
更改为users2
:
users2:
- name: hellouser
password: pw
accessToken: ""
readonly: false
- name: hellouser2
password: pw2
accessToken: ""
readonly: true
ansible 运行成功。
讨论
- 该问题可能是由于本机变量和自定义变量之间的冲突引起的,例如,由于自定义变量更改为,
users
此问题不再发生。然而,在users
users2
users
文档What Makes A Valid Variable Name
:
添加、附加、as_integer_ratio、bit_length、大写、中心、清除、共轭、复制、计数、解码、分母、差异、difference_update、丢弃、编码、endswith、expandtabs、扩展、查找、格式化、fromhex、fromkeys、获取、has_key、hex、imag、索引、插入、交集、intersection_update、isalnum、isalpha、isdecimal、isdigit、isdisjoint、is_integer、islower、isnumeric、isspace、issubset、issuperset、istitle、isupper、项目、iteritems、iterkeys、itervalues、连接、键、ljust、lower、lstrip、分子、分区、pop、popitem、实数、删除、替换、反转、rfind、rindex、rjust、rpartition、rsplit、rstrip、setdefault、排序、拆分、splitlines、startswith、strip、swapcase、symmetric_difference, symmetric_difference_update、标题、翻译、联合、更新、上限、值、viewitems、viewkeys、viewvalues、zfill。
- 在 Puppet 中,可以定义全局变量和局部变量,这样本机变量和自定义变量之间就不会发生冲突。根据本文档可以在 Ansible 中定义不同的变量类型:
- 全局:由配置、环境变量和命令行设置
- 剧本:每个剧本及其包含的结构、变量条目、include_vars、角色默认值和变量。
- 主机:与主机直接相关的变量,如库存、事实或注册任务输出
问题
- 如何防止 Ansible 中本机变量和自定义变量之间发生冲突?
- Ansible 中是否有本机变量列表?
- Ansible 中是否有像 Puppet 一样的全局变量和局部变量?
答案1
如果没有引发错误的任务,"AnsibleUndefinedVariable: 'unicode object' has no attribute 'name'"
很难判断这里出了什么问题。我无法重现此错误,所以我猜这是您使用的模块中的一个错误。
除了已经引用的列表known public attributes
我不知道还有什么其他规则。即使使用,在known public attributes
我的测试中也没有导致任何错误。
Ansible 有以下概念魔法变量这些基本上只是模块收集的事实。您可以通过针对主机运行模块setup
来获取列表。magic variables
setup
Ansible 中没有global
和local
变量,就 而言types
。Ansible 中的变量有一个scope
。变量的范围取决于它设置的位置。看看变量优先级的文档。