如何通过ansible-playbook运行本地命令

Nan*_*n A 7 ansible

我正在尝试运行一些本地命令,迭代库存文件并将每个主机名作为参数传递给本地命令.

例如:我想在我的本地机器(笔记本电脑)中运行命令"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 }}"
Run Code Online (Sandbox Code Playgroud)

和我的库存文件看起来像:

[qa-hosts]
10.10.10.11 hostname=example-server-1
Run Code Online (Sandbox Code Playgroud)

当然,它不会工作,因为库存有'qa-hosts'而且游戏是'127.0.0.1',因为我希望该游戏从我的本地机器运行.

有人会帮我理解如何完成它.基本上,我想获取变量'hostname'并将其传递给上面的play块.

Jac*_*ack 7

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

---
- 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
Run Code Online (Sandbox Code Playgroud)


tux*_*tux 6

您可以使用以下 play 访问主机名,因为清单信息可作为主机变量使用。

- 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'] }}"
Run Code Online (Sandbox Code Playgroud)


jwa*_*att 5

另一种选择是local_action

在两者delegate_to和的情况下local_action,请注意,如果become = yes那么 Ansible 当然会隐式地尝试调用操作 using sudo,然后可能会失败,因为 local 的密码sudo将与您为 remote 输入的任何密码不同sudo