Contents

tee和cat的区别

Contents

最近整理了之前的k8s部署文档,为了统一规范,把所有的配置参数用EOF自动生成配置文件,本来用的cat生成的一切顺利,但是那个国内拉取k8s镜像的脚本出现了问题,换成tee一切正常,发现cat在执行的过程中,会吧shell命令的结果输入,而tee却不会,按照纯文本生成的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
tee image.sh <<-'EOF'
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.21.2
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done
EOF

##################
cat image.sh 
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.21.2
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done

这个生成的正确,而用cat生成的结果却很奇怪:

 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
cat <<EOF > image.sh 
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.21.2
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done
EOF

####################################################################
cat image.sh 
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.21.2
images=(kube-apiserver:v1.21.2
kube-controller-manager:v1.21.2
kube-scheduler:v1.21.2
kube-proxy:v1.21.2
pause:3.4.1
etcd:3.4.13-0
coredns)
for imagename in  ; do
  docker pull /
  docker tag / k8s.gcr.io/
  docker rmi -f /
done

还发现一个问题,除了将modprobe br_netfilter加入到rc.local里面以外,使用systemd自动加载模块也是不错的选择:

1
2
3
tee /etc/modules-load.d/k8s.conf <<-'EOF'
br_netfilter
EOF