---
# System prepended metadata

title: 使用 Ansible 部署 Kali Linux
tags: [ansible, ovftool, kali]

---

###### tags: `ansible` `kali` `ovftool`

# 使用 Ansible 部署 Kali Linux

最近為了測試 VMware Carbon Black ，需要配置 Kali Linux 作為滲透入侵平台。所以透過之前 **vApp選項編輯**、**OVA包裝**、**OVFTool 安裝**及 **Ansible自動化佈署** 學習到的綜合技，也將可能會運用於 LAB 測試的 Kali Linux 就按照這樣的流程編修了。

以下只做重點摘要描述，後續有時間再來另起專案說明吧。

### vApp選項編輯

先從官網下載 Kali Linux OVA 檔進行手動佈署，開啟 vApp 選項功能。

![](https://i.imgur.com/oGgLZYt.png)

根據要自動佈署所需的 IP 資訊進行內容編輯。

![](https://i.imgur.com/U6KmkQO.png)

### OVA包裝

使用 VMware OVFTools 工具將 **改裝過** 的 Kali Linux 匯出。

![](https://i.imgur.com/liYBlyA.png)

### 使用 Ansible 自動佈署

使用 Ansianle 進行自動化佈署，編寫 Ansible-Playbook 佈署劇本，可先配置欲安裝的 IP 資訊於組態檔，完成安裝後的 Kali Linux 便會按照組態完成 Kali Linux 虛擬機器的 IP 配置，達到自動化佈署需求。

    $ ansible-play -vvv -i <host_file> <deploy_kali_linux.yml>

![](https://i.imgur.com/Lshiq59.png)

執行 Ansible 程序。

![](https://i.imgur.com/DNBdCtV.png)

從 VMware vCenter Web Client 監看佈署過程。

![](https://i.imgur.com/qfqwgHl.png)

稍待一會，Kali Linux 就會佈署完成，當然 IP 資訊也會按照先前組態完成。

![](https://i.imgur.com/NDrFp19.png)

使用 Web Console 連線佈署完成的 Kali Linux，成功！

![](https://i.imgur.com/pPIYopy.png)

透過此種方式佈署測試用途的 Kali Linux 極為方便，只要修改佈署組態檔，就能彈性運用於測試環境。

![](https://i.imgur.com/yOlcXse.png)

當然，測試完畢後若要刪除該虛擬機器，也是可以透過相同方式。

以上，快速地重點分享，希望能給各位一些想法，有興趣再來討論吧。


## [補充1]

- 佈署 Windows 10 組態範本檔，佈署的VM會放置於指定的 vSphere 資料夾。

```yaml=
- name: 'Deploy Windows 10 Eval VM'
  vmware_deploy_ovf:
    hostname: "{{ labVc.ip }}"
    username: "{{ labVc.user }}"
    password: "{{ labVc.password }}"
    datacenter: "{{ labVc.datacenter }}"
    cluster: "{{ labVc.cluster }}"
    datastore: "{{ labWin10VM.datastore }}"
    disk_provisioning: "{{ labWin10VM.diskmode }}"
    name: "{{ labWin10VM.vmname }}"
    networks: "{u'VM Network':u'{{ labWin10VM.network }}'}"
    validate_certs: no
    inject_ovf_env: yes
    power_on: yes
    ovf: "{{ win_ovapath }}/{{ win_ovafile }}"
    folder: "/{{ labVc.datacenter }}/vm/{{ labWorkVM.parentfolder }}/{{ labWorkVM.folder }}"
    properties:
      guestinfo.hostname: "{{ labWin10VM.hostname }}"
      guestinfo.ipaddress: "{{ labWin10VM.ip }}"
      guestinfo.netmask: "{{ labWin10VM.netmask }}"
      guestinfo.gateway: "{{ labWin10VM.gateway }}"
      guestinfo.dns: "{{ labWin10VM.dns }}"
      guestinfo.domain: "{{ labWin10VM.domain }}"
      guestinfo.ad_domain: "{{ labWin10VM.adDomain }}"
      guestinfo.ad_username: "{{ labWin10VM.adUsername }}"
      guestinfo.ad_password: "{{ labWin10VM.adPassword }}"
  delegate_to: localhost

- name: Create the First Snapshot
  vmware_guest_snapshot:
    hostname: "{{ labVc.ip }}"
    username: "{{ labVc.user }}"
    password: "{{ labVc.password }}"
    validate_certs: no
    datacenter: "{{ labVc.datacenter }}"
    folder: "/{{ labVc.datacenter }}/vm/{{ labWorkVM.parentfolder }}/{{ labWorkVM.folder }}"
    name: "{{ labWin10VM.vmname }}"
    state: present
    snapshot_name: snap1
    description: "snap1 via Ansible"
  delegate_to: localhost
```

並製作第一份快照。

![](https://i.imgur.com/DcSHo6g.png)

## [補充2]

- 佈署 CentOS Linux 組態範本檔。其他佈署至指定 vSphere 資料夾及完成第一次備份，可使用以上相同的配置檔。

```yaml=
- name: "Deploy Linux VM - {{ labWorkVM.vmname }} for work VM"
  shell: >
    {{ ovftool }}
    '--name={{ labWorkVM.vmname }}'
    --acceptAllEulas
    --allowExtraConfig
    --X:enableHiddenProperties
    --X:injectOvfEnv
    --noSSLVerify
    --overwrite
    '--datastore={{ labWorkVM.datastore }}'
    '--diskMode={{ labWorkVM.diskmode }}'
    '--net:VM Network={{ labWorkVM.network }}'
    '--prop:guestinfo.ipaddress={{ labWorkVM.ip }}'
    '--prop:guestinfo.netmask={{ labWorkVM.netmask }}'
    '--prop:guestinfo.gateway={{ labWorkVM.gateway }}'
    '--prop:guestinfo.hostname={{ labWorkVM.hostname }}'
    '--prop:guestinfo.domain={{ labWorkVM.domain}}'
    '--prop:guestinfo.dns={{ labWorkVM.dns }}'
    '--powerOn={{ labWorkVM.poweron | string }}'
    '{{ ovapath }}/{{ ovafile }}'
    'vi://{{ labVc.user | urlencode }}:{{ labVc.password | urlencode }}@{{ labVc.ip }}/{{ labVc.datacenter }}/host/{{ labVc.cluster }}/{{ labESX.ip }}'
  register: deploy_result
```

## [補充3]

使用 Ansible 也可以安裝 CB Agent(Sensor) 在 Linux 及 Windows 終端環境。

- Ansible 的組態檔(劇本) for Linux，會完成以下相關流程
  - 建立 CB Agent 上傳目錄
  - 將 CB Agent for Linux Zip 解壓至指定目錄
  - 取得 cbagentd 狀態
  - 安裝 CB Agent 程式

```yaml=
- name: make a directory to upload CB Agent
      file:
        path: "{{ cbInstallPath }}"
        state: directory

- name: Extract CB Endpoint Agent to remote host
  unarchive:
    src: "{{ cbAgentPath }}/{{ cbAgentFile }}"
    dest: "{{ cbInstallPath }}"

- name: Get Service facts
  service_facts:

- name: Install CB Agent
  command: ./install.sh "{{ cbAgentCode}}"
  args:
    chdir: "{{ cbInstallPath }}/"
  when: ansible_facts.services["cbagentd.service"] is not defined
```

- 組態檔 for Windows 10，會完成以下相關流程
  - 建立 CB Agent 上傳目錄
  - 將 CB Agent for Linux Zip 解壓至指定目錄
  - 安裝 CB Agent 程式，這邊多加了一個程序 **套用指定 Policy**

```yaml=
- name: Create directory to store CB Agent
  win_file:
    path: "{{ cbWin10InstallPath }}"
    state: directory

- name: Copy a CB Agent MSI file from remote source
  win_copy:
    src: "{{ cbWin10AgentPath }}/{{ cbWin10AgentFile }}"
    dest: "{{ cbWin10InstallPath }}\\{{ cbWin10AgentFile }}"

- name: Install CB Agent for Windows 10 with a specific policy
  win_package:
    path: "{{ cbWin10InstallPath }}\\{{ cbWin10AgentFile }}"
    arguments: "COMPANY_CODE={{ cbAgentCode }} GROUP_NAME={{ cbWin10Policy }}"
    log_path: "{{ cbWin10InstallPath }}\\{{ cbWin10LogFile }}"
    validate_certs: no
    state: present
```

---