You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向Ansible自定义模块传递Playbook中的变量参数

问题成因
  • 核心原因是你的自定义模块没有实现Ansible模块的参数接收逻辑:虽然代码导入了AnsibleModule工具类,但既没有初始化实例、也没有定义参数接收规则、更没有读取Playbook传入的参数,调用boto3接口时repositoryName和encryptionConfiguration.kmsKey传的都是硬编码的空字符串,自然会触发boto3的参数长度校验错误,和你Playbook里写固定值还是引用变量无关,传入的参数根本没有被模块代码读取到。
  • 你的第一版Playbook调用还存在YAML语法错误:'my-kms-key-id"使用单引号开头、双引号结尾,会导致YAML解析异常,但这不是本次报错的核心原因。
  • 额外说明:Ansible不会自动识别encryptionConfiguration.kmsKey这类带点的参数名并转成嵌套字典,你在模块里定义参数、Playbook传参时直接用顶层字段即可,不需要写嵌套层级的点路径。
正确实现方式

1. 修正自定义模块代码

你需要通过AnsibleModule类定义参数规范、初始化模块实例自动解析传入参数,再把取到的参数传给boto3接口,同时补充模块成功/失败的退出逻辑,修正后的完整代码如下:

#!/usr/bin/python
import boto3
from ansible.module_utils.basic import AnsibleModule

def run_module():
    # 定义模块支持接收的参数规则
    module_args = dict(
        repositoryName=dict(type='str', required=True),
        kmsKey=dict(type='str', required=True),
        imageTagMutability=dict(type='str', default='IMMUTABLE'),
        scanOnPush=dict(type='bool', default=True)
    )

    # 初始化模块实例,自动解析Playbook传入的所有参数
    module = AnsibleModule(
        argument_spec=module_args,
        supports_check_mode=False
    )

    # 从解析结果中读取参数值
    repo_name = module.params['repositoryName']
    kms_key = module.params['kmsKey']
    tag_mutability = module.params['imageTagMutability']
    scan_on_push = module.params['scanOnPush']

    ecr_client = boto3.client('ecr')
    try:
        response = ecr_client.create_repository(
            repositoryName=repo_name,
            imageTagMutability=tag_mutability,
            imageScanningConfiguration={
                'scanOnPush': scan_on_push
            },
            encryptionConfiguration={
                'encryptionType': 'KMS',
                'kmsKey': kms_key
            }
        )
        # 接口调用成功,标记变更状态并返回结果
        module.exit_json(changed=True, repository=response['repository'])
    except Exception as e:
        # 接口调用失败,返回错误信息
        module.fail_json(msg=f"Create ECR repository failed: {str(e)}")

def main():
    run_module()

if __name__ == '__main__':
    main()

注:原代码中导入的urllib.response、jinja2.Template属于未使用的冗余依赖,直接删除即可。

2. 修正Playbook调用写法

参数名和模块中定义的字段保持一致,修正引号语法错误即可,两种传参方式都可以正常运行:

  • 传固定值写法:
- name: Create repo and use specific KMS key
  ecr_kms:
    repositoryName: "new-ecr-repo"
    kmsKey: "my-kms-key-id"
  • 传变量写法(确保对应变量已提前定义且有有效值):
- name: Create repo and use specific KMS key
  ecr_kms:
    repositoryName: "{{ repo_name }}"
    kmsKey: "{{ kms_key_id }}"

排错提示

如果后续传参仍有异常,可以在执行Playbook时添加-vvv参数,查看Ansible传递给自定义模块的实际参数内容,快速定位传参问题。

内容的提问来源于stack exchange,提问作者GreNIX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 13:42:30