【问题标题】:Ansible "item is undefined" when using {{ item }} in "vars" section在“vars”部分使用 {{ item }} 时,Ansible“项目未定义”
【发布时间】:2021-05-19 07:33:08
【问题描述】:

我有一些类似下面的代码,我想迭代 groups['A'] 和 groups['B'] 中的每个主机来创建组。

- name: Create a group
  group:
    name: "test_group"
    state: "present"
  delegate_to: "{{ item }}"
  vars:
    ansible_ssh_user: "{{ lookup('env', 'USER') }}@user@{{ item }}"
  with_items:
    - "{{ groups['A'] }}"
    - "{{ groups['B'] }}"

因为我想修改 ansible ssh 连接用户以连接到“delegate_to”主机,所以我在这个任务中覆盖了 ansible_ssh_user,但是它不起作用并给我类似的错误消息

失败了! => {"msg": "'item' 未定义"}

但是如果我注释掉

vars:
    ansible_ssh_user: "{{ lookup('env', 'USER') }}@user@{{ item }}"

没有错误。

【问题讨论】:

    标签: ansible


    【解决方案1】:

    尝试将 var 更改为:

     ansible_ssh_user: "{{ lookup('env', 'USER') }}@user@{{ ansible_hostname }}
    

    这对我来说很好用:

    - name: 'install public key on every server'
      authorized_key:
        user: '{{ myuser}}'
        key: "{{ myuser.ssh_public_key }}"
      delegate_to: '{{ item }}'
      with_items:
        - '{{ groups["A"] }}'
        - '{{ groups["B"] }}'
        - '{{ groups["C"] }}'
    

    也许你可以试试 但在我委托一个 set_fact 并在本地恢复它之前......

    【讨论】:

    • 不幸的是......它不起作用。因为这个播放任务的主机不同于 group['A'] 和 group['B']。因此,“ansible_hostname”的变量仍然指向库存主机名,而不是我在任务中使用“with_items”函数委托给的主机。
    【解决方案2】:

    最后,我找到了一个解决方法,它涉及我需要在我的剧本中使用的所有组。 并使用“何时”条件,如

    delegate_to: "{{ item }}"
    with_items:
      - "{{ groups['A'] }}"
      - "{{ groups['B'] }}"
    when: "inventory_hostname == item"
    

    让任务仅在“with_items”部分中提到的主机上运行。

    这不是一个很酷的解决方法,但对我有用... 感谢您关注这个问题!

    【讨论】:

      猜你喜欢
      • 2017-07-03
      • 2021-03-24
      • 2020-02-03
      • 1970-01-01
      • 2020-04-21
      • 2022-06-20
      • 2016-05-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多