一、介绍
- 利用ansible的远程操作功能,实现修改服务器上的配置文件;
- 由于ansible操作服务器,一次需要2秒左右(16G8核),所以我压缩了执行步骤,一次执行完成(包括:目录创建、备份、覆盖文件);
- 只是用ansible的shell功能,操作是在内网完成(外网也不可能让你直接用命令修改文件!);
二、实现逻辑
2.1 创建目录路径的命令
mkdir -p /data/backup/temp/etc/nginx;
2.2 备份文件命令
cp /etc/nginx/yz_test.txt /data/backup/temp/etc/nginx/0011yz_test.txt;
2.3 覆盖文件命令(此地有坑,下面会讲!)
cat > /etc/nginx/yz_test.txt << "EOF"
文件内容
EOF;
2.4 整合命令
ansible '192.168.50.213' -m shell -a '
mkdir -p /data/backup/temp/etc/nginx;
cp /etc/nginx/yz_test.txt /data/backup/temp/etc/nginx/0024yz_test.txt;
cat > /etc/nginx/yz_test.txt << "EOF"
**省略**
log_format main '"'"'$remote_addr - $remote_user [$time_local] "$request" '"'"'
**省略**
EOF
'
- 整合后如上,ansible会把3条shell语句扔到目标服务器上去运行;
- 运送命令一定要用单引号,单引号会把命令原封不动的送过去;
- 覆盖文件的命令使用cat生成模拟文件,然后覆盖到远程服务器的目标文件上。注意1:此地用EOF作为结束标识,开始位置的EOF需要添加双引号,这样带$*的标识符才会原封不动的写入目标文件(带有$符号的是shell的变量,如果EOF不加双引号,带有$符号的字符串会被替换为空值)。注意2:由于EOF中的内容已经被单引号包围,所以EOF中的内容想要出现单引号就需要点手段,需要把 ' 转成 '"'"' (单引号被双引号包围,然后被单引号包围,这样就可以输出单引号了,有点绕是吧,必须要这样😔);
--------------------------------题外话:覆盖文件想到用过echo,未成功!!!---------------------------
echo 'log_format main '"'"'$remote_addr - $remote_user [$time_local] "$request" '"'"';'
1. 试了好久,直接执行是能成功的,但是放入ansible就会出错,要是用双引号带有$符号的字符就会替换为空或不执行!
2. 还有,echo用单引号包围内容会原封不动的输出,但是用双引号就会替换!