如何在我的任务中引用remote_tmp
中定义的ansible.cfg
(或任何其他)值?例如,在my_task/defaults/main.yml
:
file_ver: "1.5"
deb_file: "{{ defaults.remote_tmp }}/deb_file_{{ file_ver }}.deb"
产生错误:
fatal: [x.x.x.x]: FAILED! => {"failed": true,
"msg": "the field 'args' has an invalid value,
which appears to include a variable that is undefined.
The error was: {{ defaults.remote_tmp }}/deb_file_{{ file_ver }}.deb:
'defaults' is undefined\... }
答案 0 :(得分:3)
你不能开箱即用。
你需要动作插件或vars插件来读取不同的配置参数
如果您采用动作插件方式,则必须调用新创建的操作以定义remote_tmp
。
如果您选择vars插件方式,则在库存初始化期间使用其他主机变量定义remote_tmp
。
示例./vars_plugins/tmp_dir.py
:
from ansible import constants as C
class VarsModule(object):
def __init__(self, inventory):
pass
def run(self, host, vault_password=None):
return dict(remote_tmp = C.DEFAULT_REMOTE_TMP)
请注意,vars_plugins
文件夹应位于hosts
文件附近,或者您应在ansible.cfg中明确定义它。
您现在可以使用以下方法进行测试:
$ ansible localhost -i hosts -m debug -a "var=remote_tmp"
localhost | SUCCESS => {
"remote_tmp": "$HOME/.ansible/tmp"
}
答案 1 :(得分:0)
您可以使用lookup
。
file_ver: "1.5"
deb_file: "{{ lookup('ini', 'remote_tmp section=defaults file=ansible.cfg' }}/deb_file_{{ file_ver }}.deb"
修改强>
如果您不知道配置文件的路径,可以通过运行以下任务将其设置为事实。
- name: look for ansible.cfg, see http://docs.ansible.com/ansible/intro_configuration.html
local_action: stat path={{ item }}
register: ansible_cfg_stat
when: (item | length) and not (ansible_cfg_stat is defined and ansible_cfg_stat.stat.exists)
with_items:
- "{{ lookup('env', 'ANSIBLE_CONFIG') }}"
- ansible.cfg
- "{{ lookup('env', 'HOME') }}/.ansible.cfg"
- /etc/ansible/ansible.cfg
- name: set fact for later use
set_fact:
ansible_cfg: "{{ item.item }}"
when: item.stat is defined and item.stat.exists
with_items: "{{ ansible_cfg_stat.results }}"
然后你可以写:
file_ver: "1.5"
deb_file: "{{ lookup('ini', 'remote_tmp section=defaults file=' + ansible_cfg) }}/deb_file_{{ file_ver }}.deb"