代码之家  ›  专栏  ›  技术社区  ›  Govind Dubey

在使用ansible python模块运行时,如何更改ansible的主机值?

  •  1
  • Govind Dubey  · 技术社区  · 7 年前

    这是我的代码,我正在为主机传递值,但它正在本地主机上执行命令。我还尝试传递硬编码的值,在输出中显示它在给定的主机上运行。 代码如下:-

    def __init__(self):
        self.variable_manager = VariableManager()
        self.loader = DataLoader()
        self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager, host_list="host")
        Options = namedtuple('Options', ['listtags', 'listtasks', 'listhosts', 'syntax', 'connection','module_path', 'forks', 'remote_user', 'private_key_file', 'ssh_common_args', 'ssh_extra_args', 'sftp_extra_args', 'scp_extra_args', 'become', 'become_method', 'become_user', 'verbosity', 'check'])
        self.options = Options(listtags=False, listtasks=False, listhosts=True, syntax=False, connection='local', module_path=None, forks=100, remote_user='ubuntu', private_key_file="/tmp/xxx-key2.pem", ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None, become=False, become_method=None, become_user='root', verbosity=None, check=False)
    
    def execute_playbook(self, playbook, host, scriptname=None, command=None,
                         path=None, username=None, password=None, key=None):
        if not os.path.exists(playbook):
            print '[INFO] The playbook does not exist'
            sys.exit()
    
        script_path = None
        if scriptname is not None:
            script_path = os.getcwd() + '/' + scriptname
            if not os.path.exists(script_path):
                print '[INFO] The script does not exist'
                sys.exit()
        self.variable_manager.extra_vars = {'scriptname': script_path,
                            'host': host, 'command': command, 'path': path} # This can accomodate various other command line arguments.`
        passwords = {}
        if password is not None:
            self.loader.set_vault_password(password)
        play_source =  dict(
            name = "Ansible Play",
            hosts = host,
            gather_facts = 'no',
            tasks = [
                dict(action=dict(module='shell', args='sudo mkdir /tmp/test-ansible'), register='shell_out'),
                dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))
             ]
        )
        play = Play.load(play_source, self.variable_manager, self.loader)
    
        tqm = TaskQueueManager(
            inventory=self.inventory,
            variable_manager=self.variable_manager,
            loader=self.loader,
            options=self.options,
            passwords=passwords,
        )
    
        try:
            result = tqm.run(play)
        except Exception as e:
            print e, "Exception in Ansible tqm.run()"
    

    输出为:-

    PLAY [Ansible Play] *************************************************************************************************************************
    
    TASK [command] ******************************************************************************************************************************
    [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo
    
    changed: [110.110.112.139]
    
    TASK [debug] ********************************************************************************************************************************
    ok: [110.110.112.139] => {
    "msg": ""
    }
    

    2 回复  |  直到 7 年前
        1
  •  2
  •   Konstantin Suvorov    7 年前

    你设置了 connection='local' __init__ .
    这意味着,无论目标主机是什么,都要在本地主机上执行任务。

    ssh

        2
  •  1
  •   Bharat    7 年前
    def __init__(self):
        self.variable_manager = VariableManager()
        self.loader = DataLoader()
        self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager, host_list="host")
        Options = namedtuple('Options', ['listtags', 'listtasks', 'listhosts', 'syntax', 'connection','module_path', 'forks', 'remote_user', 'private_key_file', 'ssh_common_args', 'ssh_extra_args', 'sftp_extra_args', 'scp_extra_args', 'become', 'become_method', 'become_user', 'verbosity', 'check'])
        self.options = Options(listtags=False,
                               listtasks=False,
                               listhosts=True,
                               syntax=False,
                               **connection='ssh'**, 
                               module_path=None,
                               forks=100, remote_user='ubuntu', 
                               private_key_file="/tmp/xxx-key2.pem", 
                               ssh_common_args=None,
                               ssh_extra_args=None,
                               sftp_extra_args=None,
                               scp_extra_args=None,
                               become=False,
                               become_method=None,
                               become_user='root', verbosity=None,
                               check=False
                       )