我有一个很大的Ansible playbook,在运行它时构建了Docker镜像。我使用越来越多的数字作为标签来版本化它们。目前,我必须在每个hosts:
部分指定此内容。
我知道有全局变量但是通过搜索“ansible”“全局变量”我发现它们,它们必须在剧本之外定义。是否有可能为剧本定义全局变量?
答案 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 }}"