首页 文章

Ansible模块是在本地运行还是在远程主机上运行?

提问于
浏览
1

我正在运行一个使用 route53 模块的Ansible playbook并收到错误消息,说我需要安装'boto':

TASK [dns : Retrieve DNS record] ***********************************************
fatal: [10.13.25.12]: FAILED! => {"changed": false, "failed": true, "msg": "boto required for this module"}

我的Ansible机器上安装了'boto' .

Question: Do all Ansible modules cited in Playbook tasks actually run on the remote host machine?

我添加了安装'python-pip'和'boto'的任务,但似乎boto应该在我的Ansible服务器上运行 . 我觉得我在这里做错了什么 .

以下是我在远程主机上安装pip / boto的任务,这导致在运行route53模块时不会出现更多错误:

- name: Install Pip
  apt: name=python-pip state=present

- name: Install boto
  pip: name=boto

2 回答

  • 3

    模块远程执行 . 虽然这只是事实的一半 . 许多模块都带有动作插件 . 这些操作插件在本地运行并稍后调用其模块组件(或其他模块) .

    例如, template 模块实际上是一个动作插件,它在本地呈现模板,然后调用复制模块 .

    遗憾的是,如果不查看源代码,您无法知道什么是模块以及什么是动作插件 . 文档甚至没有提到动作插件确实存在...

    你可以找到所有核心动作插件here . 正如您所看到的,没有route53插件,因此这确实是一个模块,因此可以远程运行 .

    为什么你在安装boto后仍然得到这个错误我无法解释 . 我只能建议你look at the source并尝试在没有Ansible的情况下重现问题 .

    这几个import语句在远程计算机上运行时没有错误 .

    import boto
    import boto.ec2
    from boto import route53
    from boto.route53 import Route53Connection
    from boto.route53.record import Record, ResourceRecordSets
    from boto.route53.status import Status
    
  • 5

    Udondan's answer介绍了一些模块如何具有本地组件以及远程操作,但对于一般用途,您需要知道的是,对于与远程服务(例如所有cloud modules)交互的这些模块而不是远程主机最好将这些作为local action运行,以强制Ansible在本地运行模块,而不是在playbook /角色当前所针对的远程主机上运行 .

    您可以在任务定义中使用 local_action 轻松完成此操作,如下所示:

    - name: Retrieve DNS record
      local_action:
        module: route53_facts
        query: record_sets
        hosted_zone_id: '{{ route53_hosted_zone_id }}'
        ...
      register: dns_records
    

相关问题