Ansible Tower 3.8.3 破解

网上溜了半天没找到这个版本的破解方法,之前的办法都已经无效,自己琢磨了一下发现还是很好搞的。

Environment

OS: CentOS Linux release 7.9.2009 (Core)
Ansible Tower: 3.8.3

不要用于商业环境,律师函警告


先来个效果图:


步骤简述:

  1. 安装Ansible Tower,以setup.sh执行成功且完毕为开始
  2. 修改licensing.py文件
  3. 运行”ansible-tower-service restart”重启服务
  4. Enjoy it

btw:不需要去官网申请Trial License


1. 安装

没什么好说的,setup.sh执行完了且不报错即可。说人话就是页面可以正常打开,没有任何报错。

2. 修改licensing.py文件

该文件位于:

/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/utils/licensing.py

该文件内的方法是负责License验证的核心,将其用你熟悉的编辑器打开

找到validate方法,该方法就负责License的验证,在我这其位于该文件的409行。行数可能随着版本的升级或修改不一定准确,以方法名为主。

该方法原文如下:

    def validate(self):
        # Return license attributes with additional validation info.
        attrs = copy.deepcopy(self._attrs)
        type = attrs.get('license_type', 'none')

        if (type == 'UNLICENSED' or False):
            attrs.update(dict(valid_key=False, compliant=False))
            return attrs
        attrs['valid_key'] = True
        if Host:
            current_instances = Host.objects.active_count()
        else:
            current_instances = 0
        available_instances = int(attrs.get('instance_count', None) or 0)
        attrs['current_instances'] = current_instances
        attrs['available_instances'] = available_instances
        free_instances = (available_instances - current_instances)
        attrs['free_instances'] = max(0, free_instances)

        license_date = int(attrs.get('license_date', 0) or 0)
        current_date = int(time.time())
        time_remaining = license_date - current_date
        attrs['time_remaining'] = time_remaining
        if attrs.setdefault('trial', False):
            attrs['grace_period_remaining'] = time_remaining
        else:
            attrs['grace_period_remaining'] = (license_date + 2592000) - current_date
        attrs['compliant'] = bool(time_remaining > 0 and free_instances >= 0)
        attrs['date_warning'] = bool(time_remaining < self.SUBSCRIPTION_TIMEOUT)
        attrs['date_expired'] = bool(time_remaining <= 0)
        return attrs

将其改成这个样子即可:

    def validate(self):
        # Return license attributes with additional validation info.
        attrs = copy.deepcopy(self._attrs)

        attrs['license_type'] = 'enterprise' # 设置License类型为企业版
        attrs['instance_count'] = MAX_INSTANCES # 设置Host数量为MAX_INSTANCES,即9999999。扛不住就改成自己需要的数。
        attrs['license_date'] = '2567433600' # 设置License过期日期为”2051-05-12 00:00:00“,Unix时间戳,有需要自己改
        attrs['subscription_name'] = 'mxd' # 你猜

        type = attrs.get('license_type', 'none')

        # 注释掉下面的判断
        #if (type == 'UNLICENSED' or False):
            #attrs.update(dict(valid_key=False, compliant=False))
            #return attrs
        attrs['valid_key'] = True # 直接将 valid_key 设为 true
        if Host:
            current_instances = Host.objects.active_count()
        else:
            current_instances = 0
        available_instances = int(attrs.get('instance_count', None) or 0)
        attrs['current_instances'] = current_instances
        attrs['available_instances'] = available_instances
        free_instances = (available_instances - current_instances)
        attrs['free_instances'] = max(0, free_instances)

        license_date = int(attrs.get('license_date', 0) or 0)
        current_date = int(time.time())
        time_remaining = license_date - current_date
        attrs['time_remaining'] = time_remaining
        if attrs.setdefault('trial', False):
            attrs['grace_period_remaining'] = time_remaining
        else:
            attrs['grace_period_remaining'] = (license_date + 2592000) - current_date
        attrs['compliant'] = bool(time_remaining > 0 and free_instances >= 0)
        attrs['date_warning'] = bool(time_remaining < self.SUBSCRIPTION_TIMEOUT)
        attrs['date_expired'] = bool(time_remaining <= 0)
        return attrs

3. 运行”ansible-tower-service restart”重启服务

ansible-tower-service restart

4. Enjoy it