How to add a custom logo in AWX top left

Hi,
I am using AWX 24.6.0 and would like to use a custom logo on the top left of the Dashboard.
I was happy this version supports to upload a custom logo, but this only works for the login screen.
I noticed Setting a custom logo doesn't replace AWX logo in top-left of UI · Issue #1316 · ansible/awx · GitHub but was hoping to find a solution here.

Many thanks
Rainer

Hi,

This can be achieved by customizing the AWX CR to mount your images at the path where the default logos are placed.

See Custom Logos section in the Operator docs:

https://ansible.readthedocs.io/projects/awx-operator/en/latest/user-guide/advanced-configuration/custom-volume-and-volume-mount-options.html?h=logo#custom-logos

Hi,
thank you very much.
Unfortunately it doesn’t work for the me, my new *.svg logo isn’t displayed. I fixed errors I noticed with kubectl describe pod awx-webxxxx and saw there are no errors in the log kubectl logs awx-webxxxx.
Are there specific svg format requirements to get it work ? (also tried with *.png without success).

Thanks
Rainer

Please provide how did you configure your AWX CR and result of kubectl describe command

I think I basicly did it like described:

kubectl create configmap iso-logo-header-configmap --from-file iso-logo-header.svg -n awx
kubectl create configmap iso-logo-login-configmap --from-file iso-logo-login.svg -n awx

added this to file awx.yaml

## add custom logos
  extra_volumes: |
    - name: logo-login
      configMap:
        defaultMode: 420
        items:
          - key: iso-logo-login.svg
            path: iso-logo-login.svg
        name: iso-logo-login-configmap
    - name: logo-header
      configMap:
        defaultMode: 420
        items:
          - key: iso-logo-header.svg
            path: iso-logo-header.svg
        name: iso-logo-header-configmap
  web_extra_volume_mounts: |
    - name: logo-login
      mountPath: /home/ansible/awx/awx-on-k3s/mount/iso-logo-login.svg
      subPath: iso-logo-login.svg
    - name: logo-header
      mountPath: /home/ansible/awx/awx-on-k3s/mount/iso-logo-header.svg
      subPath: iso-logo-header.svg

executed:
kubectl apply -f awx.yaml -n awx
awx.awx.ansible.com/awx configured

logo files

ll /home/ansible/awx/awx-on-k3s/mount
total 40
-rw-r-----. 1 ansible ansible 14142 Sep 27 15:31 iso-logo-header.png
-rw-r-----. 1 ansible ansible  2051 Sep 27 18:11 iso-logo-header.svg
-rw-r-----. 1 ansible ansible 14142 Sep 27 15:31 iso-logo-login.png
-rw-r-----. 1 ansible ansible  2051 Sep 27 18:11 iso-logo-login.svg
kubectl describe pods awx-web-5dff48b9db-sfb7d -n awx


Name:             awx-web-5dff48b9db-sfb7d
Namespace:        awx
Priority:         0
Service Account:  awx
Node:             ipsnbg6vm48/10.55.127.85
Start Time:       Mon, 30 Sep 2024 13:12:05 +0200
Labels:           app.kubernetes.io/component=awx
                  app.kubernetes.io/managed-by=awx-operator
                  app.kubernetes.io/name=awx-web
                  app.kubernetes.io/operator-version=2.19.0
                  app.kubernetes.io/part-of=awx
                  app.kubernetes.io/version=24.6.0
                  pod-template-hash=5dff48b9db
Annotations:      checksum-configmaps-config: 416f2808f9764fd68076cf21791805a14c756513
                  checksum-secret-bundle_cacert: da39a3ee5e6b4b0d3255bfef95601890afd80709
                  checksum-secret-ldap_cacert: da39a3ee5e6b4b0d3255bfef95601890afd80709
                  checksum-secret-receptor_ca: b4feee9cb6c2df87d6c9e28ee2d9752ef5f1a926
                  checksum-secret-receptor_work_signing: 5587d2b225e686a6a29b2810a7a6a260f65560e0
                  checksum-secret-route_tls: da39a3ee5e6b4b0d3255bfef95601890afd80709
                  checksum-secret-secret_key: 74ed28c0cff87d66b2b34a8ac215214246af4eb2
                  checksum-secrets-app_credentials: 9eff3e8abdbb683942720b674e2de7b12cbaa284
                  checksum-storage-persistent: adc83b19e793491b1c6ea0fd8b46cd9f32e592fc
                  kubectl.kubernetes.io/default-container: awx-web
