0

When attempting to run an ansible module on a destination server (via become) the ssh connection does not appear to be doing a "sudo" to become the application-owner user. The correct remote user is being used but the remote user is not doing "sudo" to become the app-owner account. The config used and command run are described below.

I am expecting to be able to run adhoc ansible commands and playbooks on the destination server.

The destination server has 2 users. User "myapp" that owns the directories and the daemons of the application we're attempting to control. The user "inuser" has /usr/bin/sudo setup in their nologin permitted functions and has /bin/nologin as their shell in /etc/passwd. The "inuser" user has NO OTHER commands/functions in their nologin permitted functions (and it will be difficult to get any additional commands into nologin).

On the controller server, we're running ansible as user called "build". The /home/build/.ansible.cfg file looks like this:

[build@ecombuild01 ~]$ echo ""; grep -v "#" ~/.ansible.cfg  | grep -v "^$"

[defaults]
inventory      = /sites/utils/local/ansible/hosts
library        = /sites/utils/local/ansible/modules/
module_utils   = /sites/utils/local/ansible/module_utils/
remote_tmp     = /sites/utils/tmp/ansible
local_tmp      = /sites/utils/tmp/ansible
forks          = 50
poll_interval  = 3
transport      = smart
module_lang    = C
gathering = explicit
gather_subset = virtual
gather_timeout = 4
roles_path    = /sites/utils/local/ansible/roles
host_key_checking = False
timeout = 4
remote_user = inuser
log_path = /sites/utils/local/var/log/ansible.log
private_key_file = /home/build/.ssh/rsa_sudo
display_skipped_hosts = False
deprecation_warnings = False
bin_ansible_callbacks = True
nocows = 1
retry_files_enabled = False
allow_world_readable_tmpfiles = True
[privilege_escalation]
become=True
become_method=sudo
become_user=myapp
become_ask_pass=False
[paramiko_connection]
pty=False
[ssh_connection]
ssh_args = -q -C -o ControlMaster=auto -o ControlPersist=60s
control_path_dir = /sites/utils/tmp/.ansible/sockets
scp_if_ssh = smart
sftp_batch_mode = True
[accelerate]
[selinux]
[colors]
[diff]
context = 3

When I attempt to run a module, I am seeing the following output:

    [build@buildserver:/home/build]  ansible -m attApache ecomtest03 -a "action=status" -b --become-method=sudo --become-user=atg -vvv

ansible 2.6.2
  config file = /home/build/.ansible.cfg
  configured module search path = [u'/sites/utils/local/ansible/modules']
  ansible python module location = /sites/utils/Python-2.7.15/lib/python2.7/site-packages/ansible
  executable location = /sites/utils/bin/ansible
  python version = 2.7.15 (default, Aug 14 2018, 11:48:06) [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)]
