Citrix Application Delivery Management 服务

在 Microsoft Azure 云上安装 Citrix ADM 代理

该代理充当 Citrix Application Delivery Management (Citrix ADM) 和企业数据中心或云上的托管实例之间的中介。

要在 Microsoft Azure 云上安装 Citrix ADM 代理,你必须在虚拟网络中创建代理的实例。从 Azure 市场获取 Citrix ADM 代理映像,然后使用 Azure Resource Manager 门户创建代理。

在开始创建 Citrix ADM 代理实例之前,请确保已创建具有实例将驻留的所需子网的虚拟网络。可以在 VM 置备期间创建虚拟网络,但无法灵活地创建不同的子网。有关创建虚拟网络的信息,请参阅http://azure.microsoft.com/en-us/documentation/articles/create-virtual-network

配置允许虚拟机访问 Internet 资源的 DNS 服务器和 VPN 连接。

必备条件

请确保您具备以下项:

  • Microsoft Azure 用户帐户
  • 访问 Microsoft Azure Resource Manager

注意

  • Citrix 建议在置备 Citrix ADM 代理虚拟机之前创建资源组、网络安全组、虚拟网络和其他实体,以便在 Provisioning 期间可用网络信息。
  • 为了使 Citrix ADM 代理与 Citrix ADM 和 Citrix ADC 实例进行通信,请确保推荐的端口已打开。有关 Citrix ADM 代理端口要求的完整详细信息,请参阅 端口

