【问题标题】:FABRIC function for update remote server用于更新远程服务器的 FABRIC 功能
【发布时间】:2016-03-22 23:31:48
【问题描述】:

解密我做什么/我想要什么:

在我们的服务器上远程运行脚本(来自 Ubuntu 14.04、Python 2.7.6、 我想在 Ubuntu 12.04 和 Ubuntu 14.04 上执行脚本)。此脚本将挂载加密卷并设置正确的主机名并确认服务器处于暂存环境中。

我做了什么:

  1. 我创建了 EXPECT 脚本(scripts/auto_mounth.sh - 多亏了这个,我能够运行交互式脚本,该脚本会自动输入安装分区的密码,调用主机名并输入并确认服务器处于暂存环境中

  2. 我创建了 FABRIC 函数

    一个。在这个函数中我设置了 env.user & env.password

    b.此函数运行操作系统的更新和升级,并复制和运行 EXPECT 脚本(用于挂载加密卷)

     import os
     import sys
     import time
     import boto
     import deployment
     import getpass
     import sys
    
     env.user = 'my_user'
     env.password = 'my_sudo_pass"
    
     def staging_auto_mount():
         # install expect
         sudo('apt-get update', pty=False)
         sudo('apt-get -y dist-upgrade', pty=False)
         sudo('apt-get -y autoclean', pty=False)
         sudo('apt-get -y install expect', pty=False)
         # auto mount EBS volume
         sudo('mkdir -p /scripts/', pty=False)
         put('scripts/auto_mount.sh', '/scripts/', use_sudo=True, mode=0755)
         run('/scripts/auto_mount.sh')
         sudo('rm -rf /scripts/')
    
  3. 我创建了 BASH 脚本 (/home/scripts/staging_server01.sh) - 我只是输入了这个脚本命令来运行 FABric 函数

         cd /scripts/ && /usr/local/bin/fab staging_auto_mount -H XXX.xxx.XXX.xxx
    

我的问题如下:

当我手动运行它时,一切正常,我可以像运行 BASH 脚本(ad 3.)一样

/home/scripts/staging_server01.sh

或者我可以运行 FABric 函数

cd /scripts/ && /usr/local/bin/fab staging_auto_mount -H XXX.xxx.XXX.xxx

但是当我将它放入 crontab 时出现问题

我如何设置 crontab 作业,我尝试了几件事

08 07 * * * cd /scripts/ && /usr/local/bin/fab staging_auto_mount -H XXX.xxx.XXX.xxx --password='my_SUDO_PASS'
08 07 * * * cd /scripts/ && /usr/local/bin/fab staging_auto_mount -H XXX.xxx.XXX.xxx
08 07 * * * /home/scripts/staging_server01.sh

(在我的本地环境中,我使用具有相同 sudo 权限的同一用户,就像在登台服务器上一样。两个用户都具有相同的 PASS 用于我的测试。我还尝试像特定用户一样在 crontab 作业中运行命令)

在日志中我看到了这个:

/usr/lib/python2.7/getpass.py:83: GetPassWarning: Can not control echo on the terminal.
  passwd = fallback_getpass(prompt, stream)
Warning: Password input may be echoed.

我正在考虑使用 SSL 并通过 SSL 远程命令运行,但我们经常恢复服务器,所以我必须经常生成新密钥。所以这不是办法。

我做了一些调查,我重写了我的 FABric 函数,我也被困在这个问题上。老实说,我遇到了更大的代码问题[当我手动或通过 crontab 运行时,我无法创建目录和复制文件(权限问题或日志告诉我目录已经存在)]

import os
import sys
import time
import boto
import deployment
import getpass
import sys
import shutil
import os.path

env.user = 'my_user'
env.password = 'my_sudo_pass'
path = "/home/scripts/"

def staging_auto_mount():
    # install expect
    os.system("sudo -p " + "env.password" + " apt-get update")
    os.system("sudo -p " + "env.password" + " apt-get -y dist-upgrade")
    os.system("sudo -p " + "env.password" + " apt-get -y autoclean")
    os.system("sudo -p " + "env.password" + " apt-get -y install expect")

通过 crontab 我可以得到这个错误

Message-Id: <20151215212901.3404CA0B02@vm01-ubuntu>
Date: Tue, 15 Dec 2015 15:29:01 -0600 (CST)

    sudo: no tty present and no askpass program specified
    sudo: no tty present and no askpass program specified
    sudo: no tty present and no askpass program specified
    sudo: no tty present and no askpass program specified
    [XXX.xxx.XXX.xxx] Executing task 'staging_auto_mount'

关于上面的错误我尝试在visudo中设置特定的NOPASSWORD权限,但是问题依旧存在

如果有任何帮助,我将不胜感激

【问题讨论】:

    标签: python linux bash ubuntu fabric


    【解决方案1】:

    here 建议使用-S 选项:

    echo <password> | sudo -S apt-get smth
    

    sudo -S 从标准输入读取密码。

    here 是关于从/etc/sudoers 文件中删除Defaults requiretty 的建议

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 2017-07-26
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2017-09-17
      • 1970-01-01
      相关资源
      最近更新 更多