Ansible 远程服务器连接 Internet 测试
阅读原文时间:2023年07月11日阅读:1

Email 连接: lonnyliu@126.com


需求

  在使用Ansible过程中不可避免需要了解远端服务器是否能够联通外网,以便进行在线安装软件或者其他.对于运维人员来说普遍的办法有

  1. 登录到每台服务器进行 ping 测试(基本上这个时候 `www.baidu.com` 派上用场了)
  2. 使用Ansible直接对以定义好的主机进行远端执行shell命令

  以上两种第一种有可能是普遍的方式,第二种有一部分人在使用但也不否定有其他更好的办法

目标

  快速获取远端服务器连接 Internet 情况

实现

1. 配置Ansible 关闭或者使用缓存进行 facts 收集
2. 进行自定义模块进行远端服务器连接 Internet 测试
3. 收集结果结果做后续使用

代码

  • ansible 配置文件

    cat /etc/ansible.cfg

    [defaults]
    hostfile = path # hosts 文件存放位置
    roles_path = path # roles 角色目录存放位置
    library = path # 自定义模块存放问题
    remote_user = root # 远程连接用户
    private_key_file = path # 公钥存放位置
    host_key_checking = False
    deprecation_warnings=False

    配置使用本地 redis 缓存--自行配置

    gathering = smart
    fact_caching = redis
    fact_caching_timeout = 86400
    fact_caching_connection = 127.0.0.1:6379:0:ansiblefact

  • 自定义模块

具体模块介绍请查看官网链接

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author EdwardLiu

"""
检测是否可以连通外网, 使用 url方式, url 为可变参数
"""

from ansible.module_utils.basic import *
import urllib2

def internet_on(url):

    try:

        urllib2.urlopen(url, timeout=1)

        results = {
            'status': 0,
            'messages': "Connection"
        }

        return results

    except urllib2.URLError as err:

        results = {
            'status': 1,
            'messages': "Failed"
        }

        return results

if __name__ == '__main__':
    refactor_module = AnsibleModule(
        argument_spec=dict(
            url=dict(required=True),
        ),
    )

    url = "http://" + refactor_module.params['url']

    if internet_on(url)['status'] == 0:

        result = dict(module='timezone', stdotut=internet_on(url)['messages'], changed=False, rc=0)

        refactor_module.exit_json(**result)

    else:

        result = dict(msg='execute failed', rc=internet_on(url)['status'])

使用介绍

ansible--Ad-Hoc Commands(使用命令行)

  ansible pipeline -m checknetwork -a "url=www.baidu.com"
  pipeline: hosts 文件中组名称
  checknetwork: 自定义模块名称
  url=www.baidu.com 测试外网连接的 URL

效果:

附ansible playbooks使用案例

---
# 判断是否有外网
- name: checkne internet connection
  checknetwork: url={{ check_url }}
  register: result

- debug:
    msg: "System {{ inventory_hostname }} has Connection internet!!!"
  when: result.stdotut == 'Connection'