请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

程序在mac上报错:you must install the sshpass program

老师,您好!
我的程序在centos6上跑,没有问题;但是在mac上跑,就报错,让我安装sshpass。我已经在mac上安装了sshpass了。但是还是报这个错。
{‘success’: {}, ‘failed’: {‘192_168_2_112’: {‘failed’: True, ‘msg’: “to use the ‘ssh’ connection type with passwords, you must install the sshpass program”}}, ‘unreachable’: {}}

老师,我已经安装了sshpass
图片描述

如下是我的代码

#!/usr/bin/env python
# -*- coding=utf-8 -*-
import os,sys

from ansible import constants

PROJECT_ROOT = '/opt/imoocc_py3_online'
sys.path.insert(0,PROJECT_ROOT)
os.environ["DJANGO_SETTINGS_MODULE"] = 'admin.settings.settings'
import django
django.setup()

from collections import namedtuple

from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.inventory.group import Group
#from ansible.inventory.host import Group
from ansible.inventory.host import Host, Group
from ansible.inventory.manager import InventoryManager
from ansible.plugins.callback import CallbackBase
from ansible.parsing.dataloader import DataLoader
from ansible.playbook.play import Play

from ansible.vars.manager import VariableManager

from admin.settings.settings import BASE_DIR


class MyInventory():
    """this is IOPS ansible inventory object."""
    def __init__(self, resource,loader,variable_manager):
        self.resource = resource
        self.loader = DataLoader()
        #self.inventory = InventoryManager(loader=self.loader)
        self.inventory = InventoryManager(loader=self.loader, sources='/tmp/hots')
        self.variable_manager = VariableManager(loader=self.loader, inventory=self.inventory)


        self.dynamic_inventory()

    def add_dynamic_group(self, hosts, groupname, groupvars=None):
        self.inventory.add_group(groupname)
        mygroup = Group(name=groupname)

        if groupvars:
            for k,v in groupvars.items():
                mygroup.set_variable(k,v)

        for host in hosts:
            print("hosts: ",host)
            hostname = host.get("hostname")
            hostip = host.get('ip')
            hostport = host.get('port')
            username = host.get('username')
            password = host.get('password')
            #myhost = Host(name=hostname, port=hostname)
            #myhost = Host(name=hostname, port=hostport)
            myhost = Host(name=hostip, port=hostport)
            self.variable_manager.set_host_variable(host=myhost, varname='ansible_ssh_host', value=hostip)
            self.variable_manager.set_host_variable(host=myhost, varname='ansible_ssh_port', value=hostport)
            self.variable_manager.set_host_variable(host=myhost, varname='ansible_ssh_user', value=username)
            self.variable_manager.set_host_variable(host=myhost, varname='ansible_ssh_pass', value=password)

            for key, value in host.items():
                if key not in ["hostname", "port", "username", "password"]:
                    self.variable_manager.set_host_variable(host=myhost,varname=key,value=value)

            self.inventory.add_host(host=hostname, group=groupname, port=hostport)

            #print("self.inventory.add_host: ", self.inventory.groups)




    def dynamic_inventory(self):
        """
            add hosts to inventory.
        """
        print('ninhao',self.resource.items())
        if isinstance(self.resource, list):
            print('list')
        elif isinstance(self.resource, dict):
            for groupname, hosts_and_vars in self.resource.items():
                print("for:",groupname, hosts_and_vars)
                #self.add_dynamic_group(hosts_and_vars['hosts'], groupname, hosts_and_vars['vars'])
                self.add_dynamic_group(hosts_and_vars.get("hosts"),groupname, hosts_and_vars.get("vars"))

        #if isinstance(self.resource, list):
            #self.add_dynamic_group(self.resource, 'default_group')
        #elif isinstance(self.resource, dict):
            #for groupname, hosts_and_vars in self.resource.iteritems():
            #for groupname, hosts_and_vars in self.resource.items():
                #self.add_dynamic_group(hosts_and_vars.get("hosts"), groupname, hosts_and_vars.get("vars"))

class ModelResultsCollector(CallbackBase):

    def __init__(self, *args, **kwargs):
        super(ModelResultsCollector, self).__init__(*args, **kwargs)
        self.host_ok = {}
        self.host_unreachable = {}
        self.host_failed = {}

    def v2_runner_on_unreachable(self, result):
        self.host_unreachable[result._host.get_name()] = result

    def v2_runner_on_ok(self, result,  *args, **kwargs):
        self.host_ok[result._host.get_name()] = result

    def v2_runner_on_failed(self, result,  *args, **kwargs):
        self.host_failed[result._host.get_name()] = result


