如何让Ansible Playbook中的角色可访问ansible_facts?
如何让Ansible Playbook中的角色可访问ansible_facts?
先帮你梳理下问题里的关键细节,再给出针对性的解决办法:
1. 先修正任务里的变量引用错误
你在角色的条件判断里犯了一个容易忽略的小问题:
- 针对RedHat的任务中,你写的是
ansible_facts['distribution']和ansible_facts['distribution_major_version'],但正确的fact名称必须带ansible_前缀,应该是ansible_distribution和ansible_distribution_major_version - 针对Ubuntu的任务中,你混合使用了带前缀的
ansible_facts['ansible_distribution']和不带前缀的ansible_facts['distribution_major_version'],这种不一致也会导致变量未定义报错
修正后的任务代码应该是这样:
--- - name: Debug ansible facts ansible.builtin.debug: msg: "Directory {{ ansible_facts['ansible_distribution_file_variety'] }}" - name: Install CA cert for RedHat 9 systems ansible.builtin.include_tasks: RedHat.yml when: - ansible_facts['ansible_distribution'] == 'RedHat' - ansible_facts['ansible_distribution_major_version'] == '9' - name: Install CA cert for Ubuntu systems ansible.builtin.include_tasks: Ubuntu.yml when: - ansible_facts['ansible_distribution'] == 'Ubuntu' - ansible_facts['ansible_distribution_major_version'] == '22'
2. 确保Facts被正确收集
虽然Ansible默认会在Play启动时自动收集Facts(gather_facts: yes是默认配置),但有时候可能因为全局配置或Playbook设置导致收集失败,你可以做这两步验证:
- 在你的主Playbook里显式声明开启Facts收集:
--- - name: Configure my hosts hosts: all gather_facts: yes vars_files: - default.config.yml roles: - role: myrole - 或者在角色的最开头,强制调用setup模块重新收集Facts:
--- - name: Force gather system facts ansible.builtin.setup: - name: Debug ansible facts ansible.builtin.debug: msg: "Directory {{ ansible_facts['ansible_distribution_file_variety'] }}"
3. 解释你疑惑的“只有Ubuntu任务报错”现象
这是因为你在RedHat的任务里用了错误的变量名ansible_facts['distribution'],这个变量本身不存在,但你是在RedHat主机上测试,这个条件判断会直接返回false,任务根本不会执行,自然不会抛出错误;而Ubuntu的任务中,第一个条件用了正确的变量名,Ansible会尝试评估第二个条件,这时发现ansible_facts['distribution_major_version']不存在,就会触发报错。
按照上面的步骤修正后,你的角色应该就能正常访问ansible_facts里的变量了。
备注:内容来源于stack exchange,提问作者Human
相关产品推荐
相关产品推荐

