是否可以在Ansible主机上运行命令?

我的场景是,我想从内部托管的git服务器(在公司防火墙之外无法访问)进行签出。然后,我想将签出(压缩)上传到生产服务器(外部托管)。

目前,我正在考虑运行一个执行签出的脚本,tarball它,然后运行部署脚本-但如果我可以将其集成到Ansible,那将是更可取的。


当前回答

你可以使用delegate_to在你的Ansible主机(管理主机)上运行命令,从那里你正在运行你的Ansible play。例如:

删除Ansible主机上已经存在的文件:

 - name: Remove file if already exists
   file:
    path: /tmp/logfile.log
    state: absent
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

在Ansible主机上创建一个新文件:

 - name: Create log file
   file:
    path: /tmp/logfile.log
    state: touch
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

其他回答

是的,您可以在Ansible主机上执行命令。您可以指定一个游戏中的所有任务在Ansible主机上运行,或者您可以标记单个任务在Ansible主机上运行。

如果你想在Ansible主机上运行整个剧本,那么在剧本中指定hosts: 127.0.0.1和connection:local,例如:

    - name: a play that runs entirely on the ansible host
      hosts: 127.0.0.1
      connection: local
      tasks:
      - name: check out a git repository
        git: repo=git://foosball.example.org/path/to/repo.git dest=/local/path

更多细节请参见Ansible文档中的Local Playbooks。

如果你只想在你的Ansible主机上运行一个任务,你可以使用local_action指定一个任务应该在本地运行。例如:

    - name: an example playbook
      hosts: webservers
      tasks:
      - ...

      - name: check out a git repository
        local_action: git repo=git://foosball.example.org/path/to/repo.git dest=/local/path

更多细节请参见Ansible文档中的“控制任务运行的位置:委托和本地操作”。


你可以通过添加这个到你的库存来避免在你的游戏中输入connection: local:

localhost ansible_connection=local

(这里你会使用“localhost”而不是“127.0.0.1”来指代游戏)。


在Ansible的新版本中,你不再需要将上面的行添加到你的库存中,Ansible假设它已经在那里。

恕我直言,我发现了一些其他的方法来写这些东西,它们更容易读。

    - name: check out a git repository
      local_action: 
        module: git
        repo: git://foosball.example.org/path/to/repo.git
        dest: /local/path

OR

    - name: check out a git repository
      local_action: git
      args:
        repo: git://foosball.example.org/path/to/repo.git
        dest: /local/path

我想分享Ansible可以通过shell在localhost上运行:

Ansible all -i "localhost ", -c local -m shell -a 'echo hello world'

这可能对简单的任务或Ansible的一些实践学习有帮助。

代码示例摘自这篇好文章:

在本地主机运行ansible playbook

扩展@gordon的回答,这里有一个可读的语法和参数通过shell/命令模块传递的示例(这些与git模块的不同之处是,有必需的但自由形式的参数,如@ander所述)

- name: "release tarball is generated"
  local_action:
    module: shell
    _raw_params: git archive --format zip --output release.zip HEAD
    chdir: "files/clones/webhooks"

你可以使用delegate_to在你的Ansible主机(管理主机)上运行命令,从那里你正在运行你的Ansible play。例如:

删除Ansible主机上已经存在的文件:

 - name: Remove file if already exists
   file:
    path: /tmp/logfile.log
    state: absent
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

在Ansible主机上创建一个新文件:

 - name: Create log file
   file:
    path: /tmp/logfile.log
    state: touch
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1