如何创建支持变量透传的Ansible任务封装(类Python *args/**kwargs)
Ansible任务封装实现类似Python *args/**kwargs的变量透传
要实现无需显式声明所有模块变量的任务封装,有两种简洁的方案可以达到类似Python **kwargs的参数透传效果:
方案一:使用统一参数字典传递(推荐)
将需要传递给community.general.pipx的所有参数打包成一个字典变量,在封装任务中直接引用该字典即可:
调用方playbook.yml
- hosts: all tasks: - name: Install ansible with sudo pipx include_tasks: my_custom_sudo_pipx.yml vars: pipx_params: name: ansible state: present install_deps: true
封装任务my_custom_sudo_pipx.yml
- name: Sudo pipx become: yes environment: PIPX_HOME: /opt/pipx PIPX_BIN_DIR: /usr/local/bin community.general.pipx: "{{ pipx_params }}"
这种方式清晰可控,能明确传递的参数范围,避免意外传入无关变量引发模块报错。
方案二:自动透传所有传入变量
利用Ansible内置变量ansible_included_var_names(Ansible 2.8+支持),自动收集通过vars传入的所有变量并转换为字典,直接传递给模块,完全无需手动声明参数:
调用方playbook.yml(和你期望的写法完全一致)
- hosts: all tasks: - name: Install ansible with sudo pipx include_tasks: my_custom_sudo_pipx.yml vars: name: ansible state: present install_deps: true
封装任务my_custom_sudo_pipx.yml
- name: Sudo pipx become: yes environment: PIPX_HOME: /opt/pipx PIPX_BIN_DIR: /usr/local/bin community.general.pipx: >- {{ ansible_included_var_names | map('extract', vars) | zip(ansible_included_var_names) | items2dict }}
说明
ansible_included_var_names会返回当前include_tasks调用时通过vars传入的所有变量名列表- 后续的过滤器链将这些变量名对应的取值提取出来,再重新组合成符合模块要求的参数字典
注意事项
- 确保传入的所有变量都是
community.general.pipx模块支持的参数,否则模块会抛出参数无效的错误 - 需确认你的Ansible版本在2.8及以上,否则
ansible_included_var_names变量不可用
内容的提问来源于stack exchange,提问作者Susensio
相关产品推荐
相关产品推荐

