如何获取VM的IP地址并使用它在Ansible中动态配置SSH连接

时间:2016-01-28 05:52:22

标签: ansible ansible-playbook

我正在尝试获取VM的IP地址,然后尝试使用它来建立到该VM的SSH。以下是剧本:

---
- hosts: localhost
  become: yes
  connection: local
  gather_facts: false
  serial: 1

  vars_files:
    - createVmVars.yml

  tasks:
    - name: Gathering Vm info.
      vsphere_guest:
        vcenter_hostname: "{{vcenter_hostname}}"
        username: "{{vcenter_username}}"
        password: "{{vcenter_password}}"
        guest: "{{guest_name}}"
        vmware_guest_facts: yes
      register: var

    - debug: msg="{{var.ansible_facts.hw_eth0.ipaddresses[0]}}"

    - name: Establishing SSH connection.
      script: /home/shasha/devOps/scripts/ssh_configure.sh "{{var.ansible_facts.hw_eth0.ipaddresses[0]}}"

以下是ssh_configure.sh的内容:

#!/bin/sh
ssh-keygen -t rsa
ssh-copy-id $1

但是当我运行剧本时,我在执行第三项任务时遇到以下错误:

错误! '无功'未定义

但调试模块(第二项任务)正在打印IP地址。

可能出现什么问题或者可以这样做?

2 个答案:

答案 0 :(得分:1)

看看这是否有效。我还没有测试过这个。

- name: Set VM IP to be used later
  set_fact:
    vm_ip: "{{var.ansible_facts.hw_eth0.ipaddresses[0]}}"

在您的任务中使用vm_ip

答案 1 :(得分:0)

您还应该列出您正在使用的ansible版本以获得最佳帮助。要专门回答您的问题,您需要引用整个命令字符串:

 - name: Establishing SSH connection.
   script: "/home/shasha/devOps/scripts/ssh_configure.sh {{var.ansible_facts.hw_eth0.ipaddresses[0]}}"

这应该可以修复你未定义的变量问题。

那说你正在做的事情是行不通的,因为假设这是一个新配置的虚拟机,ssh-copy-id会提示你输入密码,这样你就可以登录并获得新创建的(可能)pub键添加到authoized_keys。假设您知道新VM的SSH密码,这就是我的建议。

1 - 从VM获取事实

2 - 使用add_host动态地将您的主机添加到广告资源。使用从事实收集中获得的IP。确保添加ansible_ssh_password,以便在不提示的情况下登录。

- add_host: name="{{guest_name}}" ansible_ssh_host="{{var.ansible_facts.hw_eth0.ipaddresses[0]}}" ansible_ssh_pass="{{guest_password}}" groups=dynamic_hosts

使用内置的ansible模块移动public key over(以供将来使用的Playbook),copy并在shell中执行它们。例如,你的下一个游戏将是:

- hosts: dynamic_hosts
  tasks:
  - name: move over public key
    authorized_key: user=foo key="{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
  - name: copy over script files
    copy: src=scripts/{{item}} dest=scripts/{{items}}
    with_items:
    - foo.bash
    - bar.py
    - thing.pl

  - name: run script files
    shell: "scripts/{{item}}"
    with_items:
    - foo.bash
    - bar.py
    - thing.pl