Deployment 在Ansible主机上运行命令

Deployment 在Ansible主机上运行命令,deployment,ansible,Deployment,Ansible,是否可以在Ansible主机上运行命令 我的场景是,我希望从内部托管的git服务器(在公司防火墙之外无法访问)进行签出。然后我想将签出(tarballed)上传到生产服务器(托管在外部) 目前,我正在考虑运行一个执行签出的脚本,对其进行tarball,然后运行部署脚本-但是如果我可以将其集成到Ansible中,那将是更好的选择。是的,您可以在Ansible主机上运行命令。您可以指定播放中的所有任务都在Ansible主机上运行,也可以将单个任务标记为在Ansible主机上运行 如果要在Ansibl

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

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


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

是的,您可以在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
- 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文档中的

如果只想在Ansible主机上运行单个任务,可以使用
local\u action
指定任务应在本地运行。例如:

- 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
- 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


我想与大家分享,Ansible可以通过shell在本地主机上运行:

ansible all-i“localhost”-c local-m shell-a“echo hello world”

这对于简单的任务或Ansible的实际学习可能会有所帮助

代码示例取自本文:


在@gordon的答案的基础上进行扩展,下面是一个可读语法和参数随shell/command模块传递的示例(这些与git模块的不同之处在于有必需但自由形式的参数,如@ander所述)

-名称:“已生成释放tarball” 地方行动: 模块:外壳 _raw_参数:git archive--格式zip--输出release.zip头 chdir:“文件/克隆/webhook”
您可以使用
delegate_to
在您运行Ansible play的Ansible主机(管理主机)上运行命令。例如:

- 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
- 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主机上已存在文件,则删除该文件:

 - 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
默认模块为命令模块,因此不需要
command
关键字

如果需要以提升的权限发出任何命令,请在同一命令末尾使用
-b

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b
从Ansible:

授权 这实际上不是特定于滚动更新,但在这些情况下经常出现

如果要在一台主机上参照其他主机执行任务,请在任务上使用“delegate_to”关键字。这非常适合将节点放置在负载平衡池中或删除它们。它对于控制停机窗口也非常有用。请注意,委派所有任务、调试、添加主机、包含等始终在控制器上执行是没有意义的。使用“serial”关键字控制一次执行的主机数量也是一个好主意:

---

- hosts: webservers
  serial: 5

  tasks:

  - name: take out of load balancer pool
    command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

  - name: actual steps would go here
    yum:
      name: acme-web-stack
      state: latest

  - name: add back to load balancer pool
    command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1
这些命令将在127.0.0.1上运行,这是运行Ansible的机器。还有一种速记语法,您可以在每个任务的基础上使用:“local_action”。下面是与上面相同的剧本,但使用速记语法授权到127.0.0.1:

---

# ...

  tasks:

  - name: take out of load balancer pool
    local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}

# ...

  - name: add back to load balancer pool
    local_action: command /usr/bin/add_back_to_pool {{ inventory_hostname }}
一种常见的模式是使用本地操作调用“rsync”将文件递归复制到托管服务器。以下是一个例子:

---
# ...
  tasks:

  - name: recursively copy files from management server to target
    local_action: command rsync -a /path/to/files {{ inventory_hostname }}:/path/to/target/
请注意,您必须配置无密码短语的SSH密钥或SSH代理才能工作,否则rsync将需要请求密码短语。

您可以这样尝试

  • 吉特: 回购协议:“” 目的地:/srv/结帐 版本:release-0.2 委托给:localhost
  • 名称:下一步执行一些命令 yum:name=ntp state=latest

在委派场景中,我还需要
sudo:no
如何以root用户身份运行本地连接?@BilalUsean
ansible playbook-K playbook.yml
where-K for root“local Playbooks”链接更新:有趣,这将如何工作?因为据我所知,我们不能使用param free_形式来定义将要执行的命令executed@Ander这同样适用于
shell
模块。对于command/shell,您需要的是“_raw_params”,localhost后面逗号(,)的含义是什么。我注意到命令的作用非常重要,后面的逗号是定义一个指向文件的简单清单。这是一种无文件记录的黑客行为,可能会消失(iirc)。这似乎是迄今为止所有答案中最干净的解决方案。同意。最少的新语法,最灵活的(在其他地方也委派)。需要注意的一点是,如果任务的
been
为True,它将抱怨sudo等。这可以直接发生在任务上,也可以继承到其他地方。