Using /home/build/.ansible.cfg as config file
Parsed /sites/utils/local/ansible/hosts inventory source with script plugin
META: ran handlers
<ecomtest03> ESTABLISH SSH CONNECTION FOR USER: inuser
<ecomtest03> SSH: EXEC ssh -vv -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=inuser -o ConnectTimeout=4 ecomtest03 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo /var/tmp/ansible-tmp-1554330491.64-221707721970475 `" && echo ansible-tmp-1554330491.64-221707721970475="` echo /var/tmp/ansible-tmp-1554330491.64-221707721970475 `" ) && sleep 0'"'"''
<ecomtest03> (1, '', 'OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013\ndebug1: Reading configuration data /home/build/.ssh/config
debug1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to ecomtest03 [135.163.163.134] port 22.
debug2: fd 3 setting O_NONBLOCK
debug1: fd 3 clearing O_NONBLOCK
debug1: Connection established.
debug2: key_type_from_name: unknown key type \'-----BEGIN\'
debug2: key_type_from_name: unknown key type \'-----END\'
debug1: identity file /home/build/.ssh/id_dsa type 2
debug1: identity file /home/build/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3
debug2: fd 3 setting O_NONBLOCK
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: [email protected],[email protected],[email protected],[email protected],ssh-rsa,ssh-dss
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,[email protected]
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,[email protected]
debug2: kex_parse_kexinit: hmac-sha1,[email protected],hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,[email protected],hmac-sha1-96
debug2: kex_parse_kexinit: hmac-sha1,[email protected],hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,[email protected],hmac-sha1-96
debug2: kex_parse_kexinit: none,[email protected],zlib
debug2: kex_parse_kexinit: none,[email protected],zlib
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit: first_kex_follows 0
debug2: kex_parse_kexinit: reserved 0
debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: ssh-rsa,ssh-dss
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected]
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected]
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,[email protected],hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,[email protected],hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,[email protected],hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,[email protected],hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: none,[email protected]
debug2: kex_parse_kexinit: none,[email protected]
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit: first_kex_follows 0
debug2: kex_parse_kexinit: reserved 0
debug2: mac_setup: found hmac-sha1
debug1: kex: server->client aes128-ctr hmac-sha1 none
debug2: mac_setup: found hmac-sha1
debug1: kex: client->server aes128-ctr hmac-sha1 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<2048<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug2: dh_gen_key: priv key bits set: 143/320
debug2: bits set: 1039/2048
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host \'ecomtest03\' is known and matches the RSA host key.
debug1: Found key in /home/build/.ssh/known_hosts:961
debug2: bits set: 1030/2048
debug1: ssh_rsa_verify: signature correct
debug2: kex_derive_keys
debug2: set_newkeys: mode 1
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug2: set_newkeys: mode 0
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /home/build/.ssh/id_dsa (0x560cc4d49fb0)
\n#@#                                      !!! WARNING !!!\n#@#\n#@# blah-blah-message-from-system-admins@#\n\n\n\ndebug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information\nCredentials cache file \'/tmp/krb5cc_901271\' not found\n
debug1: Unspecified GSS failure.  Minor code may provide more information\nCredentials cache file \'/tmp/krb5cc_901271\' not found\n
debug2: we did not send a packet, disable method
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug2: we did not send a packet, disable method
debug1: Next authentication method: publickey
debug1: Offering public key: /home/build/.ssh/id_dsa
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-dss blen 434
debug2: input_userauth_pk_ok: SHA1 fp be:63:7c:0d:66:1a:23:ec:f8:9b:e3:0f:70:e9:eb:a4:e2:a3:26:f5
debug1: read PEM private key done: type DSA
debug1: Authentication succeeded (publickey).
debug2: fd 5 setting O_NONBLOCK
debug2: fd 6 setting O_NONBLOCK
debug1: channel 0: new [client-session]
debug2: channel 0: send open
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug1: Sending environment.
debug1: Sending env LC_ALL = C
debug2: channel 0: request env confirm 0
debug1: Sending env LANG = en_US.UTF-8
debug2: channel 0: request env confirm 0
debug1: Sending command: /bin/sh -c \'( umask 77 && mkdir -p "` echo /var/tmp/ansible-tmp-1554330491.64-221707721970475 `" && echo ansible-tmp-1554330491.64-221707721970475="` echo /var/tmp/ansible-tmp-1554330491.64-221707721970475 `" ) && sleep 0\'
debug2: channel 0: request exec confirm 1
debug2: fd 3 setting TCP_NODELAY
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel 0: rcvd adjust 2097152
debug2: channel_input_status_confirm: type 99 id 0
debug2: exec request accepted on channel 0
debug2: channel 0: rcvd ext data 330
            ***************************************************\n          ********************************************************\n          ** Direct network login to this account is disallowed /etc/nologin **\n          ********************************************************\n            ***************************************************\n\ndebug2: channel 0: written 330 to efd 6
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
debug2: channel 0: rcvd eow
debug2: channel 0: close_read
debug2: channel 0: input open -> closed
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
debug2: channel 0: obuf empty
debug2: channel 0: close_write
debug2: channel 0: output drain -> closed
debug2: channel 0: rcvd close
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user
debug2: channel 0: gc: user detached
debug2: channel 0: send close
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 1 clearing O_NONBLACK
debug1: fd 2 clearing O_NONBLOCK
Transferred: sent 2840, received 4176 bytes, in 3.0 seconds
Bytes per second: sent 933.4, received 1372.4
debug1: Exit status 1
')
ecomtest03 | UNREACHABLE! => {
    "changed": false,
    "msg": "Authentication or permission failure. In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\". Failed command was: ( umask 77 && mkdir -p \"` echo /var/tmp/ansible-tmp-1554330491.64-221707721970475 `\" && echo ansible-tmp-1554330491.64-221707721970475=\"` echo /var/tmp/ansible-tmp-1554330491.64-221707721970475 `\" ), exited with result 1",
    "unreachable": true
}
7
  • Hi and welcome here. Since your host is unreachable as stated in your error message, nothing was attempted, not even trying to login with your remote user, neither trying to escalate privileges with sudo. You should check carrefully the EXEC ssh... debug line and see what is preventing ansible to reach your remote server. Apr 3, 2019 at 19:49
  • CORRECTED POST (STILL SAME QUESTION)
    – nverkland
    Apr 3, 2019 at 22:38
  • Direct network login to this account is disallowed /etc/nologin Apr 3, 2019 at 23:02
  • Sorry for my latest oneliner comment above without other explanation (it was late and I didn't have time to write or find a good explanation for you). Have a look at this thread for some explanation on the /etc/nologin message. If you are trying to make a solution with restricted commands for the remote_user, you have to be aware that ansible does not run command directly but through python files which are uploaded to the remote server for each task, executed, then removed. Apr 4, 2019 at 6:34
  • [Follow-up from last comment]: I strongly suggest you start your tests with a remote user with "full" shell access and "full" sudo rights and progressively restrict once you're happy with your playbook. Restricting the available commands for the remote_user is going to be a tough work to get something functional, evolutive and stable. Apr 4, 2019 at 6:45

1 Answer 1

0

inuser is not able to create the DEFAULT_LOCAL_TMP which is "~/.ansible/tmp". This causes the error:

"msg": "Authentication or permission failure. In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in "/tmp".

An option would be to fix the problem why inuser is not able to create ~/.ansible/tmp. Probably because /bin/nologin user does not have $HOME.

Easier solution would be to create suggested path rooted in /tmp. For example /tmp/ansible and configure it in /home/build/.ansible.cfg

local_tmp = /tmp/ansible

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .