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_repo 和 nexus_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。
$ 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_repo 和 nexus_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。