Fabric: `sudo`κ°€ μžˆλŠ” νŒŒμΌμ„ `context.put`ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 05μ›” 14일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: fabric/fabric

v2μ—μ„œλŠ” use_sudo=True λ§€κ°œλ³€μˆ˜κ°€ 더 이상 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
원격 ν˜ΈμŠ€νŠΈμ—μ„œ νŒŒμΌμ„ λ³΅μ‚¬ν•˜λ €κ³  ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

Traceback (most recent call last):
  File "env/bin/fab", line 9, in <module>
    load_entry_point('fabric==2.0.0', 'console_scripts', 'fab')()
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/invoke/program.py", line 332, in run
    self.execute()
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/invoke/program.py", line 480, in execute
    executor.execute(*self.tasks)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/invoke/executor.py", line 133, in execute
    result = call.task(*args, **call.kwargs)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/invoke/tasks.py", line 127, in __call__
    result = self.body(*args, **kwargs)
  File "/home/tim/Workspace/wintest/fabfile.py", line 131, in nginx
    context.put(StringIO(nginx_conf), remote='/etc/nginx/sites-enabled/website')
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/fabric/connection.py", line 639, in put
    return Transfer(self).put(*args, **kwargs)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/fabric/transfer.py", line 213, in put
    sftp.putfo(fl=local, remotepath=remote)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/paramiko/sftp_client.py", line 683, in putfo
    with self.file(remotepath, 'wb') as fr:
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/paramiko/sftp_client.py", line 341, in open
    t, msg = self._request(CMD_OPEN, filename, imode, attrblock)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/paramiko/sftp_client.py", line 780, in _request
    return self._read_response(num)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/paramiko/sftp_client.py", line 832, in _read_response
    self._convert_status(msg)
  File "/home/tim/Workspace/wintest/env/lib/python3.5/site-packages/paramiko/sftp_client.py", line 863, in _convert_status
    raise IOError(errno.EACCES, text)
PermissionError: [Errno 13] Permission denied

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@geoffrey-eisenbarth ν˜„μž¬λ‘œμ„œλŠ” 이에 λŒ€ν•œ "좕볡받은" μ ‘κ·Ό 방식이 μ—†μŠ΅λ‹ˆλ‹€. http://www.fabfile.org/upgrading.html#file -transferμ—μ„œ sudo에 λŒ€ν•œ λ‚΄μš©μ„ μ°Έμ‘°ν•˜μ„Έμš”.

μ§€κΈˆμ€ λ‹€μŒκ³Ό 같은 기본적인 μž‘μ—…μ„ ν•˜κ³  싢을 κ²ƒμž…λ‹ˆλ‹€.

c.put("path/to/local/nginx.conf") # implicit to remote $HOME
c.sudo("mv nginx.conf /etc/nginx/") # again implicitly with a CWD of $HOME

λͺ¨λ“  3 λŒ“κΈ€

이것은 http://docs.fabfile.org/en/latest/upgrading.html#id15에 λ¬Έμ„œν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이것에 λŒ€ν•œ 쒋은 단일 λͺ…λ Ή λŒ€μ²΄ν’ˆμ΄ μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ c.sudo("install … /dev/stdin /path/to/remote") λ₯Ό μ‚¬μš©ν•  수 μ—†μœΌλ©° tee 의 μ‚¬μš©μ„ λ°©ν•΄ν•˜λŠ” sudo() 에 버그가 μžˆλŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. tee (μ’…λ£Œλ˜μ§€ μ•Šκ³  λͺ…령이 μž…λ ₯을 기닀리고 μžˆλŠ” μƒνƒœλ‘œ λ‘‘λ‹ˆλ‹€).

λ‹€μŒμ€ μž„μ‹œ 파일 λŒ„μŠ€λ₯Ό μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©ν•œ κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” νŒŒμΌμ— μ˜λ„ν•˜μ§€ μ•Šμ€ κΆŒν•œμ„ 남기지 μ•Šλ„λ‘ 항상 ν•΄μ•Ό ν•˜λŠ” μΌμž…λ‹ˆλ‹€.

def sudo_install(connection, source, dest, *, owner='root', group='root', mode='0600'):
    """
    Helper which installs a file with arbitrary permissions and ownership

    This is a replacement for Fabric 1's `put(…, use_sudo=True)` and adds the
    ability to set the expected ownership and permissions in one operation.
    """

    mktemp_result = connection.run('mktemp', hide='out')
    assert mktemp_result.ok

    temp_file = mktemp_result.stdout.strip()

    try:
        connection.put(source, temp_file)
        connection.sudo(f'install -o {owner} -g {group} -m {mode} {temp_file} {dest}')
    finally:
        connection.run(f'rm {temp_file}')

예λ₯Ό λ“€μ–΄ 호좜됨

<strong i="14">@task</strong>
def install_mount_status_monitor(conn):
    sudo_install(conn, override_file, "/etc/systemd/system/mount_status_monitor.service.d/override.conf")

μ‚¬μš©μžμ˜ ν™ˆ 디렉토리 외뢀에 μžˆλŠ” 원격 μ„œλ²„μ— 둜컬 νŒŒμΌμ„ λ³΅μ‚¬ν•˜λ €κ³  ν•  λ•Œ μ‚¬μš©ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜λŠ” κ²½λ‘œμž…λ‹ˆκΉŒ?

Fabric을 μ‚¬μš©ν•˜κ³  νŒŒμΌμ„ /etc/nginx/에 λ³΅μ‚¬ν•˜λŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ? upload_template 등을 μ‚¬μš©ν•˜λŠ” fabric2 방법을 μ°ΎμœΌλ €κ³ ν•©λ‹ˆλ‹€.

@geoffrey-eisenbarth ν˜„μž¬λ‘œμ„œλŠ” 이에 λŒ€ν•œ "좕볡받은" μ ‘κ·Ό 방식이 μ—†μŠ΅λ‹ˆλ‹€. http://www.fabfile.org/upgrading.html#file -transferμ—μ„œ sudo에 λŒ€ν•œ λ‚΄μš©μ„ μ°Έμ‘°ν•˜μ„Έμš”.

μ§€κΈˆμ€ λ‹€μŒκ³Ό 같은 기본적인 μž‘μ—…μ„ ν•˜κ³  싢을 κ²ƒμž…λ‹ˆλ‹€.

c.put("path/to/local/nginx.conf") # implicit to remote $HOME
c.sudo("mv nginx.conf /etc/nginx/") # again implicitly with a CWD of $HOME
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