首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用host_vars (未定义变量)的ansible 2.7.9的问题

使用host_vars (未定义变量)的ansible 2.7.9的问题
EN

Stack Overflow用户
提问于 2019-04-05 21:33:24
回答 2查看 3.8K关注 0票数 1

Ansible 2.7.9没有使用host_vars

我用3台主机设置了一个非常简单的设置,主要是为了测试目的。我有主机:

代码语言:javascript
复制
- ansible1 (this is where I store the code)
- ansible2
- ansible3

我的清单:

代码语言:javascript
复制
[ansible@ansible1 ~]$ cat /etc/ansible/hosts
[common]
ansible1
ansible2
ansible3

我的cfg是这样的:

代码语言:javascript
复制
[ansible@ansible1 ~]$ cat /etc/ansible/ansible.cfg
[defaults]
roles_path = /etc/ansible/roles
inventory  = /etc/ansible/hosts
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
pipelining = True
control_path = /tmp/ansible-ssh-%%h-%%p-%%r
pipelining = False
[accelerate]
[selinux]
[colors]

我已经定义了一个名为common的主剧本,它调用common:

代码语言:javascript
复制
[ansible@ansible1 ~]$ ls /etc/ansible/roles/
common  common.retry  common.yml
[ansible@ansible1 ~]$ cat /etc/ansible/roles/common.yml
--- # Playbook for webservers
- hosts: common
  roles:
    - common
[ansible@ansible1 ~]$

任务/main.yml:

代码语言:javascript
复制
[ansible@ansible1 ~]$ cat /etc/ansible/roles/common/tasks/main.yml
- name: test ansible1
  lineinfile:
    dest: /tmp/ansible.txt
    create: yes
    line: "{{ myvar }}"
- name: set ansible2
  lineinfile:
    dest: /tmp/ansible2.txt
    create: yes
    line: "hi"
[ansible@ansible1 ~]$

[ansible@ansible1 ~]$ cat /etc/ansible/roles/common/vars/main.yml
copyright_msg: "Copyrighta 2019"
myvar: "value of myvar from common/vars"

THen我在/etc/ansible/host_vars中放置了一些信息

代码语言:javascript
复制
[ansible@ansible1 ~]$ ls /etc/ansible/hosts_vars/
ansible2.yml
[ansible@ansible1 ~]$ cat /etc/ansible/hosts_vars/ansible2.yml
myvar: "myvar from host_vars"
[ansible@ansible1 ~]$

这在playbook中非常有效:

代码语言:javascript
复制
[ansible@ansible1 ~]$ ansible-playbook /etc/ansible/roles/common.yml --limit ansible2

PLAY [common] ******************************************************************

TASK [Gathering Facts] *********************************************************
ok: [ansible2]

TASK [common : test ansible1] **************************************************
changed: [ansible2]

TASK [common : set ansible2] ***************************************************
changed: [ansible2]

PLAY RECAP *********************************************************************
ansible2                   : ok=3    changed=2    unreachable=0    failed=0

我看到了包含myvar内容的文件:

代码语言:javascript
复制
[root@ansible2 ~]# cat /tmp/ansible.txt
value of myvar from common/vars
[root@ansible2 ~]#

但我不明白为什么它不从/etc/ansible/hosts_vars/ansible2.yml中获取值,事实上,如果我注释/etc/ansible/roles/common/vars/main.yml中的行,它会显示未定义的变量:

代码语言:javascript
复制
[ansible@ansible1 ansible]$ cat /etc/ansible/roles/common/vars/main.yml
copyright_msg: "Copyrighta 2019"
myvar: "value of myvar from common/vars"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-12 20:11:44

Ansible对vars中的值使用该优先级:

代码语言:javascript
复制
From least to most important
role defaults
inventory file or script group vars
inventory group_vars/all
playbook group_vars/all
inventory group_vars/*
playbook group_vars/*
inventory file or script host vars
inventory host_vars/*
playbook host_vars/*
host facts
play vars
play vars_prompt
play vars_files
role vars (defined in role/vars/main.yml)
block vars (only for tasks in block)
task vars (only for the task)
role (and include_role) params
include params
include_vars
set_facts / registered vars
extra vars (always win precedence)

所以最好忘记使用roles/var,因为它优先于host_vars,所以我应该使用roles/defaults,它的优先级较低。

票数 2
EN

Stack Overflow用户

发布于 2019-04-05 22:52:35

正如预期的那样,在执行攻略时,main.yml将自动获得源代码。将此文件视为全局变量。

ansible2.yml没有获取源代码的原因是因为ansible希望您在执行时显式获取源代码。

你可以使用下面的代码(泛型)。

代码语言:javascript
复制
---
- name: play
  hosts: "{{ hosts }}"
  tasks:
    - include_vars: "{{ hosts }}.yml"

触发器-->

代码语言:javascript
复制
ansible-playbook -i inventory --extra-vars "hosts=ansible2"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55536600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档