ansible - 分配 ssh 用户取决于 Ansible 中主机文件中提到的主机名
问题描述
我的主机文件定义如下。
[groupname]
server1
server2
server3
上面列表中的每个服务器都有不同的 SSH 用户登录。
在我的剧本中,我根据主机名条件设置用户。
- name: setting user user1
set_fact: ssh_user='user1'
when: "{{ inventory_hostname }}" == 'server1'
- name: setting user user2
set_fact: ssh_user='user2'
when: "{{ inventory_hostname }}" == 'server2'
- name: setting user user3
set_fact: ssh_user='user3'
when: "{{ inventory_hostname }}" == 'server3'
然而,这并没有按预期工作,并且总是抛出语法错误,但 yaml 是有效的。
寻找一些建议。
下面是剧本执行时抛出的错误,
ERROR! Syntax Error while loading YAML.
The error appears to have been in '/var/lib/awx/projects/_2573__sample/mysample.yml': line 6, column 36, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
set_fact: ssh_user='user1'
when: "{{ inventory_hostname }}" == 'server1'
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value.
解决方案
任务中的when
子句不应该是 jinja2 扩展变量。利用
when: inventory_hostname == 'somehost'
此外,关于我之前的评论,没有必要像你在剧本中那样为这样的变量设置事实。您应该在库存级别设置它,这样您就不必为您使用的任何剧本而烦恼。你有几个选择。如果你想坚持你的 ini 风格库存,你可以这样做:
[groupname]
server1 ansible_user=user1
server2 ansible_user=user2
server3 ansible_user=user3
您还可以在 yaml 中创建清单,或在单独的文件(在 中host_vars/<hostname>.yml
)中声明主机变量。您应该阅读有关库存的文档以熟悉这些概念。
推荐阅读
- .net - 推文中的某些(不是全部)标点符号会导致 API 错误 32“无法验证您”
- scala - 得到一个错误的 JsValue 预期但 JsNode 提供
- node.js - 当我尝试发送 RichEmbed 时,Bot 发送一条空消息
- java - 为什么我不能在这个 while 循环中使用括号?
- objective-c - 检查 setImageWithURL 图像是否已加载或占位符图像已设置
- c# - 如何在类中添加图像列表?
- javascript - 如果选中复选框,则传递输入值,值在数组中?
- python - ipython3 和 jupyter notebook 不允许 python3 选项
- c# - Xamarin 表单 - 自定义 ContentPage 的工具栏项
- r - 将大量数字从 R 导出到 csv