Ansible set_fact 根本无法完成我的任务

Ansible set_fact not working at all for my task

$ ansible --version
ansible 2.10.8

我认为这是与 不同的问题。

我在 group_vars/all.yml

中定义了以下变量
nexus_repo = "dev_builds"
nexus_url = "https://nexus.company.com/{{ nexus_repo }}"

然后在我的一项任务中,我做了

- name: Adjust nexus_repo value for release builds
  set_fact:
    nexus_repo: "release_builds"
    nexus_url: "https://nexus.company.com/{{ nexus_repo }}"

- debug: msg="{{ nexus_url }}"

当我 运行 我的剧本 (my-playbook.yml 运行s my-role.yml), 我只看到

$ ansible-playbook -i inverntories/hosts.yml -e var_hosts=my-host my-playbook.yml

TASK [my-role : Adjust nexus_repo value for release builds] ****************
ok: [10.227.x.x]

TASK [my-role : debug] *****************************************************
ok: [10.227.x.x] => {
    "msg": "https://nexus.mycompany.com/repository/dev_builds"
}

这是为什么?

问题是您不能 re-use 在同一个 set_fact 中声明的变量。例如,如果变量 nexus_reponexus_url 中首次声明set_fact 下面。任务

    - set_fact:
        nexus_repo: release_builds
        nexus_url: "https://nexus.company.com/{{ nexus_repo }}"

会失败,因为 nexus_url 不能使用上一行声明的 next_repo:

The task includes an option with an undefined variable. The error was: 'nexus_repo' is undefined

这解释了您在使用 group_vars/all.yml 时看到的 'strange' 行为

shell> cat group_vars/all.yml
nexus_repo: dev_builds
nexus_url: "https://nexus.company.com/{{ nexus_repo }}"

下面的set_fact会用到变量dev_builds的值nexus_repo 来自 group_vars/all.yml 评估 nexus_url

    - set_fact:
        nexus_repo: release_builds
        nexus_url: "https://nexus.company.com/{{ nexus_repo }}"
    - debug:
        var: nexus_url

给予

  nexus_url: https://nexus.company.com/dev_builds

关于如何修复它有更多选项。例如,不要将同一个变量 nexus_url 声明两次

    - set_fact:
        nexus_repo: release_builds
    - debug:
        var: nexus_url

给予

  nexus_url: https://nexus.company.com/release_builds

如果你必须声明nexus_url new 把它放到单独的set_fact。例如,下面的任务给出相同的结果

    - set_fact:
        nexus_repo: release_builds
    - set_fact:
        nexus_url: "https://nexus.company.com/{{ nexus_repo }}"
    - debug:
        var: nexus_url

查看 Ansible 问题 Can't reference a dict key inside the same dict #50280