Configuration 可解变量未定义

Configuration 可解变量未定义,configuration,vagrant,ansible,jinja2,ansible-playbook,Configuration,Vagrant,Ansible,Jinja2,Ansible Playbook,为什么我不能从playbook.yml访问清单文件中定义为组变量的变量 以下是playbook.yml的内容: --- - name: test ansible local provisioning hosts: all vars: playbook_var: "playbook_var" tasks: - name: Test ansible is working debug: msg="Ansible seems to be working, this

为什么我不能从
playbook.yml
访问清单文件中定义为组变量的变量

以下是playbook.yml的内容:

---
- name: test ansible local provisioning
  hosts: all
  vars:
    playbook_var: "playbook_var"
  tasks:
    - name: Test ansible is working
      debug: msg="Ansible seems to be working, this variable is from plabook {{ playbook_var }} and this variable is from hosts file {{ hosts_file_var }}"
这里是主机:

[all:vars]
hosts_file_var="hosts_file_var"
Ansible抛出以下错误:

TASK [Test ansible is working] *************************************************  
fatal: [ansible_host]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'hosts_file_var' is undefined

The error appears to have been in '/vagrant/provisioning/ansible_host/playbook.yml': line 7, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:
  tasks:
    - name: Test ansible is working
      ^ here
"}
关于Ansible如何处理变量,有什么我不明白的地方吗

这里还有
ansible.cfg
。我愿意使用Ansible进行流浪准备金:

[defaults]
inventory = hosts
remote_user = vagrant

问题是使用了错误的库存文件,所以变量未定义。这里有一个很长的解释,为什么会发生这种情况

问题是vagrant如何执行
ansible playbook
命令。在guest中执行命令的默认工作目录不是为
ansible.playbook
配置指定的路径,而是
/vagrant
(默认情况下与Vagrantfile相对同步)。这可以通过检查以下配置给出的输出来确认:

ansible.verbose=true

解决方案是提供以下配置(请注意,
ansible.playbook
与来宾中的此目录相关,不必在主机位置执行任何操作)

ansible.provisioning\u path=“/vagrant/provisioning/ansible\u host”

Vagrant还生成自己的清单文件,并在没有提供额外配置的情况下执行以下命令

Running ansible-playbook...
cd /vagrant/provisioning/ansible_host && PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ansible-playbook --limit="ansible-host" --inventory-file=/tmp/vagrant-ansible/inventory -v playbook.yml
Using /vagrant/provisioning/ansible_host/ansible.cfg as config file
以下是所有必要的配置,以使事情正常进行

ansible_host.vm.provision "ansible_local" do |ansible|
  ansible.playbook = "playbook.yml"
  ansible.provisioning_path = "/vagrant/provisioning/ansible_host"
  ansible.inventory_path = "hosts"
  ansible.limit = "all"
  ansible.verbose = true
end

请注意,还需要为本地主机条目声明
ansible\u connection=local
host/group var

您的playbook和资源清册文件正常。运行它们会导致:
“msg”:“ansible似乎正在工作,此变量来自plabook playbook\u var,此变量来自hosts文件hosts\u var”
。您的主要错误消息是
'hosts\u file\u var'未定义
,因此您似乎没有使用您发布的清单文件。您的错误消息正是我在
ansible playbook
调用中忽略
-I
参数时收到的错误消息。除此之外,如果您在问题中发布的
hosts
完成后,Ansible应该抛出一个错误,因此如果您没有收到错误,那么您的Ansible将使用另一个错误。您的问题和答案之间的连接仅限于页脚中的帐户名。对不起,我现在将答案格式化为更清楚。