我有一个包含一些角色的 ansible 结构。
/usr/local/ansible
playbooks
roles
role1
role2
tasks
handlers
files
templates
my_template.yml
vars
main.yml
group_vars
role2.yml
通常,当从 ansible 服务器运行它时,模板:模块会找到 group_vars/role2.yml 并将其应用于 my_template。
当我使用 ansible-pull 时,模板模块找不到组 vars,并且引用变量的第一个模板行会导致错误 - 找不到变量。只有将我的变量放在 vars/main.yml 中我们才能找到它们。
ansible-pull -C dockervm -d /usr/local/ansible -U [email protected]:MRI-Software/HappySoftware-config-usr_local_ansible.git -i localhost, -e 'small=yes vagrant=True ServerNamePrefix=docker' --accept-host-key /usr/local/ansible/playbooks/docker.yml
由于 ansible-pull 操作留下了整个 /usr/local/ansible 目录树(从 git 服务器中提取),我尝试手动运行 ansible-playbook 但遇到与 ansible-pull 相同的失败。
ansible-playbook -i localhost -e 'small=yes vagrant=True ServerNamePrefix=docker' ./docker.yml
此配置与常规 Web 服务器配置之间的主要区别在于它是针对本地主机运行的。
因此,我确保 /usr/local/ansible/group_vars 和 /usr/local/ansible/playbooks/group_vars 都包含 localhost 变量集合,但剧本仍然在模板中的第一个变量引用上失败:
TASK [docker : template] *******************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'SSH_WEB_USER' is undefined"}
是的,我检查了变量定义是否在那里。
因此,我将整个变量集合移植到 main.yml 内的 role/docker/vars 目录中,并且它可以工作,但与其余配置角色相比,它现在是一个例外。
知道如何让 ansible-pull 引用 group_vars 目录(在剧本中)吗?
答案1
您的目录组变量和剧本位于同一目录中/usr/本地/ansible。 命令ansible-pull从目录运行剧本剧本 /usr/local/ansible/playbooks/docker.yml
。
看一眼变量优先级:我应该把变量放在哪里?.你会看到组变量可以放在剧本或库存目录中(优先级 4.-7.)。
- 最简单的解决办法就是组变量进入目录剧本
/usr/local/ansible/playbooks/group_vars/main.yml
但是,如果你还没有克隆存储库,你会看到一个错误剧本然而
致命:目标路径“/usr/local/ansible/playbooks”已存在且不是空目录。
因此,如果您移动组变量进入已经克隆的存储库和选项- 清除未使用。
- 下一个选择是搬家组变量进入库存。例如,
shell> pwd
/tmp/test
shell> tree .
.
└── inventory
├── group_vars
│ └── all
│ └── main.yml
└── hosts
3 directories, 2 files
shell> cat inventory/hosts
localhost
shell> cat inventory/group_vars/all/main.yml
test_var_1: test variable 1
配置库存
shell> export ANSIBLE_INVENTORY=/tmp/test/inventory
并运行ansible-pull命令
shell> ansible-pull -d /tmp/test/test_001 -U https://repos.example.org/test_001.git --full /tmp/test/test_001/pb_001.yml
Starting Ansible Pull at 2023-07-22 19:18:03
/home/admin/.local/bin/ansible-pull -d /tmp/test/test_001 -U https://repos.example.org/test_001.git --full /tmp/test/test_001/pb_001.yml
localhost | CHANGED => {
"after": "1f637428cafb37156e4027dc459e90609a2c2192",
"before": null,
"changed": true
}
PLAY [all] *********************************************************************
TASK [debug] *******************************************************************
ok: [localhost] =>
msg: Playbook pb_001.yml is runnning ...
TASK [debug] *******************************************************************
ok: [localhost] =>
test_var_1: test variable 1
PLAY RECAP *********************************************************************
localhost: ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
,其中使用了下面的剧本
shell> cat test_001/pb_001.yml
- hosts: all
gather_facts: false
tasks:
- debug:
msg: Playbook pb_001.yml is runnning ...
- debug:
var: test_var_1