【问题标题】:Which is the error inside the quotes Python 2.7这是引号内的错误Python 2.7
【发布时间】:2019-04-22 15:14:01
【问题描述】:

我正在尝试使用以下定义以自动方式配置 Ansible:

   def configure_ansible():
    with open('/etc/hosts', 'r') as f:
         valid_ips=[line.split(None, 1)[0] for line in f]
    if os.path.isfile('/etc/ansible/hosts'): 
         open('/etc/ansible/hosts', 'w').close()
    os.system('cp /etc/hosts /etc/ansible/hosts')
    for valid_ip in valid_ips:
         os.system("sudo sed -i '14 s/^#//g' /etc/ansible/ansible.cfg")
         os.system("sudo sed -i '22 s/^#//g' /etc/ansible/ansible.cfg")
         if valid_ip == "localhost":
            os.system("su - ansible -c 'echo -e '\n\n\n' | ssh-keygen -t rsa'")
            os.system("su - ansible -c 'ssh-copy-id ansible@"+valid_ip)

看起来问题出在最后一个“if”的引号内。知道我该如何解决吗?

更新

我已遵循 chepner 的建议,但最后一行无法正常工作。如果我使用如下代码,则 ssh-copy-id 没有正确执行并且 ssh 密钥没有交换。我还需要引入密码来完全自动化这个过程。知道我怎么能做到这一点吗? 这是我尝试过的:

def create_user():
    users=["dante", "ansible"]
    with open('/etc/hosts', 'r') as f:
         valid_ips=[line.split(None, 1)[0] for line in f]
    for valid_ip in valid_ips:
        for user in users:
           subprocess.call(["sudo", "useradd", user])
           passwd_users = subprocess.Popen(["sudo", "passwd", user], stdin = subprocess.PIPE)
           passwd_users.communicate(input = "test123\ntest123")
           sudoers = open("/etc/sudoers", 'a')
           sudoers.write(user + "  ALL=(ALL) NOPASSWD: ALL \n")
           sudoers.close()

def configure_ansible():
    with open('/etc/hosts', 'r') as f:
         valid_ips=[line.split(None, 1)[0] for line in f]
    if os.path.isfile('/etc/ansible/hosts'):
         open('/etc/ansible/hosts', 'w').close()
    os.system('cp /etc/hosts /etc/ansible/hosts')
    config = "/etc/ansible/ansible.cfg"
    for valid_ip in valid_ips:
        subprocess.call(["sudo", "sed", "-i", "14 s/^#//g", config])
        subprocess.call(["sudo", "sed", "-i", "22 s/^#//g", config])
        if valid_ip == "localhost":
           keygen = subprocess.Popen(["sudo", "-u", "ansible", "ssh-keygen", "-t", "rsa"], stdin = subprocess.PIPE)
           keygen.communicate(input = "\n\n\n")
           copy_keygen = subprocess.Popen(["sudo", "-u", "ansible", "ssh-copy-id", "-o StrictHostKeyChecking=no", valid_ip], stdin = subprocess.PIPE)
           copy_keygen.stdin.write('test123\n')

【问题讨论】:

  • 倒数第二行,为什么行尾多了一个'?
  • 在你的最后一行,为什么你有一个额外的'在最后?

标签: python quotes os.system


【解决方案1】:

您在对os.system 的调用中缺少结束单引号:

os.system("su - ansible -c 'ssh-copy-id ansible@"+valid_ip+"'")

但是,shell 不允许嵌套单引号;之前的调用应该类似于:

os.system("su - ansible -c 'echo -e \"\n\n\n\" | ssh-keygen -t rsa'")

更好的是,在所有情况下都更喜欢subprocess.call 而不是os.system

config = "/etc/ansible/ansible.cfg"
for valid_ip in valid_ips:
     subprocess.call(["sudo", "sed", "-i", "14 s/^#//g", config])
     subprocess.call(["sudo", "sed", "-i", "22 s/^#//g", config])
     if valid_ip == "localhost":
        p = subprocess.Popen(["sudo", "-u", "ansible", "ssh-keygen", "-t", "rsa"])
        p.communicate("\n\n\n")
        subprocesss.call(["sudo", "-u", "ansible", "ssh-copy-id", "ansible@" + valid_ip])

【讨论】:

  • 感谢您的提示。它非常接近我想要实现的目标。仍然缺少密码部分,无法使用 Python 进行全自动 Ansible 配置。我已经用代码更新了问题。有什么想法可以修复最后一部分吗?
  • 配置sudo,这样你就可以在没有密码的情况下运行这些命令。
  • 我有执行此操作的“create_user”def,但问题仍然存在于包含 copy_keygen 变量的最后两行,因为在这些行之后没有交换密钥。整个脚本,直到那里工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多