用Ansible去配置Cisco Meeting Server

首先

本文是由思科有志在2018年Cisco Systems Japan Advent Calendar的第17天发布的。

2017 年版链接:https://qiita.com/advent-calendar/2017/cisco
2018 年版链接:https://qiita.com/advent-calendar/2018/cisco

2017 年的版本链接是 https://qiita.com/advent-calendar/2017/cisco,
而 2018 年的版本链接是 https://qiita.com/advent-calendar/2018/cisco。

动机 jī)

有时在公司内部的验证中会安装Cisco Meeting Server (CMS),但是CMS的初始设置相当麻烦,即使是最简单的独立配置也需要相当多的工作。

不久之前,我只是写了一些简单的Shell脚本,但在这篇文章中,我想试着使用Ansible来配置CMS。

Ansible是DevOps领域中的事实上标准的配置管理工具。最近它除了支持Linux和Windows之外,还增加了对IOS和NXOS等网络设备的支持。然而,对于Cisco的协作产品等的支持完全没有,并且未来似乎也不会有…

在使用Ansible进行CMS配置方面,是否无法完成呢?实际上,并非如此。我们可以使用Ansible的raw模块通过SSH输入命令,也可以使用uri模块通过RESTful API进行配置。因此,在这里我们将使用这些模块来配置CMS。

考虑到冪等性和Playbook的外观,创建一个CMS模块将更加符合Ansible的风格。但是由于时间有限,所以将其作为未来的任务来完成。

预先设定

本来我们是打算用Ansible来自动化OVA到VM的部署、许可证的投入、IP地址的设置,以及服务的配置等等,但由于VM部署和许可证投入与我们的内部环境密切相关,所以在这里我们假设VM的部署和IP地址的设置已经在事先进行了设置。

此外,我们仅支持独立部署,不提供CMS集群化支持。

创建Playbook

在中国使用汉语进行重述,只需要一个选项:
CMS的设置主要通过控制台、SSH和RESTful API来进行。在Ansible模块中,我们使用以下内容。

    • raw … SSH経由でコマンドを発行するモジュール

 

    uri … HTTPリクエストを実行するモジュール。RESTful APIなどを実行するのに利用できます

关于证书,由于是用于验证,因此我们在CMS中创建自签名证书。如果希望更加正式,建议使用Ansible的openssl模块。

# Cert
- name: Generate self-signed cert
  raw: pki selfsigned allinone

在各个服务中,所做的事情几乎都是相同的,使用原始模块进行证书配置、监听端口配置以及服务启动。

- name: Set certs for webadmin
  raw: webadmin certs allinone.key allinone.crt
- name: Listen ports for webadmin
  raw: webadmin listen {{ webadmin_interfaces | join(" ") }} {{ webadmin_port }}
- name: Enable Webadmin
  raw: webadmin enable
  register: res
  failed_when: res.stdout.find("FAILURE") > -1

由于在Web Bridge、XMPP和TURN的配置中需要使用RESTful API进行配置,因此我们使用了uri模块。

- name: Add CallBridges to XMPP Service
  uri:
    url: https://{{ ansible_host }}:{{ webadmin_port }}/api/v1/system/configuration/xmpp
    method: PUT
    force_basic_auth: yes
    user: "{{ ansible_user }}"
    password: "{{ ansible_password }}"
    validate_certs: no
    body_format: form-urlencoded
    body:
      uniqueName: "cb_{{ inventory_hostname}}"
      domain: "{{ xmpp_domain }}"
      sharedSecret: "{{ xmpp_callbridge.secret }}"
  delegate_to: localhost

在设置XMPP服务时有一些繁琐的地方,通过命令行运行”xmpp callbridge add”会生成一个秘钥在输出结果中显示出来,然后需要将其设置为RESTful API的参数。

因此,需要从xmpp callbridge列表中获取秘密密钥信息,并在Ansible中作为变量进行补全。因为这次只需要获取一个,所以可以使用regexp类的Ansible过滤器来操作,但为了未来设置多个CallBridge时,使用parse_cli_textfsm过滤器可以通过TextFSM引擎解析输出结果(以文本形式)并获取秘密密钥等信息。

- name: Get secrets for xmpp
  raw: xmpp callbridge list
  register: cb_res
- name: parse output of xmpp callbridge list
  set_fact:
    xmpp_callbridge: "{{ cb_res.stdout | parse_cli_textfsm(role_path + '/files/xmpp_callbridge_list.fsm') }}"

库存 (kù

在清单文件中,除了主机配置外,没有其他特殊设置。如果想要更改某些设置,因为已经将其变量化,所以请参考roles/deploy_cms/defaults/main.yml。

# CMSのホストを設定。DNS解決できないときはansible_hostでIPアドレスを設定
cms1 ansible_host=192.168.1.1

试着执行一下

连接到CMS时的连接方法是,除了SSH连接外,还可以使用RESTful API的身份验证,使用ansible_user和ansible_password。因此,请将其写入清单变量中或通过ansible-playbook命令进行设置。

请在命令行中传递参数时使用“-u”后面跟随用户名,这样在执行Playbook时ansible_user不会被设置。因此,请使用“-e”将用户名作为变量传递。

ansible-playbook -i hosts playbook.yml -k -e ansible_user=admin

试过之后的感受。

> ansible-playbook -i hosts playbook.yml -e ansible_user=admin -k
SSH password:

PLAY [Deploy Stand alone CMS] ******************************************************************************************************************

TASK [deploy_cms : Generate self-signed cert] **************************************************************************************************
changed: [cms1]

TASK [deploy_cms : Disble webadmin] ************************************************************************************************************
changed: [cms1]

# snip

TASK [deploy_cms : Add TURN Servers to CallBridge] *********************************************************************************************
ok: [cms1 -> localhost]

PLAY RECAP *************************************************************************************************************************************
cms1                       : ok=47   changed=33   unreachable=0    failed=0

您可以从以下链接下载Playbook~。

bannerAds