User Input
User input can be required in a task or during configuration:
# used in a configuration
ask(:database_name, "default_database_name")
# used in a task
desc "Ask about breakfast"
task :breakfast do
ask(:breakfast, "pancakes")
on roles(:all) do |h|
execute "echo \"$(whoami) wants #{fetch(:breakfast)} for breakfast!\""
end
end
When using ask
to get user input, you can pass echo: false
to prevent the
input from being displayed. This option should be used to ask the user for
passwords and other sensitive data during a deploy run.
ask(:database_password, 'default_password', echo: false)
The symbol passed as a parameter will be printed as text for the user and the input will be saved to this variable:
ask(:database_encoding, 'UTF-8')
# Please enter :database_encoding (UTF-8):
fetch(:database_encoding)
# => contains the user input (or the default)
# once the above line got executed
You can use ask
to set a server- or role-specific configuration variable.
ask(:password, nil)
server 'example.com', user: 'ssh_user_name', port: 22, password: fetch(:password), roles: %w{web app db}
You can also show your own message by using prompt
option:
ask(:breakfast, "pancakes", prompt: "What's for breakfast?")
Important! ask
will not prompt the user immediately. The question is
deferred until the first time fetch
is used to obtain the setting. That means
you can ask
for many variables, but only the variables used by your task(s)
will actually prompt the user for input.