대상 서버에서 ansible 모듈을 실행하려고 시도할 때(bebe를 통해) ssh 연결이 애플리케이션 소유자 사용자가 되기 위해 "sudo"를 수행하는 것으로 나타나지 않습니다. 올바른 원격 사용자가 사용되고 있지만 원격 사용자가 앱 소유자 계정이 되기 위해 "sudo"를 수행하지 않습니다. 사용된 구성과 명령 실행은 아래에 설명되어 있습니다.
대상 서버에서 임시 Ansible 명령과 플레이북을 실행할 수 있을 것으로 기대합니다.
대상 서버에는 2명의 사용자가 있습니다. 제어하려는 애플리케이션의 디렉토리와 데몬을 소유한 사용자 "myapp"입니다. 사용자 "inuser"는 nologin 허용 기능에 /usr/bin/sudo 설정을 갖고 있으며 /etc/passwd에 쉘로 /bin/nologin을 가지고 있습니다. "inuser" 사용자에게는 nologin 허용 기능에 다른 명령/기능이 없습니다(그리고 nologin에 추가 명령을 가져오기가 어렵습니다).
컨트롤러 서버에서는 "build"라는 사용자로 ansible을 실행하고 있습니다. /home/build/.ansible.cfg 파일은 다음과 같습니다.
[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
모듈을 실행하려고 하면 다음과 같은 출력이 표시됩니다.
[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
}
답변1
사용자을(를) 생성할 수 없습니다.DEFAULT_LOCAL_TMP이것은 "~/.ansible/tmp". 이로 인해 오류가 발생합니다.
"msg": "인증 또는 권한 실패. 어떤 경우에는 인증 및 권한이 실패했을 수도 있습니다.대상 디렉터리에 대한 권한이 없습니다. ansible.cfg의 원격 tmp 경로를 "/tmp"에 루트가 있는 경로로 변경하는 것을 고려하십시오..
옵션은 문제를 해결하는 것입니다.사용자생성할 수 없습니다.~/.ansible/tmp. 아마 왜냐하면/bin/nologin사용자에게 $HOME이 없습니다.
더 쉬운 해결책은 다음을 기반으로 제안된 경로를 만드는 것입니다./tmp. 예를 들어/tmp/ansible그리고 그것을 구성/home/build/.ansible.cfg
local_tmp = /tmp/ansible