我有两个windows服务器,假设是serverA和serverB。我需要将serverA的主机名作为变量,并将其替换为Jinja模板,并将其复制到serverB中。我无法找到任何解决方案如何在Ansible中使用服务器的依赖。在这种情况下有什么解决方案吗?
我尝试使用ansible.built .hostname,但它不允许注册主机名,除非只允许更改
- name: Set a hostname
ansible.builtin.hostname:
name: web01
在哪里收集信息
库存第一种方法是将相关主机名直接放在目录中:
inventory/hosts.yml
---
all:
hosts:
nameOfServerA.company.loc:
nameOfServerB.company.loc:
然后可以分别使用{{ inventory_hostname }}
和{{ inventory_hostname_short }}
检索当前目标的短主机名或完整主机名
目标服务器信息
如果出于某种原因,您的库存中只有别名,或者您的库存名称与库存中的主机不匹配,则可以从收集的事实中检索当前配置的主机名。当然你的游戏需要在gather_facts: true
(默认)下运行。然后可以在{{ ansible_hostname }}
变量
获取其他主机的信息
这与从其他主机获取任何其他事实/var没有什么不同,例如在剧本指南中解释过。下面是一个简短的playbook.yml
示例,用于上述情况:
---
- name: Make sure we gather facts from all hosts in inventory
# Note: this play is only necessary for gathering the hostname from facts.
# Getting it from inventory does not require to gather_facts.
hosts: all
gather_facts: true # default so you can skip it if you want.
- name: Display hostname for serverB from serverA
hosts: nameOfServerA.company.loc
# Facts are already gathered
gather_facts: false
vars:
target: nameOfServerB.company.loc
tasks:
- name: "Display info for {{ target }}"
ansible.builtin.debug:
msg:
- inventory_hostname is {{ hostvars[target].inventory_hostname }}
- inventory_hostname_short is {{ hostvars[target].inventory_hostname_short }}
- ansible_hostname is {{ hostvars[target].ansible_hostname }}
用:ansible-playbook -i inventory/ playbook.yml
执行上面的命令应该会得到如下的结果:
PLAY [Make sure we gather facts from all hosts in inventory] **********************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************************************************************
ok: [nameOfServerB.company.loc]
ok: [nameOfServerA.company.loc]
PLAY [Display hostname for serverB from serverA] **********************************************************************************************************************************************************
TASK [Display info for nameOfServerB.company.loc] ********************************************************************************************************************************************************************************************
ok: [nameOfServerA.company.loc] => {
"msg": [
"inventory_hostname is nameOfServerB.company.loc",
"inventory_hostname_short is nameOfServerB",
"ansible_hostname is <some hostname configured on serverB>"
]
}
PLAY RECAP ************************************************************************************************************************************************************************************************
nameOfServerA.company.loc : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
nameOfServerB.company.loc : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0