如何向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
相关产品推荐
相关产品推荐

