使用 host_vars(未定义变量)的 ansible 2.7.9 问题
Problems with ansible 2.7.9 using host_vars (undefined variable)
Ansible 2.7.9 未使用 host_vars
我用 3 台主机设置了一个非常简单的设置,主要用于测试目的。我有主机 :
- ansible1 (this is where I store the code)
- ansible2
- ansible3
我的库存:
[ansible@ansible1 ~]$ cat /etc/ansible/hosts
[common]
ansible1
ansible2
ansible3
我的 cfg 看起来像这样:
[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 :
[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 ~]$
task/main.yml :
[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"
然后我在 /etc/ansible/host_vars
放置了一些信息
[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 非常有用:
[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 内容的文件:
[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 的行,它会说未定义的变量:
[ansible@ansible1 ansible]$ cat /etc/ansible/roles/common/vars/main.yml
copyright_msg: "Copyrighta 2019"
myvar: "value of myvar from common/vars"
正如预期的那样,main.yml 将在执行剧本时自动获取源代码。将此文件视为全局变量。
ansible2.yml 没有获取源代码的原因是因为 ansible 希望您在执行时显式地获取源代码。
您可以使用下面的代码(通用)。
---
- name: play
hosts: "{{ hosts }}"
tasks:
- include_vars: "{{ hosts }}.yml"
触发器 -->
ansible-playbook -i inventory --extra-vars "hosts=ansible2"
Ansible 对来自 vars 的值使用该优先级:
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/vars,因为它优先于 host_vars,所以我应该使用优先级较低的 roles/defaults。
Ansible 2.7.9 未使用 host_vars
我用 3 台主机设置了一个非常简单的设置,主要用于测试目的。我有主机 :
- ansible1 (this is where I store the code)
- ansible2
- ansible3
我的库存:
[ansible@ansible1 ~]$ cat /etc/ansible/hosts
[common]
ansible1
ansible2
ansible3
我的 cfg 看起来像这样:
[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 :
[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 ~]$
task/main.yml :
[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"
然后我在 /etc/ansible/host_vars
放置了一些信息[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 非常有用:
[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 内容的文件:
[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 的行,它会说未定义的变量:
[ansible@ansible1 ansible]$ cat /etc/ansible/roles/common/vars/main.yml
copyright_msg: "Copyrighta 2019"
myvar: "value of myvar from common/vars"
正如预期的那样,main.yml 将在执行剧本时自动获取源代码。将此文件视为全局变量。
ansible2.yml 没有获取源代码的原因是因为 ansible 希望您在执行时显式地获取源代码。
您可以使用下面的代码(通用)。
---
- name: play
hosts: "{{ hosts }}"
tasks:
- include_vars: "{{ hosts }}.yml"
触发器 -->
ansible-playbook -i inventory --extra-vars "hosts=ansible2"
Ansible 对来自 vars 的值使用该优先级:
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/vars,因为它优先于 host_vars,所以我应该使用优先级较低的 roles/defaults。