python - 用于更新远程服务器的 FABRIC 功能

标签 python linux bash ubuntu fabric

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

在我们的服务器上远程运行脚本(来自 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

    此函数运行操作系统的更新和升级,复制并运行 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 脚本(广告 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 权限的相同用户,就像在临时服务器上一样。两个用户都具有相同的测试通过。我还尝试像特定用户一样在 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 远程命令运行,但我们经常恢复服务器,所以我不得不经常生成新 key 。所以这不是办法。

我做了一些调查并重写了我的 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权限,但问题仍然存在

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

最佳答案

here建议使用 -S 选项:

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

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

here是关于从 /etc/sudoers 文件

中删除 Defaults requiretty 的建议

关于python - 用于更新远程服务器的 FABRIC 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34318647/

相关文章:

python - 如何使用 django-celery 配置 TASK_SERIALIZER

用于检查 csv 文件中每个字段长度的 LINUX 脚本

python - 在 100 GB 的文件中搜索字符串

python - 如果列的所有元素均为负数,则 pandas 切片列

python - 在 Django Rest Framework 中找不到资源时返回自定义 404 错误

python - 不断增长的 matplotlib 条形图

linux - 如何将多行更改为列

linux - DNS 服务器无法正确转发,我们与 CloudFlare 进行了交谈,它只是无法正确配置

linux - 从 Windows 到 Linux 的远程编码

bash - Shell 脚本退出代码 - 无法设置