在 Ansible 任务中运行 bash 命令

Sam*_*amy 3 python mysql ansible ansible-playbook

我正在将 a 移植Makefile到一系列 Ansible 任务中。make 文件中有这两行代码,当涉及到 ansible 时,它​​们让我感到困扰:

SERVERS := shell mysql "select hostname from servers"
EASY_INSTALL := wget https://bootstrap.pypa.io/ez_setup.py -O - | python
Run Code Online (Sandbox Code Playgroud)

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

其次,我不想安装 python-setuptools 包,aptitude因为我过去除了问题之外什么都没有。那么如何wget使用 Ansible运行shell 命令呢?

Phi*_*mes 7

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

Ansible 剧本中“主机”的概念涵盖了你的“服务器”概念——你需要填充 Ansible 可以为主机读取的清单,或者甚至可能在运行剧本时将主机作为变量传递(让我们称之为变量“服务器”)。

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

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

ansible-playbook /usr/shipit.yaml --extra-vars "servers=10.0.0.1"
Run Code Online (Sandbox Code Playgroud)

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

您的里程可能会有所不同,具体取决于您是否需要启用 sudo ( sudo: yes),并且可能有比使用命令更好的运行 python 脚本的方法(命令每次都会运行,而不管它是否已经运行 - 不是幂等的换句话说)。

希望以上内容为您提供了一个良好的起点。