Skip to main content

Login Configuration Reference

This document is a detailed reference for login configuration in inventory files.

Inventory File Basics

Define hosts and connection information in an INI format similar to Ansible.

[webservers]
web1.example.com
web2.example.com

[all:vars]
ansible_user=admin
ansible_port=22

Different Login Names for Each Node

You can specify different connection parameters for each host.

[webservers]
web1.example.com ansible_user=webadmin
web2.example.com ansible_port=2222

[dbservers]
db1.example.com ansible_user=postgres ansible_port=5432
db2.example.com

[all:vars]
ansible_user=admin
ansible_port=22

Variable Priority

Host-specific variables > Group variables > Global variables

In the example above:

  • web1.example.com → User webadmin (host-specific), Port 22 (global)
  • web2.example.com → User admin (global), Port 2222 (host-specific)
  • db1.example.com → User postgres, Port 5432 (both host-specific)
  • db2.example.com → User admin, Port 22 (both global)

Centrally Managed Environments (LDAP, etc.)

In environments where accounts are centrally managed by LDAP or Active Directory, the same username is used across all nodes. You only need to write common settings in [all:vars].

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
db2.example.com

[all:vars]
ansible_user=myldapuser
ansible_port=22

Changing Settings per Group

If you want to change settings for only specific groups, override with group variables:

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
db2.example.com

[all:vars]
ansible_user=myldapuser
ansible_port=22

[dbservers:vars]
ansible_port=2222

Accessing the Same Host with Multiple Accounts

When a single cluster has multiple accounts (e.g., regular user and administrator), put the same hosts in different groups to separate users:

# cluster - oogasawa account
[cluster-oogasawa]
192.168.5.1
192.168.5.13
192.168.5.14
192.168.5.15

[cluster-oogasawa:vars]
ansible_user=oogasawa

# cluster - devteam account
[cluster-devteam]
192.168.5.1
192.168.5.13
192.168.5.14
192.168.5.15

[cluster-devteam:vars]
ansible_user=devteam

# Parent group containing both (optional)
[cluster:children]
cluster-oogasawa
cluster-devteam

[all:vars]
ansible_port=22

Structure

[cluster-oogasawa]  ← ansible_user=oogasawa
[cluster-devteam] ← ansible_user=devteam

[cluster:children] ← Parent group containing both (optional)

Usage Example

# Execute workflow with oogasawa account
java -jar actor-IaC.jar -d ./workflows -w deploy \
-i inventory.ini -g cluster-oogasawa

# Execute workflow with devteam account
java -jar actor-IaC.jar -d ./workflows -w deploy \
-i inventory.ini -g cluster-devteam

By selecting the group with the -g option, you can access the same hosts with different accounts.

Usage Examples in Java Code

Level 1 (POJO)

// Create NodeGroup (Builder pattern)
NodeGroup nodeGroup = new NodeGroup.Builder()
.withInventory(new FileInputStream("inventory.ini"))
.build();

// Create Node POJOs for each group
List<Node> webservers = nodeGroup.createNodesForGroup("webservers");
List<Node> dbservers = nodeGroup.createNodesForGroup("dbservers");

// Each Node has the configured username and port
for (Node node : webservers) {
Node.CommandResult result = node.executeCommand("uptime");
System.out.println(node.getHostname() + ": " + result.getStdout());
}

Level 2 (Actor)

ActorSystem system = new ActorSystem("iac", 4);

// Create NodeGroup POJO
NodeGroup nodeGroup = new NodeGroup.Builder()
.withInventory(new FileInputStream("inventory.ini"))
.build();

// Convert NodeGroup to actor (parent actor)
ActorRef<NodeGroup> nodeGroupActor = system.actorOf("nodeGroup", nodeGroup);

// Create Node POJOs and register as child actors
List<Node> nodes = nodeGroup.createNodesForGroup("webservers");
for (Node node : nodes) {
nodeGroupActor.createChild("node-" + node.getHostname(), node);
}

// Execute command on all child actors (in parallel)
Set<String> childNames = nodeGroupActor.getNamesOfChildren();
List<CompletableFuture<Node.CommandResult>> futures = new ArrayList<>();

for (String name : childNames) {
ActorRef<Node> nodeActor = system.getActor(name);
futures.add(nodeActor.ask(node -> node.executeCommand("uptime")));
}

CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
system.terminate();

Practical Scenario: Accessing a Compute Cluster

