mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
commit
8f2e4ef0cf
@ -1,279 +0,0 @@
|
||||
[#]: subject: "How to Install Ansible AWX on Kubernetes Cluster"
|
||||
[#]: via: "https://www.linuxtechi.com/install-ansible-awx-on-kubernetes-cluster/"
|
||||
[#]: author: "Pradeep Kumar https://www.linuxtechi.com/author/pradeep/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
How to Install Ansible AWX on Kubernetes Cluster
|
||||
======
|
||||
|
||||
In this post, we will show you how to install Ansible AWX on Kubernetes (k8s) cluster step by step.
|
||||
|
||||
Ansible AWX is a powerful open-source tool for managing and automating IT infrastructure. AWX provides a graphical user interface for Ansible, allowing you to easily create, schedule, and run Ansible playbooks.
|
||||
|
||||
Kubernetes, on the other hand, is a popular container orchestration platform that is widely used for deploying and managing containerized applications.
|
||||
|
||||
##### Prerequisites
|
||||
|
||||
- Kubernetes cluster
|
||||
- Kubectl
|
||||
- A regular user with sudo rights and cluster admin rights
|
||||
- Internet connectivity
|
||||
|
||||
### Step :1 Install helm
|
||||
|
||||
In case you, helmis installed on your system then run beneath commands to install,
|
||||
|
||||
```
|
||||
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
|
||||
$ chmod +x get_helm.sh
|
||||
$ ./get_helm.sh
|
||||
$ helm version
|
||||
```
|
||||
|
||||
![Install-helm-linux-command-line][1]
|
||||
|
||||
### Step 2: Install the AWX chart
|
||||
|
||||
The easiest way to install AWX on Kubernetes is by using the AWX Helm chart. So, to install AWX via chart, first add its repository using following helm command.
|
||||
|
||||
```
|
||||
$ helm repo add awx-operator https://ansible.github.io/awx-operator/
|
||||
"awx-operator" has been added to your repositories
|
||||
$
|
||||
```
|
||||
|
||||
Note: If you had already added this repository before, then run beneath command to get latest version of packages.
|
||||
|
||||
```
|
||||
$ helm repo update
|
||||
```
|
||||
|
||||
To install awx-operator via chart, run
|
||||
|
||||
```
|
||||
$ helm install ansible-awx-operator awx-operator/awx-operator -n awx --create-namespace
|
||||
```
|
||||
|
||||
![helm-install-awx-operator-kubernetes][2]
|
||||
|
||||
This will download the AWX chart and install it on your Kubernetes cluster in awx namespace.The installation process may take a few minutes, so be patient.
|
||||
|
||||
### Step 3: Verify AWX operator installation
|
||||
|
||||
After the successful installation, you can verify AWX operator status by running below command
|
||||
|
||||
```
|
||||
$ sudo kubectl get pods -n awx
|
||||
```
|
||||
|
||||
You should see something like this:
|
||||
|
||||
![awx-operator-pod-status-kubectl][3]
|
||||
|
||||
### Step:4 Create PV, PVC and deploy AWX yaml file
|
||||
|
||||
AWX requires persistent volume for postgres pod. So, let’s first create a storage class for local volume
|
||||
|
||||
Note: In this post, I am using local file system as persistent volume.
|
||||
|
||||
```
|
||||
$ vi local-storage-class.yaml
|
||||
apiVersion: storage.k8s.io/v1
|
||||
kind: StorageClass
|
||||
metadata:
|
||||
name: local-storage
|
||||
namespace: awxprovisioner: kubernetes.io/no-provisioner
|
||||
volumeBindingMode: WaitForFirstConsumer
|
||||
```
|
||||
|
||||
Save and close the file and then run ,
|
||||
|
||||
```
|
||||
$ kubectl create -f local-storage-class.yaml
|
||||
$ kubectl get sc -n awx
|
||||
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION
|
||||
local-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false
|
||||
$
|
||||
```
|
||||
|
||||
Next create persistent volume(pv) using following pv.yaml file,
|
||||
|
||||
```
|
||||
$ vi pv.yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: postgres-pv
|
||||
namespace: awx
|
||||
spec:
|
||||
capacity:
|
||||
storage: 10Gi
|
||||
volumeMode: Filesystem
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
persistentVolumeReclaimPolicy: Delete
|
||||
storageClassName: local-storage
|
||||
local:
|
||||
path: /mnt/storage
|
||||
nodeAffinity:
|
||||
required:
|
||||
nodeSelectorTerms:
|
||||
- matchExpressions:
|
||||
- key: kubernetes.io/hostname
|
||||
operator: In
|
||||
values:
|
||||
- k8s-worker
|
||||
```
|
||||
|
||||
Save & exit the file.
|
||||
|
||||
![Postgres-pv-awx-kubernetes][4]
|
||||
|
||||
Important note : Make sure folder “/mnt/storage” exists on worker node, if it does not exist then create it using mkdir command on worker node. In our case worker node is “k8s-worker”
|
||||
|
||||
Execute the beneath command to create postgres-pv in awx namespace.
|
||||
|
||||
```
|
||||
$ kubectl create -f pv.yaml
|
||||
```
|
||||
|
||||
Once pv is created successfully then create persistentvolumecliam using pvc.yaml file,
|
||||
|
||||
```
|
||||
$ vi pvc.yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: postgres-13-ansible-awx-postgres-13-0
|
||||
namespace: awx
|
||||
spec:
|
||||
storageClassName: local-storage
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
```
|
||||
|
||||
![posgres-pvc-awx-kubernetes][5]
|
||||
|
||||
To create pvc, run following kubectl command
|
||||
|
||||
```
|
||||
$ kubectl create -f pvc.yaml
|
||||
```
|
||||
|
||||
Verify the status of pv and pvc using beneath command
|
||||
|
||||
```
|
||||
$ kubectl get pv,pvc -n awx
|
||||
```
|
||||
|
||||
Now, we are all set to deploy AWX instance. Create an ansible-awx.yaml file with following content
|
||||
|
||||
```
|
||||
$ vi ansible-awx.yaml
|
||||
---
|
||||
apiVersion: awx.ansible.com/v1beta1
|
||||
kind: AWX
|
||||
metadata:
|
||||
name: ansible-awx
|
||||
namespace: awx
|
||||
spec:
|
||||
service_type: nodeport
|
||||
postgres_storage_class: local-storage
|
||||
```
|
||||
|
||||
![Ansible-awx-yaml-file][6]
|
||||
|
||||
save and close the file.
|
||||
|
||||
Execute following kubectl command to deploy awx instance,
|
||||
|
||||
```
|
||||
$ kubectl create -f ansible-awx.yaml
|
||||
```
|
||||
|
||||
Wait for couple of minutes and then check pods status in awx namespace.
|
||||
|
||||
```
|
||||
$ kubectl get pods -n awx
|
||||
```
|
||||
|
||||
![Ansible-AWX-Pods-Status-Kubernetes][7]
|
||||
|
||||
### Step 5: Access AWX Web Interface
|
||||
|
||||
To access the AWX web interface, you need to create a service that exposes the awx-web deployment:
|
||||
|
||||
```
|
||||
$ kubectl expose deployment ansible-awx-web --name ansible-awx-web-svc --type NodePort -n awx
|
||||
```
|
||||
|
||||
This command will create a NodePort service that maps the AWX web container’s port to a port on the Kubernetes node. You can find the port number by running:
|
||||
|
||||
```
|
||||
$ kubectl get svc ansible-awx-web-svc -n awx
|
||||
```
|
||||
|
||||
This will output something like this:
|
||||
|
||||
```
|
||||
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
||||
ansible-awx-web-svc NodePort 10.99.83.248 <none> 8052:32254/TCP 82s
|
||||
```
|
||||
|
||||
In this example, the web service is available on port 32254.
|
||||
|
||||
![Expose-Ansible-AWX-Web-NodePort-Kubernetes][8]
|
||||
|
||||
By default, the admin user is admin for web interface and the password is available in the <resourcename>-admin-password secret. To retrieve the admin password, run
|
||||
|
||||
```
|
||||
$ kubectl get secrets -n awx | grep -i admin-password
|
||||
ansible-awx-admin-password Opaque 1 109m
|
||||
$
|
||||
$ kubectl get secret ansible-awx-admin-password -o jsonpath="{.data.password}" -n awx | base64 --decode ; echo
|
||||
l9mWcIOXQhSKnzZQyQQ9LZf3awDV0YMJ
|
||||
$
|
||||
```
|
||||
|
||||
You can now access the AWX web interface by opening a web browser and navigating to `http://<node-ip>:<node-port>/`. In the example above, the URL would be
|
||||
|
||||
http://192.168.1.223:3225
|
||||
|
||||
![AWX-Login-URL-Kubernetes][9]
|
||||
|
||||
Click on Log In after entering the credentials.
|
||||
|
||||
![Ansible-AWX-Web-Dashboard][10]
|
||||
|
||||
Congratulations! You have successfully installed Ansible AWX on Kubernetes. You can now use AWX to automate your IT infrastructure and make your life as a sysadmin easier.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linuxtechi.com/install-ansible-awx-on-kubernetes-cluster/
|
||||
|
||||
作者:[Pradeep Kumar][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.linuxtechi.com/author/pradeep/
|
||||
[b]: https://github.com/lkxed/
|
||||
[1]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Install-helm-linux-command-line.png?ezimgfmt=rs%3Adevice%2Frscb22-1
|
||||
[2]: https://www.linuxtechi.com/wp-content/uploads/2023/05/helm-install-awx-operator-kubernetes.png
|
||||
[3]: https://www.linuxtechi.com/wp-content/uploads/2023/05/awx-operator-pod-status-kubectl.png
|
||||
[4]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Postgres-pv-awx-kubernetes.png
|
||||
[5]: https://www.linuxtechi.com/wp-content/uploads/2023/05/posgres-pvx-awx-kubernetes.png
|
||||
[6]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Ansible-awx-yaml-file.png
|
||||
[7]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Ansible-AWX-Pods-Status-Kubernetes.png
|
||||
[8]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Expose-Ansible-AWX-Web-NodePort-Kubernetes.png
|
||||
[9]: https://www.linuxtechi.com/wp-content/uploads/2023/05/AWX-Login-URL-Kubernetes.png
|
||||
[10]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Ansible-AWX-Web-Dashboard.png
|
@ -0,0 +1,279 @@
|
||||
[#]: subject: "How to Install Ansible AWX on Kubernetes Cluster"
|
||||
[#]: via: "https://www.linuxtechi.com/install-ansible-awx-on-kubernetes-cluster/"
|
||||
[#]: author: "Pradeep Kumar https://www.linuxtechi.com/author/pradeep/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
如何在 Kubernetes 集群上安装 Ansible AWX
|
||||
======
|
||||
|
||||
在本文中,我们将逐步向你展示如何在 Kubernetes (k8s) 集群上安装 Ansible AWX。
|
||||
|
||||
Ansible AWX 是一个强大的开源工具,用于管理和自动化 IT 基础设施。AWX 为 Ansible 提供图形用户界面,使你可以轻松创建、安排和运行 Ansible playbook。
|
||||
|
||||
另一方面,Kubernetes 是一种流行的容器编排平台,广泛用于部署和管理容器化应用。
|
||||
|
||||
##### 先决条件
|
||||
|
||||
- Kubernetes 集群
|
||||
- Kubectl
|
||||
- 具有 sudo 权限和集群管理员权限的普通用户
|
||||
- 互联网连接
|
||||
|
||||
### 步骤 1:安装 helm
|
||||
|
||||
如果你的系统上安装了 helm,则在命令下运行以进行安装,
|
||||
|
||||
```
|
||||
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
|
||||
$ chmod +x get_helm.sh
|
||||
$ ./get_helm.sh
|
||||
$ helm version
|
||||
```
|
||||
|
||||
![Install-helm-linux-command-line][1]
|
||||
|
||||
### 步骤 2:安装 AWX chart
|
||||
|
||||
在 Kubernetes 上安装 AWX 的最简单方法是使用 AWX Helm chart。因此,要通过 chart 安装 AWX,首先使用以下 helm 命令添加仓库。
|
||||
|
||||
```
|
||||
$ helm repo add awx-operator https://ansible.github.io/awx-operator/
|
||||
"awx-operator" has been added to your repositories
|
||||
$
|
||||
```
|
||||
|
||||
注意:如果你之前已经添加过此仓库,请在命令下运行以获取最新版本的软件包。
|
||||
|
||||
```
|
||||
$ helm repo update
|
||||
```
|
||||
|
||||
要通过 chrt 安装 awx-operator,请运行:
|
||||
|
||||
```
|
||||
$ helm install ansible-awx-operator awx-operator/awx-operator -n awx --create-namespace
|
||||
```
|
||||
|
||||
![helm-install-awx-operator-kubernetes][2]
|
||||
|
||||
这将下载 AWX chart 并将其安装在 awx 命名空间中的 Kubernetes 集群上。安装过程可能需要几分钟,请耐心等待。
|
||||
|
||||
### 步骤 3:验证 AWX operator 安装
|
||||
|
||||
安装成功后,你可以通过运行以下命令来验证 AWX operator 状态:
|
||||
|
||||
```
|
||||
$ sudo kubectl get pods -n awx
|
||||
```
|
||||
|
||||
你应该看到这样的东西:
|
||||
|
||||
![awx-operator-pod-status-kubectl][3]
|
||||
|
||||
### 步骤 4: 创建 PV、PVC 并部署 AWX yaml 文件
|
||||
|
||||
AWX 需要 postgres pod 的持久卷。那么,让我们首先为本地卷创建一个存储类。
|
||||
|
||||
注意:在本文中,我使用本地文件系统作为持久卷。
|
||||
|
||||
```
|
||||
$ vi local-storage-class.yaml
|
||||
apiVersion: storage.k8s.io/v1
|
||||
kind: StorageClass
|
||||
metadata:
|
||||
name: local-storage
|
||||
namespace: awxprovisioner: kubernetes.io/no-provisioner
|
||||
volumeBindingMode: WaitForFirstConsumer
|
||||
```
|
||||
|
||||
保存并关闭文件,然后运行:
|
||||
|
||||
```
|
||||
$ kubectl create -f local-storage-class.yaml
|
||||
$ kubectl get sc -n awx
|
||||
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION
|
||||
local-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false
|
||||
$
|
||||
```
|
||||
|
||||
接下来使用以下 pv.yaml 文件创建持久卷 (pv):
|
||||
|
||||
```
|
||||
$ vi pv.yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: postgres-pv
|
||||
namespace: awx
|
||||
spec:
|
||||
capacity:
|
||||
storage: 10Gi
|
||||
volumeMode: Filesystem
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
persistentVolumeReclaimPolicy: Delete
|
||||
storageClassName: local-storage
|
||||
local:
|
||||
path: /mnt/storage
|
||||
nodeAffinity:
|
||||
required:
|
||||
nodeSelectorTerms:
|
||||
- matchExpressions:
|
||||
- key: kubernetes.io/hostname
|
||||
operator: In
|
||||
values:
|
||||
- k8s-worker
|
||||
```
|
||||
|
||||
保存并退出文件。
|
||||
|
||||
![Postgres-pv-awx-kubernetes][4]
|
||||
|
||||
重要说明:确保文件夹 “/mnt/storage” 存在于工作节点上,如果不存在,则在工作节点上使用 mkdir 命令创建它。在我们的例子中,工作节点是 “k8s-worker”。
|
||||
|
||||
执行下面的命令在 awx 命名空间中创建 postgres-pv。
|
||||
|
||||
```
|
||||
$ kubectl create -f pv.yaml
|
||||
```
|
||||
|
||||
成功创建 pv 后,使用 pvc.yaml 文件创建 persistentvolumecliam:
|
||||
|
||||
```
|
||||
$ vi pvc.yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: postgres-13-ansible-awx-postgres-13-0
|
||||
namespace: awx
|
||||
spec:
|
||||
storageClassName: local-storage
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
```
|
||||
|
||||
![posgres-pvc-awx-kubernetes][5]
|
||||
|
||||
要创建 PVC,请运行以下 kubectl 命令:
|
||||
|
||||
```
|
||||
$ kubectl create -f pvc.yaml
|
||||
```
|
||||
|
||||
使用下面的命令验证 pv 和 pvc 的状态:
|
||||
|
||||
```
|
||||
$ kubectl get pv,pvc -n awx
|
||||
```
|
||||
|
||||
现在,我们都准备好部署 AWX 实例了。创建一个包含以下内容的 ansible-awx.yaml 文件:
|
||||
|
||||
```
|
||||
$ vi ansible-awx.yaml
|
||||
---
|
||||
apiVersion: awx.ansible.com/v1beta1
|
||||
kind: AWX
|
||||
metadata:
|
||||
name: ansible-awx
|
||||
namespace: awx
|
||||
spec:
|
||||
service_type: nodeport
|
||||
postgres_storage_class: local-storage
|
||||
```
|
||||
|
||||
![Ansible-awx-yaml-file][6]
|
||||
|
||||
保存并关闭文件。
|
||||
|
||||
执行以下 kubectl 命令来部署 awx 实例:
|
||||
|
||||
```
|
||||
$ kubectl create -f ansible-awx.yaml
|
||||
```
|
||||
|
||||
等待几分钟,然后检查 awx 命名空间中的 pod 状态。
|
||||
|
||||
```
|
||||
$ kubectl get pods -n awx
|
||||
```
|
||||
|
||||
![Ansible-AWX-Pods-Status-Kubernetes][7]
|
||||
|
||||
### 步骤 5:访问 AWX Web 界面
|
||||
|
||||
要访问 AWX Web 界面,你需要创建一个公开 awx-web 部署的服务:
|
||||
|
||||
```
|
||||
$ kubectl expose deployment ansible-awx-web --name ansible-awx-web-svc --type NodePort -n awx
|
||||
```
|
||||
|
||||
此命令将创建一个 NodePort 服务,该服务将 AWX Web 容器的端口映射到 Kubernetes 节点上的端口。你可以通过运行以下命令找到端口号:
|
||||
|
||||
```
|
||||
$ kubectl get svc ansible-awx-web-svc -n awx
|
||||
```
|
||||
|
||||
这将输出如下内容:
|
||||
|
||||
```
|
||||
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
||||
ansible-awx-web-svc NodePort 10.99.83.248 <none> 8052:32254/TCP 82s
|
||||
```
|
||||
|
||||
在此示例中,Web 服务在端口 32254 上可用。
|
||||
|
||||
![Expose-Ansible-AWX-Web-NodePort-Kubernetes][8]
|
||||
|
||||
默认情况下,admin 用户是 Web 界面的 admin,密码在 <resourcename>-admin-password secret 中。要检索管理员密码,请运行:
|
||||
|
||||
```
|
||||
$ kubectl get secrets -n awx | grep -i admin-password
|
||||
ansible-awx-admin-password Opaque 1 109m
|
||||
$
|
||||
$ kubectl get secret ansible-awx-admin-password -o jsonpath="{.data.password}" -n awx | base64 --decode ; echo
|
||||
l9mWcIOXQhSKnzZQyQQ9LZf3awDV0YMJ
|
||||
$
|
||||
```
|
||||
|
||||
你现在可以打开 Web 浏览器并进入 `http://<node-ip>:<node-port>/` 来访问 AWX Web 界面。在上面的示例中,URL 是:
|
||||
|
||||
http://192.168.1.223:3225
|
||||
|
||||
![AWX-Login-URL-Kubernetes][9]
|
||||
|
||||
输入凭据后单击登录。
|
||||
|
||||
![Ansible-AWX-Web-Dashboard][10]
|
||||
|
||||
恭喜! 你已在 Kubernetes 上成功安装 Ansible AWX。你现在可以使用 AWX 来自动化你的 IT 基础架构,并让你作为系统管理员的生活更轻松。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linuxtechi.com/install-ansible-awx-on-kubernetes-cluster/
|
||||
|
||||
作者:[Pradeep Kumar][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.linuxtechi.com/author/pradeep/
|
||||
[b]: https://github.com/lkxed/
|
||||
[1]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Install-helm-linux-command-line.png?ezimgfmt=rs%3Adevice%2Frscb22-1
|
||||
[2]: https://www.linuxtechi.com/wp-content/uploads/2023/05/helm-install-awx-operator-kubernetes.png
|
||||
[3]: https://www.linuxtechi.com/wp-content/uploads/2023/05/awx-operator-pod-status-kubectl.png
|
||||
[4]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Postgres-pv-awx-kubernetes.png
|
||||
[5]: https://www.linuxtechi.com/wp-content/uploads/2023/05/posgres-pvx-awx-kubernetes.png
|
||||
[6]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Ansible-awx-yaml-file.png
|
||||
[7]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Ansible-AWX-Pods-Status-Kubernetes.png
|
||||
[8]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Expose-Ansible-AWX-Web-NodePort-Kubernetes.png
|
||||
[9]: https://www.linuxtechi.com/wp-content/uploads/2023/05/AWX-Login-URL-Kubernetes.png
|
||||
[10]: https://www.linuxtechi.com/wp-content/uploads/2023/05/Ansible-AWX-Web-Dashboard.png
|
Loading…
Reference in New Issue
Block a user