引号Python 2.7中的错误是哪个

问题描述 投票:0回答:1

我正在尝试使用以下def以自动方式配置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”的引号内。知道怎么解决吗?

UPDATE

我遵循了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个回答
0
投票

您在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.callos.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])
© www.soinside.com 2019 - 2024. All rights reserved.