Ansible 包含每个主机的变量

Mic*_*rtz 2 ansible

我在 Ubuntu 中使用 Ansible 2.2 时遇到问题。

我的剧本包含以下内容:

---
- hosts: all
  become: yes
  roles:
    - mysql
Run Code Online (Sandbox Code Playgroud)

我使用了这里的 MySQL 角色https://galaxy.ansible.com/geerlingguy/但将其全部重命名为MySQL本地。在剧本的默认文件夹中有一个包含参数的文件:

mysql_datadir: /var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

这样,Ansible 就可以正常工作了。但现在我想要每个主机的特定配置,如下所述:http ://docs.ansible.com/ansible/playbooks_best_practices.html

因此,我创建了该文件inventories/host_vars/test.yml,删除了任务默认文件夹中的文件,并将剧本更新为以下内容:

  ---
- hosts: all
  become: yes
  roles:
    - mysql
  tasks:
  - name: include vars
    include_vars: inventories/host_vars/test.yml
Run Code Online (Sandbox Code Playgroud)

现在 Ansible 不会接受这一点;它说变量未设置:

致命:[]:失败!=> {“failed”:true,“msg”:“字段'args'具有无效值,其中似乎包含未定义的变量。错误是:'mysql_datadir'未定义\n\n错误似乎是已位于“/home/michael/Ansible/Playbooks/roles/mysql/tasks/setup-Debian.yml”中:第 24 行第 3 列,但\n可能位于文件中的其他位置,具体取决于具体的语法问题。\n\ n有问题的行似乎是:\n\n\n- name: 初始安装后删除 apt 软件包创建的 innodb 日志文件。\n ^ 此处\n"}

通过命令行传递参数没有问题。我该如何解决这个问题?

Pal*_*tir 5

我相信你有多个问题。我建议从标准的、更简单的目录结构开始。

我会尝试执行以下操作:

  • 使用标准目录布局,因此将 host_vars 移动到顶部文件夹
  • 在 host_vars 目录中,为每个主机放置一个文件,该文件完全按照清单中定义的主机名命名,文件以“---”开头,然后将变量放入其中。不要将 .yml 扩展名添加到文件中!
  • 不要明确“包含”任何内容。它是自动的。site.yml 中没有“任务”。