文章

类ansiable简单脚本模版实现

类ansiable简单脚本模版实现

类ansiable简单脚本模版实现

设计思路

预定义参数,基于模版文件,sed替换方式生成实际文件。可重复执行覆盖生成结果。

参数值配置

install-preset.txt配置文件例

1
2
3
4
5
6
7
8
# 使用说明
# 本文件为安装前的预置参数配置文件,执行同级目录下install-preset.sh脚本后,将预置的参数替换到相关配置文件中。
# 参数定义支持${}占位符方式向下引用传递。
# 注意执行前请先检查参数是否正确。

# 全局配置
## 虚拟ip地址
PRESET_VIP=192.168.0.100

模版文件定义和参数声明

xxx.tpl模版文件例

1
2
# 待赋值的参数,使用参数声明
ping ${PRESET_VIP}

参数赋值脚本

install-preset.sh脚本例

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/bin/bash

# 使用说明
# 本脚本为安装前的前置准备脚本,会读取同级目录下install-preset.txt文件,将预置的参数替换到相关配置文件中。

# 定义配置文件路径
CONFIG_FILE="install-preset.txt"

# 定义安装包目录
INSTALL_DIR=$PWD
INSTALL_BASE_DIR=$PWD/base
INSTALL_PLATFORM_DIR=$PWD/platform

# 读取配置文件并创建替换字典
declare -A config_vars

## 1、读取配置文件并将键值对存储到关联数组中
while IFS='=' read -r key value || [[ -n "$key" ]]; do
    # 去除行尾的换行符
    key=${key//$'\r'/}
    value=${value//$'\r'/}

    # 跳过以 # 开头的注释行
    if [[ "$key" =~ ^[[:space:]]*# ]]; then
        continue
    fi

    # 跳过空白行
    if [[ -z "$key" ]]; then
        continue
    fi

    # 去除前后的空白字符
    key=$(echo "$key" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
    value=$(echo "$value" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

    # 将键值对存储到关联数组中
    config_vars[$key]=$value
done < "$CONFIG_FILE"

## 2、定义函数,解析变量引用
parse_value() {
    local var_name=$1
    local value="${config_vars[$var_name]}"
    local new_value=""
    local regex="\$\{([A-Za-z0-9_]+)\}"

    while [[ "$value" =~ $regex ]]; do
        local ref_key="${BASH_REMATCH[1]}"
        local ref_value="${config_vars[$ref_key]}"
        if [[ -z "$ref_value" ]]; then
            echo "Error: Undefined variable \${$ref_key} in $var_name" >&2
            exit 1
        fi
        new_value="${value/\$\{$ref_key\}/$ref_value}"
        value="$new_value"
    done

    # 更新字典中的值
    config_vars[$var_name]="$value"
}

## 3、解析所有键的值中的变量引用
for key in "${!config_vars[@]}"; do
    parse_value "$key"
done

## 4、打印内容到控制台确认
echo "install preset variables:"
for key in "${!config_vars[@]}"; do
    echo "$key=${config_vars[$key]}"
done

# 将配置文件字典内容替换到指定文件内。例
## 对模版文件,模版文件内定义有替换量PRESET_VIP_VALUE,从参数字典里赋值
PRESET_VIP_VALUE="${config_vars[PRESET_VIP]}"
REPMGR_WITNESS_SERVICE_TPL_FILE="$INSTALL_PLATFORM_DIR/xxx.service.tpl"
REPMGR_WITNESS_SERVICE_FILE="$INSTALL_PLATFORM_DIR/xxx.service"
## 复制模版,作为最终文件
cp -f $REPMGR_WITNESS_SERVICE_TPL_FILE $REPMGR_WITNESS_SERVICE_FILE
## 参数替换的方式实现值设置操作
sed -i "s/\${PRESET_VIP}/$PRESET_VIP_VALUE/g" "$REPMGR_WITNESS_SERVICE_FILE"
## 注意:sed命令默认分隔符为/号,如果参数值也带有/符如ip地址带有子网掩码,需要修改分隔符如@
#sed -i "s@\${PRESET_KEEPALIVED_VIP_ADDR}@${PRESET_KEEPALIVED_VIP_ADDR_VALUE}@g" "$KEEPALIVED_SLAVE_CONF_FILE"
本文由作者按照 CC BY 4.0 进行授权