是否有可能在Ansible中定义playbook-global变量?

时间:2015-10-14 13:06:04

标签: ansible

我有一个很大的Ansible playbook,在运行它时构建了Docker镜像。我使用越来越多的数字作为标签来版本化它们。目前,我必须在每个hosts:部分指定此内容。

我知道有全局变量但是通过搜索“ansible”“全局变量”我发现它们,它们必须在剧本之外定义。是否有可能为剧本定义全局变量?

4 个答案:

答案 0 :(得分:15)

Ansible有一个默认的all组,有趣的是,它包含清单文件中的所有主机。

因此,您可以对任何主机组执行此操作,并为主机组提供group_vars

如上一个链接所示,这些可以直接在清单文件中定义,也可以包含在一个单独的文件中,该文件以group_vars目录中的组命名,与库存文件位于同一目录级别。< / p>

示例目录结构可能如下所示:

-ansible
 |--inventory
 |  |--group_vars
 |  |  |--all
 |  |  |--dev
 |  |  |--test
 |  |  |--prod
 |  |  |--webservers
 |  |  |--databases
 |  |--dev
 |  |--test
 |  |--prod
 |--roles
  ...

您的开发库存文件可能如下所示:

[dev:children]
webservers
databases

[webservers]
web1.dev
web2.dev

[databases]
database-master.dev
database-slave.dev

所有这些主机现在都会选择任何特定于主机的配置(可以在线上定义,或者像group_vars一样可以放入host_vars文件夹中),也可以配置它们所在的特定组,例如{ {1}}然后是他们也从webservers继承的群组,但默认情况下也是dev

然后,这可以用于以比每个主机更粗糙的方式配置事物。

NTP服务器之类的东西可能希望全部定义,而DNS服务器可能希望在环境级别定义(如果您的网络被分段为开发,测试和生产,他们可能需要在{{中设置不同的DNS服务器) 1}})虽然不同类型的服务器可能有不同的配置,例如要安装的软件包列表。最后,有些事情可能需要特定于主机,例如在复制组中设置MySQL服务器ID。

相反,如果您只想定义playbook全局设置而不是整个广告资源(因此可以通过其他Playbook访问),那么您只需在play定义中设置all块这样:

/etc/resolv.conf

如前所述,您也可以随时使用vars群组:

- hosts: webservers
  vars:
    http_port: 80
  tasks:
    - name: Task1 to be ran against all the webservers
      ...

一般情况下,我强烈建议使用角色来构建针对某些主机运行的内容,然后使用清单来解释哪些服务器是什么类型,然后在库存级别使用group_vars目录来包含所有变量那些主机组。以这种方式做事将有助于您将事物放在合理的位置,并允许您轻松地重用代码库。

答案 1 :(得分:15)

如果您使用的标记/版本适用于所有主机,则使用group_vars/all是可行的选择。

如果修订号特定于host_vars / host_name文件中的每个主机条目可能会更好。

如果你想阅读并初始化var,然后在每次播放后增加它,那么在剧本中播放游戏(或者你说的每个主机)的信息会变得有点困难。例如,如果您要部署N个泊坞窗实例,则可以执行以下动态库存操作:

- hosts: localhost
  tasks:
  - add_host: name=docker_{{item}} groups="dockers,other" tag={{item}}
    with_sequence: start={{ext_def_start}} count={{ext_def_num}}


- hosts: docker_*
  tasks:
  - debug: var=tag

答案 2 :(得分:0)

是的,全球变量可能是这样的,

示例splunk设置手册

splunk/
   setup_splunk_playbook.yaml
   roles/base
           /tasks/main.yaml
           /tasks/install.yaml
         search_head
           /tasks/configure.yaml
         indexer
           /tasks/configure.yaml
         some_other_role
           /tasks/some_task.yaml
   hosts
   config.yaml

将您的vars放入config.yaml

cat splunk / config.yaml

--- 
# global Splunk variables
splunk_version: 7.0.0
在你的剧本中

,包括角色

cat setup_splunk_playbook.yaml

- hosts: "search_heads"  
  become_user: root
  become: true
  gather_facts: true

  roles:
    - base
    - search_head

在您的角色中,在任务中包含全局变量

cat roles / base / tasks / main.yaml

---
# install Splunk Base

- name: include vars
  include_vars: "{{ playbook_dir }}/config.yaml"

- include: install.yaml

vars现在可以在任务中访问,

cat roles / base / tasks / install.yaml

- name: echo version
  debug: splunk version is {{ splunk_version }}

答案 3 :(得分:0)

我知道这可能无法准确回答OP的查询,但是对于谷歌搜索设置全局变量(列表/数组)的人来说,他们不必在每个任务中设置它们非常方便。

它非常简单,假设你有一个你需要通过的域列表,我将变量命名为goofy只是为了表示它可以是任何东西。

- hosts: [yourhostlistgoeshere]
  remote_user: root
  vars:
    domainslisto:
       - site1.com
       - website2.xyz

....



  tasks:
    - name: copy vhosts
      template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ item }}.conf
      with_items: "{{ domainslisto }}"

    - name: a2ensite {{ item }}
      command: a2ensite {{ item }}
      with_items: "{{ domainslisto }}"