Deploy juju controller offline

I want to install OSM9 offline and when I running command
“juju bootstrap k8scloud osm --config controller-service-type=loadbalancer --agent-version=2.8.8 --debug”, i found logs

02:34:07 DEBUG juju.kubernetes.provider configmap.go:84 updating configmap "controller-configmap"
02:34:07 DEBUG juju.kubernetes.provider bootstrap.go:651 creating controller statefulset:
&StatefulSet{ObjectMeta:{controller  controller-osm    0 0001-01-01 00:00:00 +0000 UTC <nil> <nil> map[juju-app:controller model.juju.is/disable-webhook:true] map[juju.io/controller:9aa7885c-056b-4e57-802a-63a29
c3b6f57] [] []  []},Spec:StatefulSetSpec{Replicas:*1,Selector:&v1.LabelSelector{MatchLabels:map[string]string{juju-app: controller,},MatchExpressions:[]LabelSelectorRequirement{},},Template:{{controller-0  contr
oller-osm    0 0001-01-01 00:00:00 +0000 UTC <nil> <nil> map[juju-app:controller model.juju.is/disable-webhook:true] map[juju.io/controller:9aa7885c-056b-4e57-802a-63a29c3b6f57] [] []  []} {[{controller-server-p
em {nil nil nil nil nil SecretVolumeSource{SecretName:controller-secret,Items:[]KeyToPath{KeyToPath{Key:server.pem,Path:template-server.pem,Mode:nil,},},DefaultMode:*256,Optional:nil,} nil nil nil nil nil nil ni
l nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil}} {controller-shared-secret {nil nil nil nil nil &SecretVolumeSource{SecretName:controller-secret,Items:[]KeyToPath{KeyToPath{Key:shared-secret,Path:
shared-secret,Mode:nil,},},DefaultMode:*256,Optional:nil,} nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil}} {controller-agent-conf {nil nil nil nil nil nil nil nil nil ni
l nil nil nil nil nil nil nil nil &ConfigMapVolumeSource{LocalObjectReference:LocalObjectReference{Name:controller-configmap,},Items:[]KeyToPath{KeyToPath{Key:agent.conf,Path:template-agent.conf,Mode:nil,},},Def
aultMode:nil,Optional:nil,} nil nil nil nil nil nil nil nil nil}} {controller-bootstrap-params {nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil &ConfigMapVolumeSource{LocalObjectReference
:LocalObjectReference{Name:controller-configmap,},Items:[]KeyToPath{KeyToPath{Key:bootstrap-params,Path:bootstrap-params,Mode:nil,},},DefaultMode:nil,Optional:nil,} nil nil nil nil nil nil nil nil nil}}] [] [{mo
ngodb jujusolutions/juju-db:4.0 [mongod] [--dbpath=/var/lib/juju/db --sslPEMKeyFile=/var/lib/juju/server.pem --sslPEMKeyPassword=ignored --sslMode=requireSSL --port=37017 --journal --replSet=juju --quiet --oplog
Size=1024 --ipv6 --auth --keyFile=/var/lib/juju/shared-secret --storageEngine=wiredTiger --bind_ip_all]  [{mongodb 0 37017 TCP }] [] [] {map[memory:{{1610612736 0} {<nil>}  BinarySI}] map[]} [{storage false /var
/lib/juju  <nil> } {storage false /var/lib/juju/db db <nil> } {controller-server-pem true /var/lib/juju/template-server.pem template-server.pem <nil> } {controller-shared-secret true /var/lib/juju/shared-secret
shared-secret <nil> }] [] &Probe{Handler:Handler{Exec:&ExecAction{Command:[mongo --port=37017 --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates --sslPEMKeyFile=/var/lib/juju/server.pem --eval db.adm
inCommand('ping')],},HTTPGet:nil,TCPSocket:nil,},InitialDelaySeconds:30,TimeoutSeconds:5,PeriodSeconds:10,SuccessThreshold:1,FailureThreshold:3,} &Probe{Handler:Handler{Exec:&ExecAction{Command:[mongo --port=370
17 --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates --sslPEMKeyFile=/var/lib/juju/server.pem --eval db.adminCommand('ping')],},HTTPGet:nil,TCPSocket:nil,},InitialDelaySeconds:5,TimeoutSeconds:1,Per
iodSeconds:10,SuccessThreshold:1,FailureThreshold:3,} nil nil   IfNotPresent nil false false false} {api-server jujusolutions/jujud-operator:2.8.8 [/bin/sh] [-c export JUJU_DATA_DIR=/var/lib/juju
export JUJU_TOOLS_DIR=$JUJU_DATA_DIR/tools

mkdir -p $JUJU_TOOLS_DIR
cp /opt/jujud $JUJU_TOOLS_DIR/jujud

echo Installing Dashboard...
export gui='/var/lib/juju/gui'
mkdir -p $gui
curl -sSf -o $gui/gui.tar.bz2 --retry 10 --proxy http://10.61.123.211:8888/ --noproxy 127.0.0.1,localhost,::1 'https://streams.canonical.com/juju/gui/gui/0.3.0/juju-dashboard-0.3.0.tar.bz2' || echo Unable to ret
rieve Juju Dashboard
[ -f $gui/gui.tar.bz2 ] && sha256sum $gui/gui.tar.bz2 > $gui/jujugui.sha256
[ -f $gui/jujugui.sha256 ] && (grep '1091694ab6178e79f62996e70f961acc121eba6bb502ee92116c51bb45d9c4d0' $gui/jujugui.sha256 && printf %s '{"version":"0.3.0","url":"https://streams.canonical.com/juju/gui/gui/0.3.0
/juju-dashboard-0.3.0.tar.bz2","sha256":"1091694ab6178e79f62996e70f961acc121eba6bb502ee92116c51bb45d9c4d0","size":1440427}' > $gui/downloaded-gui.txt || echo Juju GUI checksum mismatch)
test -e $JUJU_DATA_DIR/agents/controller-0/agent.conf || $JUJU_TOOLS_DIR/jujud bootstrap-state $JUJU_DATA_DIR/bootstrap-params --data-dir $JUJU_DATA_DIR --debug --timeout 20m0s
$JUJU_TOOLS_DIR/jujud machine --data-dir $JUJU_DATA_DIR --controller-id 0 --log-to-stderr --debug
] /var/lib/juju [] [] [] {map[memory:{{1610612736 0} {<nil>}  BinarySI}] map[]} [{storage false /var/lib/juju  <nil> } {controller-agent-conf false /var/lib/juju/agents/controller-0/template-agent.conf template-
agent.conf <nil> } {controller-server-pem true /var/lib/juju/template-server.pem template-server.pem <nil> } {controller-shared-secret true /var/lib/juju/shared-secret shared-secret <nil> } {controller-bootstrap
-params true /var/lib/juju/bootstrap-params bootstrap-params <nil> }] [] nil nil nil nil   IfNotPresent nil false false false}] [] Always <nil> <nil>  map[]   <nil>  false false false <nil> nil []   nil  [] []
<nil> nil [] <nil> <nil> <nil> map[] []}},VolumeClaimTemplates:[]PersistentVolumeClaim{{{ } {storage      0 0001-01-01 00:00:00 +0000 UTC <nil> <nil> map[juju-app:controller] map[juju.io/controller:9aa7885c-056b
-4e57-802a-63a29c3b6f57] [] []  []} {[ReadWriteOnce] nil {map[] map[storage:{{21474836480 0} {<nil>} 20Gi BinarySI}]}  0xc000b1cc90 <nil> nil} { [] map[] []}},},ServiceName:controller-service,PodManagementPolicy
:,UpdateStrategy:StatefulSetUpdateStrategy{Type:,RollingUpdate:nil,},RevisionHistoryLimit:nil,},Status:StatefulSetStatus{ObservedGeneration:0,Replicas:0,ReadyReplicas:0,CurrentReplicas:0,UpdatedReplicas:0,Curren
tRevision:,UpdateRevision:,CollisionCount:nil,Conditions:[]StatefulSetCondition{},},}
02:34:07 DEBUG juju.kubernetes.provider k8s.go:2023 selecting units "juju-app=controller" to watch

How can I replace link https://streams.canonical.com/juju/gui/gui/0.3.0/juju-dashboard-0.3.0.tar.bz2 with my local link?

If you don’t want a gui at all, for total offline experience you can supply --no-gui. Alternatively you can supply a gui tar when bootstrapping, although this is a developer use-case you can supply your own dashboard using the following command:

JUJU_GUI=<location of tar> juju bootstrap lxd test

It’s important to note that it expects the naming of the gui to match the current tar.bz2. When bootstrapping you should see the following in the output from bootstrapping:

Fetching Juju Dashboard 0.3.0 from local archive
1 Like

Thanks your support! I bootstrapped successfull juju offline with option --no-gui