欢迎访问宙启技术站
智能推送

AnsibleModule()的常见用法及其实践示例

发布时间:2024-01-04 04:07:34

AnsibleModule()是Ansible中用于编写自定义模块的Python类。它提供了许多方法和属性,用于获取和处理Ansible控制节点传递给模块的参数,并返回结果给Ansible。

常见用法及实践示例如下:

1. 定义模块元数据:在使用AnsibleModule()时,首先需要定义模块的元数据,包括模块的名称、作者、描述、版本等信息。示例代码如下:

from ansible.module_utils.basic import AnsibleModule

module_args = {
    'name': {'type': 'str', 'required': True},
    'age': {'type': 'int', 'required': False, 'default': 18},
}

module = AnsibleModule(
    argument_spec=module_args,
    supports_check_mode=True
)

def main():
    # 模块的主要逻辑代码

if __name__ == '__main__':
    main()

2. 获取参数值:使用module.params属性可以获取Ansible传递给模块的参数值。示例代码如下:

name = module.params['name']
age = module.params['age']

3. 处理模块的核心逻辑:在main()函数内处理模块的核心逻辑。根据传入的参数执行相应的操作,并使用module.exit_json()返回执行结果给Ansible。示例代码如下:

def main():
    name = module.params['name']
    age = module.params['age']

    if age >= 18:
        result = {'name': name, 'msg': 'You are an adult.'}
    else:
        result = {'name': name, 'msg': 'You are a minor.'}

    module.exit_json(changed=False, **result)

4. 错误处理:如果模块执行过程中发生错误,可以使用module.fail_json()方法返回错误信息给Ansible。示例代码如下:

def main():
    try:
        # 模块的主要逻辑代码
    except Exception as e:
        module.fail_json(msg=f'An error occurred: {str(e)}')

5. 使用示例:

编写一个自定义模块,用于获取主机的IP地址并返回给Ansible。示例代码如下:

import subprocess
import re
from ansible.module_utils.basic import AnsibleModule

def get_ip():
    result = subprocess.run(['hostname', '-I'], capture_output=True, text=True)
    if result.returncode == 0:
        ip_address = re.findall(r'\d+\.\d+\.\d+\.\d+', result.stdout)
        return ip_address[0]
    else:
        raise Exception(result.stderr)

def main():
    module = AnsibleModule(
        argument_spec={},
        supports_check_mode=True
    )

    try:
        ip_address = get_ip()
        module.exit_json(changed=False, ip_address=ip_address)
    except Exception as e:
        module.fail_json(msg=str(e))

if __name__ == '__main__':
    main()

使用该自定义模块,可以通过以下Ansible任务获取主机的IP地址:

- name: Get IP address
  mymodule:
  register: result

- debug:
    var: result['ip_address']