在Ansible任务中运行bash命令

时间:2015-05-30 20:27:51

标签: python mysql ansible ansible-playbook

我将Makefile移植到一系列Ansible任务中。 make文件有这两行代码,当涉及到ansible时,这些代码令我感到不安:

SERVERS := shell mysql "select hostname from servers"
EASY_INSTALL := wget https://bootstrap.pypa.io/ez_setup.py -O - | python

首先,使用动态vars作为SERVERS值的合适的Ansible方法是什么?服务器的价值取决于环境,即阶段,生产等。

其次,我不想从aptitude安装python-setuptools包,因为我过去只有它的问题。那么如何使用Ansible运行wget shell命令?

1 个答案:

答案 0 :(得分:4)

看起来您想下载一个脚本,然后将其作为针对多个服务器的命令运行。

主持人的概念'在Ansible剧本中涵盖了您的服务器'概念 - 您需要填充Ansible可以为主机读取的库存,或者甚至可能在运行Playbook时将主机作为变量传递(让我们调用该变量'服务器')。

wget和运行各种命令都是标准的Ansible模块(get_url是wget的通用名称)。

所以,一个示例剧本:

- hosts: "{{ servers }}"
  tasks:
    - name: get a file
      get_url:
        url: "https://bootstrap.pypa.io/ez_setup.py"
        dest: "/usr/ez_setup.py"

    - name: run a command
      command: "python /usr/ez_setup.py"

然后你可以这样调用上面的剧本(我们称之为shipit.yaml):

ansible-playbook /usr/shipit.yaml --extra-vars "servers=10.0.0.1"

您还可以使用add_hosts模块和自定义组名从数据库中动态读取服务器,然后填充自定义组,然后针对该自定义组运行下一组命令作为hosts项。

你的milage可能会有所不同,具体取决于你是否需要sudo启用(sudo: yes),并且可能有一种更好的方式来运行你的python脚本而不是使用命令(命令将每次运行而不考虑是否它已经运行 - 换句话说不是幂等的。)

希望上面给你一个很好的起点。