【问题标题】:how to run local command via ansible-playbook如何通过 ansible-playbook 运行本地命令
【发布时间】:2019-11-28 10:23:45
【问题描述】:

我正在尝试运行一些本地命令,遍历清单文件并将每个主机名作为本地命令的参数。

例如:我想在我的本地机器(笔记本电脑)上运行命令“knife node create {{ hostname }}”。剧本是:

- name: Prep node
  hosts: 127.0.0.1
  connection: local
  gather_facts: no
  tasks:
  - name: node create
    command: "knife node create {{ hostname | quote }}"

我的库存文件如下所示:

[qa-hosts]
10.10.10.11 hostname=example-server-1

当然,它不会起作用,因为库存有“qa-hosts”,并且该剧适用于“127.0.0.1”,因为我希望该剧从我的本地机器上运行。

有没有人能帮我想想如何完成它。基本上,我想获取变量“主机名”并将其传递给上面的播放块。

【问题讨论】:

    标签: ansible


    【解决方案1】:

    我喜欢 delegate_to。这是一个在 localhost 上为每个主机运行 getent hosts 的示例:

    ---
    - hosts: all
      connection: ssh
      gather_facts: true
      tasks:
      - name: Lookup ansible_hostname in getent database
        command: getent hosts {{ ansible_hostname }}
        delegate_to: localhost
        register: result
    
      - name: Show results
        debug:
          var: result.stdout
        delegate_to: localhost
    

    【讨论】:

    • 非常感谢!我正在寻找如何从 ansible 机器而不是目标主机使用我的 API,这只是整个角色的一部分。这也适用于 ansible uri 部分。
    【解决方案2】:

    您可以使用以下播放访问主机名,因为库存信息可作为主机变量使用。

    - hosts: 127.0.0.1   
      connection: local
      gather_facts: no
    
      tasks:
        - debug: var=hostvars
    
        - name: node create
          command: "knife node create {{ hostvars[item]['hostname'] }}"
          with_items:
            - "{{ groups['qa-hosts'] }}"
    

    【讨论】:

      【解决方案3】:

      另一种选择是local_action

      对于delegate_tolocal_action,请注意如果become = yes 那么Ansible 当然会隐式尝试使用sudo 调用该操作,然后可能会失败,因为本地@ 的密码987654326@ 将不同于您为远程sudo 输入的任何密码。

      【讨论】:

      • 嗯,是的,但只需将host_vars/localhost.yml 添加到您的库存或剧本目录中,然后将ansible_become_password 放在那里。如果你愿意,你可以把它放在ansible-vault
      猜你喜欢
      • 2020-09-07
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      相关资源
      最近更新 更多