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'