Ambari自定义服务开发-执行Shell命令
[toc]
# Execute - 代码中执行Shell命令
在写自定义服务中可能会用到很多shell命令,如创建目录、下载文件等等;resource_management
中有Execute方法,我们可以直接使用,使用方法如下
from resource_management import *
def install(self, env):
import params
env.set_params(params)
# 下载Doris安装包
Execute('wget {0} -O apache-doris-2.0.2-bin-x64.tar.gz'.format(params.doris_download))
# 将安装包解压到指定目录
Execute('tar -zxvf apache-doris-2.0.2-bin-x64.tar.gz -C /usr/hdp/3.1.5.0-152/')
# 删除下载的安装包
Execute('rm -rf apache-doris-2.0.2-bin-x64.tar.gz')
# 初始化环境变量
cmd = format("cd {doris_scripts_dir}; chmod +x ./changeOsConf.sh && sh ./changeOsConf.sh")
Execute(cmd)
# 创建日志目录
Execute(format('mkdir -p {LOG_DIR} && chown -R {doris_user}:{user_group} {LOG_DIR}'))
# 将服务目录权限设置为doris
Execute(format('chown -R {doris_user}:{user_group} {doris_base_dir}'))
# 设置 pid 目录权限
Execute(format('mkdir -p {doris_pid_dir} && chown -R {doris_user}:{user_group} {doris_pid_dir}'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 通过format引用配置文件中的变量
在上面样例代码中我们发现有很多{xxx}
的变量,如{doris_user}等,通过format()
函数可以自动将{xxx}
转换为我们设置的变量值。
获取的变量在params.py
中进行定义,还是拿{doris_user}
举例,它获取的就是params.py
中doris_user = config['configurations']['doris-env']['doris_user']
的值
tip: 在format中想获取的值,必须在
params.py
中通过config或者default()取到
# 常用命令
# 指定用户执行
cmd = Execute(format('mkdir -p {doris_pid_dir} && chown -R {doris_user}:{user_group} {doris_pid_dir}'))
# 指定doris_user用户执行命令
Execute(cmd , user=params.doris_user)
1
2
3
2
3
# 执行失败继续执行
cmd = Execute(format('mkdir -p {doris_pid_dir} && chown -R {doris_user}:{user_group} {doris_pid_dir}'))
# 指定doris_user用户执行命令,ignore_failures=True 的意思就是如果异常跳过该行命令,继续执行
Execute('cmd', user=params.doris_user, ignore_failures=True)
1
2
3
2
3
实际应用验证
在 install 中添加如下代码
print("Before Custom Exception")
Execute('wget', user=params.doris_user,ignore_failures=False)
print("Custom Exception")
1
2
3
2
3
设置 ignore_failures=False(默认就是False),安装时报错提示命令错误
在日志中也只能看到Before Custom Exception
,说明遇到异常后停止了
设置异常跳过再次安装
print("Before Custom Exception")
Execute('wget', user=params.doris_user,ignore_failures=True)
print("Custom Exception")
1
2
3
2
3
# 创建文件夹、文件
# 1. 创建两个目录,一个目录是通过params.py获取到的目录,另外一个是指定的:/var/run/test目录
# 2. mode : 目录权限为0755
# 3. owner:目录所属用户
# 4. group:目录所属用户组
# 5. create_parents:父目录如果不存在,是否创建父目录
Directory([params.doris_pid_dir,'/var/run/test'],
mode=0755,
cd_access='a',
owner=params.doris_user,
group=params.user_group,
create_parents=True
)
# 1. 创建两个目录,一个目录是通过params.py获取到的目录,另外一个是指定的:/var/run/test目录
# 2. mode :文件权限为0
# 3. owner:文件所属用户
# 4. group:文件所属用户组
# 5. content:文件创建后填写的内容
File([params.doris_pid_file, '/var/run/test/file.txt'],
mode=0644,
owner=params.doris_user,
group=params.user_group,
content='init content'
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 删除文件夹、文件
# 使用用户owner指定的用户删除目录
Directory(['/var/run/test2', '/var/run/test'],
action='delete',
owner=params.doris_user
)
# 使用用户owner指定的用户删除文件
File(['/var/run/test/file2.txt', '/var/run/test/file.txt'],
action='delete',
owner=params.doris_user
)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# subprocess执行shell命令获取返回值
当我们需要复杂的判断,通过Execute执行无法获取到运行命令的返回值,使用subprocess可以获取返回值
import subprocess
result = subprocess.check_output(['ls'], stderr=subprocess.STDOUT, shell=True,
universal_newlines=True)
print(result)
1
2
3
4
5
2
3
4
5
上次更新: 2024/04/08, 10:55:49