分配ssh用户取决于Ansible主机文件中提到的主机名

时间:2019-04-29 16:37:51

标签: ansible ansible-inventory

我的主机文件定义如下。

[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.

1 个答案:

答案 0 :(得分:1)

任务中的when子句不应该是jinja2扩展的var。使用

when: inventory_hostname == 'somehost'

此外,关于我之前的评论,没有必要像在游戏手册中那样为这样的变量设置事实。您应该在库存级别设置此设置,这样您就不必为使用的任何剧本而烦恼。您有几种选择。如果您想坚持使用ini风格的广告资源,可以这样做:

[groupname]
server1 ansible_user=user1
server2 ansible_user=user2
server3 ansible_user=user3

您还可以使用yaml进行库存,或在单独的文件(在host_vars/<hostname>.yml中声明主机变量)。您应该read the doc about inventories熟悉这些概念。