如果变量可以位于清单文件或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)
不,没有 CLI 选项来获取变量的值。
\n首先,您必须了解变量优先级在 Ansible 中如何工作。
\n确切的顺序在文档中定义。以下是摘要摘录:
\n\n\n基本上,进入 \xe2\x80\x9crole defaults\xe2\x80\x9d(角色内的 defaults\n文件夹)的任何内容都是最具延展性且容易覆盖的。\n角色的 vars 目录中的任何内容都会覆盖以前的版本\n命名空间中的该变量。这里要遵循的想法是,范围内越明确,命令行 -e extra vars 总是获胜的优先级就越高。主机和/或清单变量可以胜过角色默认值,但不能像 vars 目录或 include_vars 任务那样显式包含。
\n
清除这一点后,查看变量取值的唯一方法是使用该debug任务,如下所示:
- name: debug a variable\n debug:\n var: region\nRun Code Online (Sandbox Code Playgroud)\n这将打印出变量的值region。
我的建议是维护单一值类型,astring或 a,list以防止tasks不同的playbooks.
你可以使用这样的东西:
\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(\',\') }}"\nRun Code Online (Sandbox Code Playgroud)\nregions=us-west,us-east在这种情况下,您可以使用逗号分隔的变量。该with_items声明将其拆分,并为所有区域重复该任务。