Ansible执行yum安装pip时报错dict无法转换为list该如何解决?
问题原因
你当前的写法错误出在:通过loop循环执行set_fact并注册到yum_name变量时,yum_name最终存储的是Ansible循环执行后的返回字典对象,而非你预期的软件包名列表,因此传给yum模块的name参数时会触发类型不匹配报错。
修复方案
这里提供两种可直接落地的实现方式,均不需要单独编写多个安装任务:
方案1:直接在yum任务内循环(更简洁,无需额外定义变量)
直接把版本循环逻辑写在yum安装任务中,不需要单独做变量拼接,代码如下:
vars: python_version: - 3 - 2 tasks: - name: 安装多版本pip软件包 yum: name: "python{{ item }}-pip.noarch" state: present loop: "{{ python_version }}" become: yes
方案2:提前生成包名列表再统一安装
如果你的业务逻辑需要先拼接好所有包名再执行安装,可按如下方式修改,通过列表累加得到符合要求的包名集合:
vars: python_version: - 3 - 2 tasks: - block: - set_fact: yum_name: "{{ yum_name | default([]) + ['python' ~ item ~ '-pip.noarch'] }}" loop: "{{ python_version }}" - name: 安装多版本pip软件包 yum: name: "{{ yum_name }}" state: present become: yes
说明:这种写法会将每次循环生成的包名追加到列表
yum_name中,最终得到的就是符合yum模块要求的包名字符串列表,不会出现类型错误。
内容的提问来源于stack exchange,提问作者hab28dev
相关产品推荐
相关产品推荐

