首页 > 解决方案 > 分配 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.

标签: ansibleansible-inventory

解决方案


任务中的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)中声明主机变量。您应该阅读有关库存的文档以熟悉这些概念。


推荐阅读