本地 ansible-playbook 使用角色变量运行 playbook

本地 ansible-playbook 使用角色变量运行 playbook

我对 ansible 还不太熟悉,所以我可能设置错了。我的想法是我有某些类别的服务器。(例如,monitor、web、db)

我想在它们上运行一个本地 ansible,所以我的监控程序看起来像

---

# plays/monitor.yaml

- hosts: mongo
  connection: local
  hosts: localhost
  become: yes
  become_user: root
  roles:
    - ../roles/users
    - ../roles/monitor
  vars:
    sensu_install_client: true
    sensu_install_server: true

roles/monitor/tasks/main.yml看起来像

---

# roles/monitor/tasks/main.yaml

- include: common.yml

- include: server.yml
  when: sensu_install_server

- include: client.yml
  when: sensu_install_client

我希望能够传入变量,以便包含将发生在角色中。因此,当我设置我的 api 实例时,我可以执行以下操作

vars:
   sensu_install_client: true

在游戏中,它只包含来自监视角色的client.yml。

答案1

我不清楚为什么这不起作用。我看不出有什么问题。但让我给你一些一般性建议,也许这也会对你有帮助。

最佳做法是将你的剧本放在根级别。看看这个结构。通过该设置,您不需要指定角色的路径,因为 Ansible 会自动期望角色位于roles相对于剧本的目录中。然后剧本中的角色部分会更简洁:

roles:
  - users
  - monitor

您可以使用另外两种方法,而不是定义全局变量来触发角色内部的操作。

1.角色参数

角色可以有参数。如果要传递参数,只需将其转换为字典即可:

roles:
  - users
  - role: monitor
    sensu_install_client: true
    sensu_install_server: true

变量sensu_install_clientsensu_install_server仅在角色中可用monitor。这更简洁一些,也让任何人都清楚这些变量将在此角色中使用,而不是在角色中使用users

2. 标签

标签实际上是触发剧本/角色特定部分的方式。不过标签是通过命令行传递的,而不是通过剧本中的硬编码变量传递的。想象一下你的角色main.yml如下所示:

---

# roles/monitor/tasks/main.yaml

- include: common.yml
  tags: always

- include: server.yml
  tags: server

- include: client.yml
  tags: client

该标签always很特殊,它将运行标记的任务...嗯,你猜对了...总是这样。

现在你可以像这样调用你的剧本:

ansible-playbook monitor.yml --tags server

或者

ansible-playbook monitor.yml --tags client

或者如果你想同时运行两者你甚至可以这样做:

ansible-playbook monitor.yml --tags "client,server"

如果您使用此功能,请不要忘记相应地标记您的用户角色,否则它将根本无法运行。

如果你没有指定任何--tags执行的所有任务,如果你想过滤特定的标签,你可以使用--skip-tags选项

ansible-playbook monitor.yml --skip-tags "server"

您甚至可以过滤“always”标签。

ansible-playbook monitor.yml --tags "server" --skip-tags "always"

相关内容