;Licensed to the Apache Software Foundation (ASF) under one or more
;contributor license agreements.  See the NOTICE file distributed with
;this work for additional information regarding copyright ownership.
;The ASF licenses this file to You under the Apache License, Version 2.0
;(the "License"); you may not use this file except in compliance with
;the License.  You may obtain a copy of the License at
;
;http://www.apache.org/licenses/LICENSE-2.0
;
;Unless required by applicable law or agreed to in writing, software
;distributed under the License is distributed on an "AS IS" BASIS,
;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;See the License for the specific language governing permissions and
;limitations under the License.

# ==================================================================
# This is a sample file for Visor CMD to use with "start" command.
# More info: https://ignite.apache.org/docs/latest/tools/visor-cmd
# ==================================================================

# Section with settings for host1:
[host1]
# IP address or host name:
host=192.168.1.1

# SSH port:
port=2200

# SSH login:
uname=userName

# SSH password:
passwd=password

# SSH key path:
key=~/.ssh/id_rsa

# Number of nodes to start:
nodes=1

# Ignite home path:
igniteHome=/usr/lib/ignite

# Ignite config path:
cfg=examples/example-ignite.xml

# Ignite node start script:
script=bin/ignite.sh

# Section with settings for host2:
[host2]
# IP address or host name:
host=192.168.1.2

# Section with default settings. Used if value not defined in host section.
[defaults]
# SSH port:
port=22

# SSH login:
uname=userName

# SSH password:
passwd=password

# SSH key path:
key=~/.ssh/id_rsa

# Number of nodes to start:
nodes=3

# Ignite home path:
igniteHome=/usr/lib/ignite

# Ignite config path:
cfg=examples/example-ignite.xml

# Ignite node start script:
script=bin/ignite.sh
