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 环境应使用其 AWXBackup、AWXRestore 资源及对应角色进行备份和恢复,不要套用旧 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 实例
删除名为 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 restart3.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_versionfatal: [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