Status:           Running
IP:               10.42.0.14
IPs:
  IP:           10.42.0.14
Controlled By:  ReplicaSet/awx-web-5dff48b9db
Init Containers:
  init-projects:
    Container ID:  containerd://199af1b5f8bb9cc49332657c0057eefb67f2830eea7658012b183c7b3e981c16
    Image:         quay.io/centos/centos:stream9
    Image ID:      quay.io/centos/centos@sha256:ac0212d48e014fec37f496485b403453e9e92802e68ee276b749560ea26ddd08
    Port:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
      -c
      chmod 775 /var/lib/awx/projects
      chgrp 1000 /var/lib/awx/projects

    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Mon, 30 Sep 2024 13:12:05 +0200
      Finished:     Mon, 30 Sep 2024 13:12:06 +0200
    Ready:          True
    Restart Count:  0
    Environment:
      MY_POD_NAME:  awx-web-5dff48b9db-sfb7d (v1:metadata.name)
    Mounts:
      /var/lib/awx/projects from awx-projects (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-g5bz7 (ro)
Containers:
  redis:
    Container ID:  containerd://782ced11bff11670ed636269f440b24e9a6111b54c25544afc0dfe0b4636dec6
    Image:         docker.io/redis:7
    Image ID:      docker.io/library/redis@sha256:fb534a36ac2034a6374933467d971fbcbfa5d213805507f560d564851a720355
    Port:          <none>
    Host Port:     <none>
    Args:
      redis-server
      /etc/redis.conf
    State:          Running
      Started:      Mon, 30 Sep 2024 13:12:06 +0200
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /data from awx-redis-data (rw)
      /etc/redis.conf from awx-redis-config (ro,path="redis.conf")
      /var/run/redis from awx-redis-socket (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-g5bz7 (ro)
  awx-web:
    Container ID:  containerd://a5af898f246ffdb5b2271307842a3deeb818b7271d43b053384f312e2b63d04c
    Image:         quay.io/ansible/awx:24.6.0
    Image ID:      quay.io/ansible/awx@sha256:8221b859aede2a155038fa07af50078ba37b06b969b259f3dd1147a931e30fac
    Port:          8052/TCP
    Host Port:     0/TCP
    Args:
      /usr/bin/launch_awx_web.sh
    State:          Running
      Started:      Mon, 30 Sep 2024 13:12:07 +0200
    Ready:          True
    Restart Count:  0
    Environment:
      AWX_COMPONENT:           web
      SUPERVISOR_CONFIG_PATH:  /etc/supervisord_web.conf
      MY_POD_NAMESPACE:        awx (v1:metadata.namespace)
      MY_POD_IP:                (v1:status.podIP)
      UWSGI_MOUNT_PATH:        /
    Mounts:
      /etc/nginx/nginx.conf from awx-nginx-conf (ro,path="nginx.conf")
      /etc/receptor/tls/ca/mesh-CA.crt from awx-receptor-ca (ro,path="tls.crt")
      /etc/receptor/tls/ca/mesh-CA.key from awx-receptor-ca (ro,path="tls.key")
      /etc/receptor/work_public_key.pem from awx-receptor-work-signing (ro,path="work-public-key.pem")
      /etc/tower/SECRET_KEY from awx-secret-key (ro,path="SECRET_KEY")
      /etc/tower/conf.d/credentials.py from awx-application-credentials (ro,path="credentials.py")
      /etc/tower/conf.d/execution_environments.py from awx-application-credentials (ro,path="execution_environments.py")
      /etc/tower/conf.d/ldap.py from awx-application-credentials (ro,path="ldap.py")
      /etc/tower/settings.py from awx-settings (ro,path="settings.py")
      /etc/tower/uwsgi.ini from awx-uwsgi-config (ro,path="uwsgi.conf")
      /home/ansible/awx/awx-on-k3s/mount/iso-logo-header.svg from logo-header (rw,path="iso-logo-header.svg")
      /home/ansible/awx/awx-on-k3s/mount/iso-logo-login.svg from logo-login (rw,path="iso-logo-login.svg")
      /var/lib/awx/projects from awx-projects (rw)
      /var/run/awx-rsyslog from rsyslog-socket (rw)
      /var/run/redis from awx-redis-socket (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-g5bz7 (ro)
  awx-rsyslog:
    Container ID:  containerd://9e10b00bcb4086e07b8f2789174741d078fc15c9e17124b7370b90a0a253b649
    Image:         quay.io/ansible/awx:24.6.0
    Image ID:      quay.io/ansible/awx@sha256:8221b859aede2a155038fa07af50078ba37b06b969b259f3dd1147a931e30fac
    Port:          <none>
    Host Port:     <none>
    Args:
      /usr/bin/launch_awx_rsyslog.sh
    State:          Running
      Started:      Mon, 30 Sep 2024 13:12:07 +0200
    Ready:          True
    Restart Count:  0
    Environment:
      SUPERVISOR_CONFIG_PATH:  /etc/supervisord_rsyslog.conf
    Mounts:
      /etc/tower/SECRET_KEY from awx-secret-key (ro,path="SECRET_KEY")
      /etc/tower/conf.d/credentials.py from awx-application-credentials (ro,path="credentials.py")
      /etc/tower/settings.py from awx-settings (ro,path="settings.py")
      /var/run/awx-rsyslog from rsyslog-socket (rw)
      /var/run/redis from awx-redis-socket (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-g5bz7 (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       True
  ContainersReady             True
  PodScheduled                True
Volumes:
  awx-receptor-ca:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  awx-receptor-ca
    Optional:    false
  awx-receptor-work-signing:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  awx-receptor-work-signing
    Optional:    false
  awx-application-credentials:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  awx-app-credentials
    Optional:    false
  awx-secret-key:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  awx-secret-key
    Optional:    false
  awx-settings:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      awx-awx-configmap
    Optional:  false
  awx-nginx-conf:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      awx-awx-configmap
    Optional:  false
  awx-redis-config:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      awx-awx-configmap
    Optional:  false
  awx-uwsgi-config:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      awx-awx-configmap
    Optional:  false
  awx-redis-socket:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  awx-redis-data:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  rsyslog-socket:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  receptor-socket:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  awx-receptor-config:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      awx-awx-configmap
    Optional:  false
  awx-projects:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  awx-projects-claim
    ReadOnly:   false
  logo-login:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      iso-logo-login-configmap
    Optional:  false
  logo-header:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      iso-logo-header-configmap
    Optional:  false
  kube-api-access-g5bz7:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  51m   default-scheduler  Successfully assigned awx/awx-web-5dff48b9db-sfb7d to ipsnbg6vm48
  Normal  Pulled     51m   kubelet            Container image "quay.io/centos/centos:stream9" already present on machine
  Normal  Created    51m   kubelet            Created container init-projects
  Normal  Started    51m   kubelet            Started container init-projects
  Normal  Pulled     51m   kubelet            Container image "docker.io/redis:7" already present on machine
  Normal  Created    51m   kubelet            Created container redis
  Normal  Started    51m   kubelet            Started container redis
  Normal  Pulled     51m   kubelet            Container image "quay.io/ansible/awx:24.6.0" already present on machine
  Normal  Created    51m   kubelet            Created container awx-web
  Normal  Started    51m   kubelet            Started container awx-web
  Normal  Pulled     51m   kubelet            Container image "quay.io/ansible/awx:24.6.0" already present on machine
  Normal  Created    51m   kubelet            Created container awx-rsyslog
  Normal  Started    51m   kubelet            Started container awx-rsyslog

Thank you
Rainer

@RainerP

The mountPath is the target path where your svg file is mounted as inside the container, instead of the path of he source file on your host. These paths must be the same as documented:

  web_extra_volume_mounts: |
    - name: logo-login
      mountPath: /var/lib/awx/public/static/media/logo-login.svg ✅
      subPath: logo-login.svg
    - name: logo-header
      mountPath: /var/lib/awx/public/static/media/logo-header.svg ✅
      subPath: logo-header.svg
1 Like

Thank you, this solved my issue.
However the logos look some kind of different compared to before / outside of AWX (eg. white color is now grey). Any advise how to create svg files from png/screenshots ?

I don’t know if this is a valid choice for you, but I usually use Photoshop :smiley: