envsubst will really just perform variable substitution, not perform any logic or command substitution (e.g. $(hostname -f)). It's also limited, from what I've seen, in support for other bash variable actions (such as defaults). You can also write loops with output similar to other templating languages here as well.