我正在尝试使用以下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”的引号内。知道怎么解决吗?
我遵循了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')
您在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])