The question is: should the shell where you can issue VyOS configuration commands be the login shell in 2.0?
The alternative is JunOS-like approach where you get into the normal UNIX shell after login, and issue 'cli' command to enter the JunOS shell.
I started using VyOS because I saw Ansible gained support for configuring VyOS devices. I want all my devices in config management. I'd lie if I said I was familiar with the inner workings of the Python module that interacts with VyOS, but from my config management POV I think it makes sense to login into a normal shell and then perform 'some action'. This action could be done in a CLI tool or it could be something OS-related. So for me, I think it makes sense to login to a normal shell first. My two (possibly worthless) cents ;)
I like the separation for admin vs view. Its the same reason we have RO and RW in SNMP v2c etc. While I don't yet have hands-on experience with Junos, I specifically like the demarcation of configuration vs show commands. For those that don't like the dual approach, can't the run prefix be used to enable a flatter CLI approach?
In JunOS the root user enters in the shell and uses 'cli' to enter show mode followed by configure for config mode.
When i add an extra user without shell access, this user is placed directly into show mode.
The vyos user is not the root user, so the way it currently is makes perfect sense to me.
FWIW, I definitely prefer JunOS-like (issue command to enter VyOS shell) behavior and agree with the comments about remote configuration, such as with Ansible. This makes mass configuration, change-controls, and backups much more like other *nix based installs. It also makes munging the VyOS command output available out-of-the-box on the VyOS install, i.e. IMO it would be much easier to call VyOS shell sniplets from scripts in bash, tcsh, python, perl, etc, than to deal with getting out of the more captive shell back to a "real" shell for a custom script, cron job, etc.
@jpbostic My idea for interacting with vyconf from outside the interactive shell is a bit different. The issue with 'vyshell -c "set interfaces ethernet eth0 disable' is that it needs to setup a session first, and store the session ID between commands, so either it will be limited to 'vyshell -c "configure; set interfaces ethernet eth0 address 192.0.2.1/24; set interfaces ethernet eth0 mtu 1400"' (i.e. long command strings in single call), or it will be dependent on specific environment setup, and from VyOS 1.x we already know how problematic it will be.
My idea is to make the shell purely interactive, but add a non-interactive CLI client that can a) take session ID as an argument b) use top level words (set/delete/...) as subcommands, as in:
export SESSION=$(vycli setup-session) vycli --session=$SESSION configure vycli --session=$SESSION set "interfaces ethernet eth0 address 192.0.2.1/24" vycli --session=$SESSION set "interfaces ethernet eth0 mtu 1400" vycli --session=$SESSION commit vycli --session=$SESSION exit vycli --session=$SESSION teardown-session
It may also try to use SESSION environment variable when --session option is not given, but the point is that either way the session ID is the only thing it needs to operate, as opposed to a whole lot of shell variables and aliases it needs now (run "cli-shell-api getSessionEnv $PPID" to see how much stuff it needs just to setup a session).