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

问题描述:

这是我的代码,我为主机传递值,但它在localhost上执行命令。我也尝试传递硬编码值并在输出中显示它在给定主机上运行。 下面是代码: -如何在使用ansible-python模块运行时更改主机值?

类认定中,然后,

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": "" 
} 

但它在我的本地主机不是 “110.110.112.139” 创建目录。

+0

而不是play_source =字典( 名= “Ansible播放”, 主机=主机, gather_facts = '不', 任务= [ 字典(动作=字典(模块= '壳',ARGS ='sudo mkdir/tmp/test-ansible'),register ='shell_out'), dict(action = dict(module ='debug',args = dict(msg ='{{shell_out.stdout}}')) ) ] )如果我使用DataLoader()。load_from_file(“playbook”)加载剧本,将其传递给播放,但我得到AttributeError:'NoneType'对象没有属性'upper'。 –

您在__init__内设置connection='local'作为选项。
这意味着Ansible无论目标主机是什么,在本地主机上执行任务。

不要设置它(保留默认值)或使用ssh远程执行任务。

+0

哦真的!谢谢@Konstantin,我做了一个愚蠢的错误...... :-( –

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 
        )