AWX

AWX 在 Ansible 之上提供 Web 界面、REST API 和任务引擎,是 Red Hat Ansible Automation Platform 的上游项目之一。当前 AWX 与旧版商业产品 Ansible Tower 的部署和管理方式不同,不能混用安装器、服务命令或许可证机制。

当前 AWX

使用 AWX Operator 部署

AWX 官方当前使用 AWX Operator 在 Kubernetes 集群中安装并管理 AWX 实例。开始前需要准备可用的 Kubernetes 集群和 kubectl。安装时应从 AWX Operator Releases 选择明确的版本标签,不要直接假设某个固定版本永远是最新版。

新建 kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - github.com/ansible/awx-operator/config/default?ref=<tag>
  - awx-demo.yml
images:
  - name: quay.io/ansible/awx-operator
    newTag: <tag>
namespace: awx

新建 awx-demo.yml

---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx-demo
spec:
  service_type: nodeport

部署并查看资源:

kubectl apply -k .
kubectl get pods -n awx
kubectl get svc -n awx

查看 Operator 安装过程日志:

kubectl logs -f deployments/awx-operator-controller-manager -c awx-manager -n awx

默认管理员用户名是 admin。未显式指定管理员密码 Secret 时,Operator 会生成 <资源名>-admin-password Secret。示例实例可使用以下命令读取密码:

kubectl get secret awx-demo-admin-password -n awx -o jsonpath="{.data.password}" | base64 --decode; echo

参考资料:

升级与备份注意事项

升级 AWX 前应先备份。AWX Operator 的升级文档明确指出,数据库数据需要与相关 Secret 配套保留;只有数据库备份不足以恢复依赖 Secret 加密的凭据。当前 Operator 环境应使用其 AWXBackupAWXRestore 资源及对应角色进行备份和恢复,不要套用旧 Tower 安装器的 setup.sh 命令。

Operator 版本会映射到相应的 AWX 版本。升级前应核对目标 Operator 镜像中的 DEFAULT_AWX_VERSION

AWX_OPERATOR_VERSION=<tag>
docker run --entrypoint="" quay.io/ansible/awx-operator:$AWX_OPERATOR_VERSION bash -c "env | grep DEFAULT_AWX_VERSION"

更新 kustomization.yaml 中的资源引用和镜像 tag 后,再执行:

kubectl apply -k .

详细步骤参考 AWX Operator 升级文档

排错

AWX 自定义资源状态为 Failed 时,优先查看 Operator 日志,并检查其管理的资源:

kubectl logs deployments/awx-operator-controller-manager -c awx-manager -n awx -f
kubectl get awx,awxbackup,awxrestore,pod,deployment,pvc,service,secrets -n awx
kubectl describe awx awx-demo -n awx

参考 AWX Operator 排错文档

卸载 AWX 实例

删除名为 awx-demo 的 AWX 实例:

kubectl delete awx awx-demo -n awx

删除 AWX 自定义资源会清理相关 Deployment 和 StatefulSet,但持久卷与 Secret 默认会保留。若计划恢复现有数据库,必须保留相应 Secret。具体行为参考 AWX Operator 卸载文档

历史记录:Ansible Tower 3.x

Warning

以下内容针对旧版 Ansible Tower 3.x,不适用于当前 AWX Operator 部署。命令仅作为历史记录保留。

安装

3.5.1版本安装

yum install epel-release -y
yum install ansible -y
 
tar ansible-tower-setup-bundle-3.5.1-1.el7.tar.gz
cd ansible-tower-setup-bundle-3.5.1-1.el7
 
vi inventory # 配置密码
 
mkdir -p /var/lib/awx
 
echo "3.5.1" /var/lib/awx/.tower_version
 
./setup.sh
 

历史下载地址

通过”el7 8 9”来区分不同的系统版本”Centos|RedHat 7 8 9”

wget https://releases.ansible.com/ansible-tower/setup-bundle/ansible-tower-setup-bundle-latest.el7.tar.gz

许可证修改记录(原“破解”)

不同的版本可能破解方式不一样,下面是验证过的版本。如果安装的是其它版本,可以找一找对应版本的破解方法

3.5.1版本

安装转成后执行如下命令

echo $RANDOM > /var/lib/awx/i18n.db
ansible-tower-service restart

3.8.6-2版本

安装完成后到/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/utils目录下找到licensing.py文件,对validate函数进行修改。然后重启服务即可ansible-tower-service restart

...
    def validate(self):
        # Return license attributes with additional validation info.
        attrs = copy.deepcopy(self._attrs)
 
		# 设置License类型为企业版
        attrs['license_type'] = 'enterprise'
 
        # 设置Host数量为MAX_INSTANCES,即9999999。扛不住就改成自己需要的数。
        attrs['instance_count'] = MAX_INSTANCES
 
		# 设置License过期日期为”2051-05-12 00:00:00“,Unix时间戳,有需要自己改
        attrs['license_date'] = '2567433600'
 
	    # 授权者名称
        attrs['subscription_name'] = 'mxd'
 
        type = attrs.get('license_type', 'none')
 
		# 注释掉这个if判断
        # 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

备份/恢复

# 归档,备份配置文件
tar -cf ansible.tar /etc/ansible
tar -cf tower.tar   /etc/tower
# 使用./setup.sh 安装的话可以用下面的命令备份、恢复
./setup.sh -b
./setup.sh -r BACKUP_FILE

使用

ansible-tower-service start
ansible-tower-service status
ansible-tower-service stop
ansible-tower-service restart

删除

ansible-tower-service stop
 
yum remove ansible-tower* rabbitmq-server rh-python36-*
 
rm /etc/profile.d/rh-postgresql10-env.sh
 
rm -rf /etc/ansible
rm -rf /etc/tower
rm -rf /var/lib/pgsql
rm -rf /var/lib/awx
rm -rf /var/lib/rabbitmq
rm -rf /var/opt/rh/rh-postgresql10/lib/pgsql/data

错误处理记录

fatal: [localhost]: FAILED! => {"changed": false, "msg": "file not found: /var/lib/awx/.tower_version"}
mkdir -p /var/lib/awx
 
echo "3.5.1" /var/lib/awx/.tower_version

fatal: [localhost]: FAILED! => {"changed": false, "msg": "Please configure passwords in the inventory file before running setup"}
cd ansible-tower-setup-bundle-3.5.1-1.el7
vi inventory # 配置密码

fatal: [localhost]: FAILED! => {"msg": "Failed to change ownership of the temporary files Ansible needs to create despite connecting as a privileged user. Unprivileged become user would be unable to read the file."}
 
TASK [preflight : Preflight check - check Tower license type]
fatal: [localhost]: FAILED! => {"msg": "Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user (rc: 1, err: chown: invalid user: ‘awx’\n}). For information on working around this, see https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user"}
useradd awx
chown -R awx:awx /var/lib/awx