class ANSRunner(object):
    def __init__(self,resource,*args, **kwargs):
        self.resource = resource
        self.inventory = None
        self.variable_manager = None
        self.loader = None
        self.options = None
        self.passwords = None
        self.callback = None
        self.__initializeData()
        self.results_raw = {}

    def __initializeData(self):
        """ 初始化ansible """
        Options = namedtuple('Options',
                             [
                                 'connection',
                                 'module_path',
                                 'forks',
                                 'timeout',
                                 'remote_user',
                                 'ask_pass',
                                 'private_key_file',
                                 'ssh_common_args',
                                 'ssh_extra_args',
                                 'sftp_extra_args',
                                 'scp_extra_args',
                                 'become',
                                 'become_method',
                                 'become_user',
                                 'ask_value_pass',
                                 'verbosity',
                                 'check',
                                 'listhosts',
                                 'listtasks',
                                 'listtags',
                                 'syntax',
                                 'diff'
                             ])
        self.loader = DataLoader()
        self.options = Options(
            connection='smart',
            module_path=None,
            forks=100,
            timeout=10,
            remote_user='root',
            ask_pass=False,
            private_key_file=None,
            ssh_common_args=None,
            ssh_extra_args=None,
            sftp_extra_args=None,
            scp_extra_args=None,
            become=None,
            become_method=None,
            become_user='root',
            ask_value_pass=False,
            verbosity=None,
            check=False,
            listhosts=False,
            listtasks=False,
            listtags=False,
            syntax=False,
            diff=True
        )

        self.passwords = dict(sshpass=None, becomepass=None)
        myinvent = MyInventory(self.resource, self.loader, self.variable_manager)
        #print("self.resource:",self.resource) #{'dynamic_host_test': {'hosts': [{'username': 'user', 'password': 'p#sswS0816Hrd#', 'ip': '10.54.70.129', 'hostname': 'zhoushuyu', 'port': '22'}], 'vars': {'var1': 'ansible'}}}
        #print("self.inventory", self.inventory) #None
        #print("self.variable_manager", self.variable_manager) #None
        self.inventory = myinvent.inventory
        self.variable_manager = myinvent.variable_manager

    def run_model(self, host_list, module_name, module_args):
        play_source = dict(
            name="Ansible ad-hoc",
            hosts=host_list,
            gather_facts='no',
            tasks=[dict(action=dict(module=module_name, args=module_args))]
        )

        play = Play().load(play_source,variable_manager=self.variable_manager,loader=self.loader)
        tqm = None
        self.callback = ModelResultsCollector()
        tqm = TaskQueueManager(
            inventory=self.inventory,
            variable_manager=self.variable_manager,
            loader=self.loader,
            options=self.options,
            passwords=self.passwords,
            stdout_callback="minimal",
        )
        tqm._stdout_callback = self.callback
        constants.HOST_KEY_CHECKING = False
        tqm.run(play)

    def get_model_result(self):
        self.results_raw = {'success':{}, 'failed':{}, 'unreachable':{}}
        for host, result in self.callback.host_ok.items():
            hostvisiable = host.replace('.','_')
            self.results_raw['success'][hostvisiable] = result._result


        for host, result in self.callback.host_failed.items():
            hostvisiable = host.replace('.','_')
            self.results_raw['failed'][hostvisiable] = result._result


        for host, result in self.callback.host_unreachable.items():
            hostvisiable = host.replace('.','_')
            self.results_raw['unreachable'][hostvisiable]= result._result

        # return json.dumps(self.results_raw)
        return self.results_raw


if __name__ == '__main__':
    resource = {
        "dynamic_host_test": {
            "hosts": [
                {'username': 'root', 'password': 'password', 'ip': '192.168.2.112', 'hostname': 'zoushuyu',
                 'port': '22'}
            ],
            "vars": {
                "var1": "ansible",
            }
        }
    }

    rbt = ANSRunner(resource)
    rbt.run_model(host_list=['192.168.2.112'], module_name='shell', module_args="uname -a")
    print(rbt.get_model_result())

完整报错如下:
{‘success’: {}, ‘failed’: {‘192_168_2_112’: {‘failed’: True, ‘msg’: “to use the ‘ssh’ connection type with passwords, you must install the sshpass program”}}, ‘unreachable’: {}}

并且,我是可以从mac上ssh到192.168.2.112这台服务器上的
图片描述

请问老师这是为什么呢?

正在回答 回答被采纳积分+3

1回答

Jeson 2019-10-30 09:01:02

问题的意思还是没有安装sshpass.

如果你源码的方式安装了,需要检查下sshpass命令在系统上是否能真正得到执行。可以执行下sshpass命令测试下。

mac下,可以参考用如下方式安装:

brew create https://sourceforge.net/projects/sshpass/files/sshpass/1.06/sshpass-1.06.tar.gz --force

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号