要在 Microsoft Azure 云上安装 Citrix ADM 代理,请执行以下操作:

  1. 通过使用你的 Microsoft Azure 凭据登录到 Azure 门户 (https://portal.azure.com)。

  2. 单击 + 创建资源

  3. 在搜索栏中键入 Citrix ADM Agent 并选择 Citrix ADM 服务代理

    Azure 网络窗格

  4. 单击创建

    创建资源管理器

  5. Create virtual machine(创建虚拟机)窗格中,在各个部分中指定所需的值以创建虚拟机。

    基础知识:

    在此选项卡中,指定 项目详细信息实例详细信息管理员帐户

    创建虚拟机

    • 资源组 — 从下拉列表中选择您创建 的资源组。

      注意

      您此时可以创建资源组,但 Citrix 建议您从 Azure Resource Manager 的资源组中创建资源组,然后从下拉列表中选择该组。

    • 虚拟机名称 — 指定 Citrix ADM 代理实例的名称。

    • 区域 -选择要部署代理的区域。

    • 可用性选项 — 从列表中选择可用性集。

    • 图像 -此字段显示已选择的座席映像。如果要更改为其他代理映像,请从列表中选择所需的映像。

    • 大小 - 指定用于部署 Citrix ADM 代理的虚拟磁盘的类型和大小。

      从列表中选择支持的虚拟磁盘类型(HDDSSD)。

    • 身份验证类型 — 选择密码。

    • 用户名和密码 — 指定用户名和密码以访问您创建的资源组中的资源。

    磁盘:

    在此选项卡中,指定 磁盘选项数据磁盘。

    指定磁盘信息

    • 操作系统磁盘类型 -选择虚拟磁盘类型(HDD 或 SSD)。

    网络连接:

    指定所需的网络详细信息:

    指定网络

    • 虚拟网络 — 选择虚拟网络。
    • 子网 — 设置子网地址。
    • 公有 IP 地址 — 选择 IP 地址。
    • 网络安全组 — 选择您创建的安全组。
    • 选择入站端口 -如果允许公用入站端口,请确保在安全组中配置了入站和出站规则。然后,从列表中选择入站端口。有关详细信息,请参阅先决条件

    管理层:

    指定 Azure 安全中心监控身份

    指定管理

    高级:

    可选,指定 扩展程序自定义数据邻近置放群组

    指定高级

    在自定 义数据中,您可以指定代理自动注册脚本以向 ADM 服务注册代理。以下是运行脚本并注册代理的示例 deployment.py 脚本:

    ```python
    #!/var/python/bin/python2.7
    导入 OS
    导入请求
    导入 json
    导入时间
    重新进口
    导入日志
    导入 logging.Candler
    进口 boto3
    
    '''
    脚本概述:
    该脚本有助于向 ADM 注册 ADM 代理。将其传入用户数据,以使 AWS 中的 ADM 代理在启动时自动注册。工作流程如下
    1)  从 AWS 秘密存储中获取 ADM 服务 API 凭证(ID 和密钥)(注意:您必须将 IAM 角色分配给 ADM Agent,该代理将授予从 AWS 秘密存储中获取密钥的权限)
    2)  使用步骤 1 中获取的凭据登录 ADM 服务
    3)  调用 ADM 服务获取用于代理注册的凭证(ServicEurL 和令牌)
    4)  使用步骤 3 中获取的凭据进行呼叫注册
    '''
    
    '''
    这些是您需要根据设置配置替换的占位符
    aws_secret_id:存储 ADM 凭证的 AWS 密钥的 ID
    密钥值应该采用以下 json 格式
    {“adm_user_id_key”: “YOUR_ID”, “adm_user_Secre_key”: “YOUR_Secret”}
    '''
    
    aws_Secre_id = "<AWS_secret_id>”
    adm_ip_or_hostname = "<YOUR_ADM_POP> .adm.cloud.com”
    
    '''
    使用所需的输出级别和日志文件名设置特定的记录器
    '''
    log_file_name_local = os.path.basename (__file__)
    LOG_FILENAME = '/var/log/' + 'bootstrap' + '.log'
    LOG_MAX_BYTE = 50* 1024*1024
    LOG_BACKUP_COUNT = 20
    
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.debug)
    logger_handler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=LOG_MAX_BYTE, backupCount=LOG_BACKUP_COUNT)
    logger_fortmater = logging.Formatter(fmt='%(asctime)-2s:%(funcName)30s:%(lineno)4d: [%(levelname)s] %(message)s', datefmt="%Y-%m-%d %H:%M:%S")
    logger_handler.setFormatter(logger_fortmater)
    logger.addHandler(logger_handler)
    
    class APIHandlerException(Exception):
    def __init__(self, error_code, message):
    self.error_code = error_code
    self.message = message
    
    def __str__(self):
    return self.message + ". Error code '" + str(self.error_code) + "'"
    
    def parse_response(response, url, print_response=True):
    if not response.ok:
    if "reboot" in url:
    logger.debug('No response for url: reboot')
    resp = {"errorcode": "500", "message": "Error while reading response."}
    return resp
    
    if print_response:
    logger.debug('Response text for %s is %s' % (url, response.text))
    
    response = json.loads(response.text)
    logger.debug("ErrorCode - " + str(response['errorcode']) + ". Message -" + str(response['message']))
    raise APIHandlerException(response['errorcode'], str(response['message']))
    elif response.text:
    if print_response:
    logger.debug('Response text for %s is %s' % (url, response.text))
    
    result = json.loads(response.text)
    if 'errorcode' in result and result['errorcode'] > 0:
    raise APIHandlerException(result['errorcode'], str(result['message']))
    return result
    
    def _request(method, url, data=None, headers=None, retry=3, print_response=True):
    try:
    response = requests.request(method, url, data=data, headers=headers)
    result = parse_response(response, url, print_response=print_response)
    return result
    except [requests.exceptions.ConnectionError, requests.exceptions.ConnectTimeout]:
    if retry > 0:
    return _request(method, url, data, headers, retry-1, print_response=print_response)
    else:
    raise APIHandlerException(503, 'ConnectionError')
    except requests.exceptions.RequestException as e:
    logger.debug(str(e))
    raise APIHandlerException(500, str(e))
    except APIHandlerException as e:
    logger.debug("URL: %s, Error: %s, Message: %s" % (url, e.error_code, e.message))
    raise e
    except Exception as e:
    raise APIHandlerException(500, str(e))
    
    try:
    '''Get the AWS Region'''
    client = boto3.client('s3')
    my_region = client.meta.region_name
    logger.debug("The rgion is %s" % (my_region))
    
    '''Creating a Boto cleint session'''
    session = boto3.session.Session()
    client = session.client(
    service_name='secretsmanager',
    region_name=my_region
    )
    
    '''Getting the values stored in the secret with id: <aws_secret_id>'''
    get_id_value_response = client.get_secret_value(
    SecretId = aws_secret_id
    )
    adm_user_id = json.loads(get_id_value_response["SecretString"])["adm_user_id_key"]
    adm_user_secret = json.loads(get_id_value_response["SecretString"])["adm_user_secret_key"]
    
    except Exception as e:
    logger.debug("Fetching of ADM credentials from AWS secret failed with error: %s" % (str(e)))
    raise e
    
    '''
    初始化常见的 ADM API 处理程序
    '''
    mas_common_header = {
    'Content-Type': "application/json",
    'Accept-type': "application/json",
    'Connection': "keep-alive",
    'isCloud': "true"
    }
    
    '''
    用于登录 ADM 并获取会话 ID 和租户 ID 的 API
    '''
    url = "https://" + str(adm_ip_or_hostname) + "/nitro/v1/config/login"
    payload = 'object={"login":{"ID":"' + adm_user_id + '","Secret":"' + adm_user_secret + '"}}'
    try:
    response = _request("POST", url, data=payload, headers=mas_common_headers)
    sessionid = response["login"][0]["sessionid"]
    tenant_id = response["login"][0]["tenant_name"]
    except Exception as e:
    logger.debug("Login call to the ADM failed with error: %s" % (str(e)))
    raise e
    
    '''
    API 获取用于向 ADM 注册代理的服务 URL 和令牌
    '''
    mas_common_headers['Cookie'] = 'SESSID=' + str(sessionid)
    url = "https://" + str(adm_ip_or_hostname) + "/nitro/v1/config/trust_preauthtoken/" + tenant_id +"?customer="+ tenant_id
    logger.debug("Fetching Service URL and Token.")
    try:
    response = _request("GET", url, data=None, headers=mas_common_headers)
    service_name  = response["trust_preauthtoken"][0]["service_name"]
    token = response["trust_preauthtoken"][0]["token"]
    api_gateway_url = response["trust_preauthtoken"][0]["api_gateway_url"]
    except Exception as e:
    logger.debug("Fetching of the Service URL Passed with error. %s" % (str(e)))
    raise e
    
    '''
    使用我们之前检索到的值运行 register agent 命令
    '''
    try:
    registeragent_command = "registeragent -serviceurl "+api_gateway_url+" -activationcode "+service_name+"\;"+token
    file_run_command = "/var/python/bin/python2.7 /mps/register_agent_cloud.py "+registeragent_command
    logger.debug("Executing registeragent command: %s" % (file_run_command))
    os.system(file_run_command)
    except Exception as e:
    logger.debug("Agent Registeration failed with error: %s" % (str(e)))
    raise e
    ```
    

    如果指定此自动注册脚本,请跳过步骤 7 和 8。

    标记:

    键入 ADM 代理标签的键值对。标签由区分大小写的键值对组成。这些标签使您能够轻松组织和识别代理。这些标记同时应用于 Azure 和 Citrix ADM。

    指定标签

    配置设置已验证, 查看和创建 选项卡将显示验证结果。

    • 如果验证失败,此选项卡将显示失败的原因。返回到特定部分,并根据需要进行更改。
    • 如果验证通过,请单击 创建。代理部署过程开始。

      虚拟机摘要

      部署过程可能需要大约 10-15 分钟。部署成功完成后,您可以在 Microsoft Azure 帐户中查看 Citrix ADM 代理虚拟机。

    部署虚拟机

  6. 代理启动并运行后,使用 SSH 客户端,请使用 公有 IP 地址登录到 Citrix ADM 代理。

    注意

     -  如果将用户名指定为 `nsrecover`,请使用默认 Citrix ADM 代理凭据 (**ns恢复/nsroot**) 登录虚拟机。
    
    • Citrix 建议您在第一次登录后更改默认密码。要更改密码,请在 shell 下键入:passwd nsroot
  7. 输入以下命令以调用部署屏幕: 部署类型 .py

  8. 按照中的说明在 Citrix ADM 中的 置代 页面中输入复制和保存的 服务 URL 和激活代码入门 。代理使用服务 URL 查找服务,并使用激活代码向服务注册。

    注册代理

代理注册成功后,代理程序将重新启动以完成安装过程。

代理重新启动后,访问 Citrix ADM,然后在 设置代理 页面的 “已 发现代 理” 下,验证代理的状态。

在 Microsoft Azure 云上安装 Citrix ADM 代理