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']
