我动态配置虚拟机,它们在执行过程中变得可访问,而我的剧本已经在执行。如何获得“真正”的动态清单?
我所说的“真正的”动态库存是指:
Ansible 启动时始终会评估动态清单,无论清单是不可变文件还是动态发现一堆 IP 地址的脚本。我需要在配置虚拟机的任务之后和执行其他任务之前评估清单。
答案1
动态清单始终在 Ansible 启动时进行评估,无论清单是不可变文件还是动态发现一堆 IP 地址的脚本。在我的用例中,我需要在配置虚拟机之后和执行其他任务之前评估清单。
但是,没有什么可以阻止您将一个大的剧本分成几个小的剧本并打破逻辑,以便某个剧本有机会在启动时评估环境并找到您希望找到的所有主机。
第一个剧本将负责配置、等待虚拟机可访问并检索其主机密钥(请参阅下面的注释)。然后,第一个剧本做的最后一件事是启动第二个剧本,后者负责所有进一步的任务,如下所示:
- name: Kicks off the second playbook, passing the IP address of the recently provisioned virtual machine
shell: "ansible-playbook -i '{{provisioned_host}},' second_playbook,yaml
这种方法似乎有效。这是一个概念证明:
文件:first_playbook.yml
---
- name: This is the first playbook
hosts: localhost
tasks:
- name: set facts -- obtain hostname
shell: "cat /etc/hostname"
register: hostname
- name: debug
debug:
msg: "This is the first playbook: hostname is {{hostname.stdout}}"
- name: set facts -- provisioned_ip
set_fact:
provisioned_host: "192.168.3.152"
# see: ansible-doc -t inventory host_list
- name: Kicks off the second playbook, passing the IP address of the recently provisioned virtual machine
shell: "ansible-playbook -i '{{provisioned_host}},' {{playbook_dir}}/second_playbook.yml"
文件:second_playbook.yml
---
- name: This is the second playbook
hosts: all
tasks:
- name: set facts -- obtain hostname
shell: "cat /etc/hostname"
register: hostname
- name: debug
debug:
msg: "This is the second playbook: hostname is {{hostname.stdout}}"
立即致电first_playbook
:
ansible-playbook -vv first_playbook.yml
笔记:
- Ansible 需要知道要连接的虚拟机的主机密钥。因此,在第二个 playbook 启动之前,您必须检索主机密钥并将其插入到您的 中
~/.ssh/known_hosts
,否则第二个 playbook 将无法连接。