This section explains specific configuration methods using a compute cluster with the following structure as an example.

Cluster Configuration

External Network (10.xxx.xxx.xxx)


┌─────────────────┐
│ Gateway │
│ External: 10.1.2.3 │
│ Internal: 192.168.5.1│
└─────────────────┘


Internal Network (192.168.5.0/24)

┌────┼────┬────┬─── ... ───┐
▼ ▼ ▼ ▼ ▼
node001 node002 node003 ... node100
.5.101 .5.102 .5.103 .5.200
  • 100 compute nodes (192.168.5.101 - 192.168.5.200)
  • External access via gateway
  • Both public key and password authentication enabled
  • One user with two accounts (myuser, myuser-admin)

Step 1: Create SSH Config File

Add the following to ~/.ssh/config:

# Common settings for cluster internal network
Host 192.168.5.*
User myuser
IdentityFile ~/.ssh/id_ed25519_myuser_cluster
IdentitiesOnly yes
AddKeysToAgent yes

# For myuser-admin account (manage with separate file or Match clause)

Key points:

  • IdentitiesOnly yes: Use only the specified key (don't try extra keys)
  • AddKeysToAgent yes: Automatically add successfully authenticated keys to ssh-agent
  • actor-IaC correctly interprets wildcard hosts (192.168.5.*)

Important note about Ed25519 keys:

  • When using Ed25519 keys, pre-registration with ssh-agent is mandatory
  • Even if you specify IdentityFile in ~/.ssh/config, Ed25519 cannot be read directly (JSch limitation)
  • RSA/ECDSA keys work without ssh-agent

Step 2: Register Keys with ssh-agent (Mandatory for Ed25519 Keys)

When using Ed25519 keys, registration with ssh-agent is mandatory.

# Start ssh-agent (if not already running)
eval "$(ssh-agent -s)"

# Register the key for the account to use
ssh-add ~/.ssh/id_ed25519_myuser_cluster

# Verify registered keys
ssh-add -l

Verification: If ssh-add -l shows registered keys, you're good.

This step can be skipped when using RSA/ECDSA keys (without passphrase).

Step 3: Create Inventory File

Accessing all nodes with myuser account:

# inventory-myuser.ini
[compute]
192.168.5.101
192.168.5.102
192.168.5.103
# ... omitted ...
192.168.5.200

[all:vars]
ansible_user=myuser
ansible_port=22

Accessing with myuser-admin account:

# inventory-myuser-admin.ini
[compute]
192.168.5.101
192.168.5.102
192.168.5.103
# ... omitted ...
192.168.5.200

[all:vars]
ansible_user=myuser-admin
ansible_port=22

Using different account for only some nodes:

# inventory-mixed.ini
[compute]
192.168.5.101
192.168.5.102
192.168.5.103 ansible_user=myuser-admin

[all:vars]
ansible_user=myuser
ansible_port=22

Step 4: Execute with actor-IaC

// Confirm ssh-agent is running and key is registered

NodeGroup nodeGroup = new NodeGroup.Builder()
.withInventory(new FileInputStream("inventory-myuser.ini"))
.build();

// Create 100 compute nodes
List<Node> nodes = nodeGroup.createNodesForGroup("compute");

// Execute command on all nodes
for (Node node : nodes) {
Node.CommandResult result = node.executeCommand("hostname");
System.out.println(result.getStdout());
}

Accessing from External via Gateway (ProxyJump)

actor-IaC v2.9 and later supports ProxyJump settings in ~/.ssh/config.

ProxyJump Configuration

Add the following to ~/.ssh/config:

Host 192.168.5.*
User myuser
IdentityFile ~/.ssh/id_ed25519_myuser_cluster
ProxyJump [email protected]

With this configuration, actor-IaC automatically:

  1. Connects to the gateway (10.1.2.3)
  2. Port forwards to the target node (192.168.5.x) via the gateway
  3. Executes commands on the target node

Usage Example

# Register key with ssh-agent (mandatory for Ed25519)
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_myuser_cluster

# Execute actor-IaC - ProxyJump is handled automatically
java -jar actor-IaC.jar -d ./workflows -w deploy -i inventory.ini

ProxyJump Formats

The following formats are supported:

  • user@host - Uses default port 22
  • user@host:port - Uses specified port
  • host - Uses same username as target

Alternative Methods

Alternative methods when not using ProxyJump:

Method 1: Execute actor-IaC on the gateway

# Login to gateway
ssh [email protected]

# Execute actor-IaC on the gateway
java -jar actor-IaC.jar -d ./workflows -w deploy -i inventory.ini

Method 2: Execute from the same network segment

If the machine running actor-IaC is on the same segment as the internal network (192.168.5.0/24), ProxyJump is not needed.

SSH Authentication

actor-IaC supports the following SSH authentication methods.

Authentication Priority

actor-IaC attempts authentication in the following order:

  1. ssh-agent (highest priority) - Supports all key types including Ed25519
  2. ~/.ssh/config IdentityFile - RSA/ECDSA keys only (without passphrase)
  3. Default key files (id_rsa, id_ecdsa, id_dsa) - Without passphrase
  4. Password authentication (when --ask-pass option is specified)

Using Ed25519 Keys (ssh-agent Required)

Important: Ed25519 keys can only be used via ssh-agent. This is a limitation of the JSch library.

# Start ssh-agent
eval "$(ssh-agent -s)"

# Register Ed25519 key
ssh-add ~/.ssh/id_ed25519
# or specific key file
ssh-add ~/.ssh/id_ed25519_myuser_cluster

CLI execution:

java -jar actor-IaC.jar -d ./workflows -w deploy -i inventory.ini

Using RSA/ECDSA Keys

RSA/ECDSA keys (without passphrase) can be used directly without ssh-agent. Specify IdentityFile in ~/.ssh/config or use default key files (~/.ssh/id_rsa, etc.).

# ~/.ssh/config example
Host 192.168.5.*
User myuser
IdentityFile ~/.ssh/id_rsa_cluster

Advantages: No password input needed, ideal for automation, security-recommended

Method 2: Password Authentication (--ask-pass)

In environments where SSH keys cannot be used (clusters managed by other departments, initial setup, etc.), password authentication can be used.

java -jar actor-IaC.jar -d ./workflows -w deploy -i inventory.ini --ask-pass
SSH password: ********

Or short form:

java -jar actor-IaC.jar -d ./workflows -w deploy -i inventory.ini -k
SSH password: ********

Behavior:

  • Enter password only once at startup
  • The entered password is applied to all nodes (same as Ansible)
  • Password is not echoed to the screen

Notes:

  • Assumes the same password for all nodes (different passwords per node not supported)
  • Not suitable for automation (requires password input each time)
  • Migration to SSH key authentication is recommended when possible

Choosing an Authentication Method

SituationRecommended Method
Servers you manageSSH key authentication
Clusters managed by other departmentsPassword authentication (--ask-pass)
Initial setup (keys not distributed)Password authentication → Migrate to key authentication
CI/CD pipelineSSH key authentication (can't input password)

sudo Password

If a sudo password is required, pass it via environment variable:

export SUDO_PASSWORD=yourpassword
java -jar actor-IaC.jar -d ./workflows -w deploy -i inventory.ini

HashiCorp Vault integration is planned for secure secret management in the future. See VaultIntegration for details.

Troubleshooting

"Auth fail for methods 'publickey,password'"

Cause: SSH authentication failed.

Solution:

  1. If using Ed25519 key, check if ssh-agent is running:
    ssh-add -l
    # If no keys are shown, add them
    eval "$(ssh-agent -s)"
    ssh-add ~/.ssh/id_ed25519_xxx
  2. For RSA/ECDSA keys, confirm there's no passphrase
  3. Confirm the IdentityFile path in ~/.ssh/config is correct

"ssh-ed25519 is not available"

Cause: Trying to read Ed25519 key directly (without ssh-agent).

Solution: Ed25519 keys can only be used via ssh-agent. Start ssh-agent and register the key:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_xxx

Connection Timeout

Cause: Network connection issue or ProxyJump configuration problem.

Solution:

  1. Check if you can connect with regular SSH:
    ssh user@target-host
  2. If using ProxyJump, check connection to gateway:
    ssh user@gateway-host
  3. Check firewall settings

"UnsupportedClassVersionError"

Cause: Java version on target server is too old.

Solution:

  • Update Java on the target server
  • Or rebuild the application for an older Java version

Wildcard Hosts Not Recognized

Cause: Wildcard pattern in ~/.ssh/config (Host 192.168.5.*) is incorrect.

Solution: actor-IaC supports OpenSSH format wildcards. Use the following format:

Host 192.168.5.*
User myuser
IdentityFile ~/.ssh/id_ed25519_xxx