Ansible:如何从 inventory 或 group_vars 文件中获取变量的值?

use*_*549 5 ansible

如果变量可以位于清单文件或group_vars目录中,如何从清单中获取变量的值?

例如,region=place-a可以在库存文件中或在group_vars某处的文件中。我希望命令能够使用 ansible 或其他方式检索该值来检索该值。喜欢:

$ ansible -i /somewhere/production/web --get-value region
place-a
Run Code Online (Sandbox Code Playgroud)

这将帮助我进行部署并了解要部署到哪个区域。

需要更长的解释来澄清,我的库存结构如下所示:

/somewhere/production/web
/somewhere/production/group_vars/web
Run Code Online (Sandbox Code Playgroud)

库存文件的变量内容/somewhere/production/web如下所示:

[web:children]
web1 ansible_ssh_host=10.0.0.1
web2 ansible_ssh_host=10.0.0.2

[web:vars]
region=place-a
Run Code Online (Sandbox Code Playgroud)

我可以通过简单地解析文件来从库存文件中获取值。像这样:

$ awk -F "=" '/^region/ {print $2}' /somewhere/production/web
place-a
Run Code Online (Sandbox Code Playgroud)

但该变量也可能位于group_vars文件中。例如:

$ cat /somewhere/production/group_vars/web
region: place-a
Run Code Online (Sandbox Code Playgroud)

或者它可能看起来像一个数组:

$ cat /somewhere/production/group_vars/web
region:
    - place-a
Run Code Online (Sandbox Code Playgroud)

我不想查找并解析所有可能的文件。

Ansible 有办法获取这些值吗?有点像它是如何做的--list-hosts

$ ansible web -i /somewhere/production/web --list-hosts
    web1
    web2
Run Code Online (Sandbox Code Playgroud)

act*_*eek 1

简答

\n

不,没有 CLI 选项来获取变量的值。

\n

长答案

\n

首先,您必须了解变量优先级在 Ansible 中如何工作。

\n

确切的顺序在文档中定义。以下是摘要摘录:

\n
\n

基本上,进入 \xe2\x80\x9crole defaults\xe2\x80\x9d(角色内的 defaults\n文件夹)的任何内容都是最具延展性且容易覆盖的。\n角色的 vars 目录中的任何内容都会覆盖以前的版本\n命名空间中的该变量。这里要遵循的想法是,范围内越明确,命令行 -e extra vars 总是获胜的优先级就越高。主机和/或清单变量可以胜过角色默认值,但不能像 vars 目录或 include_vars 任务那样显式包含。

\n
\n

清除这一点后,查看变量取值的唯一方法是使用该debug任务,如下所示:

\n
- name: debug a variable\n  debug:\n    var: region\n
Run Code Online (Sandbox Code Playgroud)\n

这将打印出变量的值region

\n

我的建议是维护单一值类型,astring或 a,list以防止tasks不同的playbooks.

\n

你可以使用这样的东西:

\n
- name: deploy to regions\n  <task_type>:\n    <task_options>: <task_option_value>\n    // use the region variable as you wish\n    region: {{ item }}\n    ...\n  with_items: "{{ regions.split(\',\') }}"\n
Run Code Online (Sandbox Code Playgroud)\n

regions=us-west,us-east在这种情况下,您可以使用逗号分隔的变量。该with_items声明将其拆分,并为所有区域重复该任务。

\n