自定义 Ambari 服务的 Ambari 用户和组管理

Posted

技术标签:

【中文标题】自定义 Ambari 服务的 Ambari 用户和组管理【英文标题】:Ambari User & Group Management for Custom Ambari Services 【发布时间】:2020-06-05 14:29:20 【问题描述】:

我使用自定义 Ambari 服务已经有一段时间了。我已经能够安装几个不同的自定义组件。我创建了多个管理包,并认为自己在使第三方服务在 Ambari 中运行方面非常有经验。

每当我安装自定义服务时,我都会收到用户 KeyError,例如 Elasticsearch:

Traceback (most recent call last):
  File "/var/lib/ambari-agent/cache/stack-hooks/before-ANY/scripts/hook.py", line 38, in <module>
    BeforeAnyHook().execute()
  File "/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py", line 352, in execute
    method(env)
  File "/var/lib/ambari-agent/cache/stack-hooks/before-ANY/scripts/hook.py", line 31, in hook
    setup_users()
  File "/var/lib/ambari-agent/cache/stack-hooks/before-ANY/scripts/shared_initialization.py", line 50, in setup_users
    groups = params.user_to_groups_dict[user],
KeyError: u'elasticsearch'
Error: Error: Unable to run the custom hook script ['/usr/bin/python', '/var/lib/ambari-agent/cache/stack-hooks/before-ANY/scripts/hook.py', 'ANY', '/var/lib/ambari-agent/data/command-15.json', '/var/lib/ambari-agent/cache/stack-hooks/before-ANY', '/var/lib/ambari-agent/data/structured-out-15.json', 'INFO', '/var/lib/ambari-agent/tmp', 'PROTOCOL_TLSv1_2', '']

一个已知的解决方法是执行 python 命令来关闭用户/组管理:

python /var/lib/ambari-server/resources/scripts/configs.py -u admin -p admin -n [CLUSTER_NAME] -l [CLUSTER_FQDN] -t 8080 -a set -c cluster-env -k  ignore_groupsusers_create -v true

但是,如果您想再次安装本机服务,这会使集群处于不良状态。如果我执行 python 命令重新打开用户/组管理,下一次本机服务安装将再次因第三方用户密钥对象错误而失败。

是否存在包含 ambari 管理的用户和组的列表或键值对象的数据库表? 满足原始错误似乎是唯一的统包解决方案。

我尝试自己定位键值对象,我也尝试创建用户组,我什至尝试修改执行安装的代理/服务器代码。接下来我会尝试更多,但我认为这可能是 SO 的第一篇文章。

【问题讨论】:

【参考方案1】:

同样的错误卡了几个小时,这是调查的结果。

首先,我们需要知道 Ambari 有一个主要组用于堆栈中的所有服务。 其次,用户的创建非常隐蔽,一看就猜不到创建的时间和地点以及参数的来源。

最后还有一个问题,我们如何设置params.user_to_groups_dict[user]

“主组”设置在&lt;stack_name&gt;/&lt;stack_version&gt;/configuration/cluster-env.xml,对我来说是HDP/3.0/configuration/cluster-env.xml

  <property>
    <name>user_group</name>
    <display-name>Hadoop Group</display-name>
    <value>hadoop</value>
    <property-type>GROUP</property-type>
    <description>Hadoop user group.</description>
    <value-attributes>
      <type>user</type>
      <overridable>false</overridable>
    </value-attributes>
    <on-ambari-upgrade add="true"/>
  </property>

该参数将用于服务中的任何地方来声明组,例如zookeeper具有env.xml,例如:

  <property>
    <name>zk_user</name>
    <display-name>ZooKeeper User</display-name>
    <value>sdp-zookeeper</value>
    <property-type>USER</property-type>
    <description>ZooKeeper User.</description>
    <value-attributes>
      <type>user</type>
      <overridable>false</overridable>
      <user-groups>
        <property>
          <type>cluster-env</type>
          <name>user_group</name>
        </property>
      </user-groups>
    </value-attributes>
    <on-ambari-upgrade add="true"/>
  </property>

value-attributes: user-groups 有一个魔力,其中一个属性链接到 cluster-envuser_group 参数。这就是我们正在寻找的连接。

答案是设置用户参数,比如zookeeper用户。

向导搜索堆栈并找到正确的用户/组来管理您使用向导选择的服务。

包含params.user_to_groups_dict 的地图将在集群向导运行时创建,并在/var/lib/ambari-agent/data/command-xy.json 上运行:

    "clusterLevelParams": 
        "stack_version": "3.0",
        "not_managed_hdfs_path_list": "[\"/tmp\"]",
        "hooks_folder": "stack-hooks",
        "stack_name": "HDP",
        "group_list": "[\"sdp-hadoop\",\"users\"]",
        "user_groups": "\"httpfs\":[\"hadoop\"],\"ambari-qa\":[\"hadoop\",\"users\"],\"hdfs\":[\"hadoop\"],\"zookeeper\":[\"hadoop\"]",
        "cluster_name": "test",
        "dfs_type": "HDFS",
        "user_list": "[\"httpfs\",\"hdfs\",\"ambari-qa\",\"sdp-zookeeper\"]"
    ,

【讨论】:

好资料,谢谢分享,我需要花一些时间在原来的管理包(用于添加自定义服务/用户),看看我是否可以将用户/组创建调整为效果你分享了什么。不确定这需要多长时间,因为我正在以另一种身份工作。届时将更新/接受。

以上是关于自定义 Ambari 服务的 Ambari 用户和组管理的主要内容,如果未能解决你的问题,请参考以下文章

如何删除Ambari已有的服务

Ambari部署Storm

调试 ambari-server 总结

Ambari 二次开发

Ambari部署Hive

2ambari搭建HDP集群