如果想给服务器安装docker,往往觉得yum install docker
一条命令就可以了,然而并非如此,CentOS7的官方仓库并没有docker,所以需要先增加一个可以安装docker的仓库,如果要增加仓库,最好是使用yum-config-manager
,所以思路就很清晰了:
- 卸载本机docker
- 增加docker仓库
- 安装docker
- 配置docker
所以我们需要按照以下命令执行:
# 卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine # 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Repo yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo # 更新并安装 yum makecache yum install -y docker-ce # 启动&自启动 systemctl start docker systemctl enable docker # 配置docker镜像加速 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io systemctl restart docker
有三种执行方式:
- 逐条执行
- 保存为文件,文件头加执行路径
#!/bin/bash
声明为shell脚本,传递到需要安装的服务器,chmod +x
赋予执行权限,直接执行 - 使用Nginx发布,直接
curl path | sh
执行
不过如果要是使用Ansible,该如何执行呢?
关于Ansible
关于Ansible的介绍网上很多,我觉得最大的不同是Ansible是幂等性的,可以理解为声明式的命令,Ansible不是像脚本一样,每一条执行下来,而是比对执行结果,如果服务器本身的状态就是执行后的状态,那么Ansible不会反复去执行。
但是有两个模块是例外,command
与shell
,所以为了效率,尽量改用其他的模块去完成操作。
安装Ansible
这次我主要想部署Kubernetes的测试环境,有4台服务器,分别为:
- 192.168.1.50 K_master
- 192.168.1.61 node01
- 192.168.1.62 node02
- 192.168.1.63 node03
而我们的Ansible服务器不在以上,以上均为被控服务器。
安装
在Ansible服务器执行:
# ansible在CentOS7中需要安装epel仓库 yum install -y epel-release yum install -y ansible # 配置ssh,默认rsa加密,保存目录(公钥)~/.ssh/id_rsa.pub ssh-keygen -t rsa # 配置无密码登陆,这里需要分别4次发送至4台服务器 ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip
配置
默认的Ansible终端管理是/etc/ansible/hosts
文件,注释掉所有内容后,添加需要管理的主机。
-
如果无需设置别名可如下配置,默认22端口可不加:
[kubernetes] 192.168.1.50 192.168.1.61:22
-
如果需要设置别名需如下配置,默认22端口可不加:
[kubernetes] k_master ansible_ssh_host=192.168.1.50 ansible_ssh_port=22 node01 ansible_ssh_host=192.168.1.61
这里我们还想对服务器进行分组,所以实际配置是这样的:
[kubernetes:children] kubernetes_master kubernetes_node [kubernetes_master] k_master ansible_ssh_host=10.0.1.50 [kubernetes_node] node01 ansible_ssh_host=10.0.1.61 node02 ansible_ssh_host=10.0.1.62 node03 ansible_ssh_host=10.0.1.63
配置完成后收入ansible all -m ping
查看是否成功。
配置Ansible Playbook
刚刚的ansible all -m ping
是一条ansible ad-hoc命令,可以理解为临时命令,而Ansible强大的地方在playbook,中文叫剧本,顾名思义,我们将所有需要执行的命令写入剧本,然后就可以一次性全部执行了。
如果是普通的单playbook文件,文件该如下配置:
比较简单,仅使用了shell
、service
与yum
三个模块。
请注意,YAML文件不可使用tab缩进
vi install_docker-ce.yml --- - hosts: kubernetes remote_user: root tasks: - include: tasks/remove_oldder_version_docker.yml - name: clean repo yum_repository: name: docker-ce state: absent notify: yum-clean-metadata - include: tasks/install_docker-ce_based.yml - name: config repo shell: yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo notify: yum-makecache - name: install docker-ce yum: name: docker-ce state: present - name: config docker repo shell: curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io - name: enable & start docker service: name: docker enabled: yes state: started handlers: - name: yum-clean-metadata shell: yum clean metadata - name: yum-makecache shell: yum makecache
可以看到大致的流程为,hosts
指定需要执行的主机,tasks
指定需要执行的命令,执行时如果有通知,则会让handlers
去执行一次任务。直接执行即运行命令:
# -v可查看详细信息输出 ansible-playbook install_docker-ce.yml
对于简单的playbook,一个文件即可,但是对于大型的playbook,太多的命令会让可阅读性大大降低,对此Ansible有个更强的,Ansible Playbook Roles。
一般别人提你会不会Ansible,其实说问:你会不会Ansible Playbook Roles?
初始化Roles文件
ansible-galaxy是ansible playbook roles的管理工具,有官方的仓库与网站可上传下载官方与用户分享的playbook,不需要重复造轮子,可以理解为包管理工具,可以立即为就是个pip
。
使用ansible-galaxy可以直接在当前目录创建roles目录结构,文件自动生成。
# 创建目录 cd /etc/ansible mkdir roles && cd roles/ # 初始化 ansible-galaxy init install_docker-ce # 查看目录结构 tree -L 3 install_docker-ce install_docker-ce/ ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml 8 directories, 8 files
简单来说,Roles就是将复杂的playbook文件分解为各个小文件,每个小文件为一个功能模块,可以复用。
同时Roles规范了目录结构,更利于阅读。
当然这些认识都很表面,但对于初次接触来说,足够了。目录结构中除了刚刚说的,还有很多没有提,用不到的忽略即可。
编辑Roles文件
因为安装docker-ce比较简单,所以只用到了tasks
与handlers
。涉及到6个文件的修改:
# tree roles/ roles/ └── install_docker-ce ├── defaults │ └── main.yml ├── files ├── handlers │ ├── main.yml │ ├── yum-clean-metadata.yml │ └── yum-makecache.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ ├── install_docker-ce_based.yml │ ├── main.yml │ └── remove_oldder_version_docker.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml
分别为:
- tasks/main.yml
- tasks/install_docker-ce_based.yml
- tasks/remove_oldder_version_docker.yml
- handlers/main.yml
- handlers/yum-clean-metadata.yml
- handlers/yum-makecache.yml
main文件为主文件,可以立即为Linux中的主配置文件,如果需要添加在其他文件,只需要在main.yml
将其他文件include进入即可,所以将单文件的playbook分解为6个文件,每个文件配置如下:
1 tasks/main.yml
--- # tasks file for install_docker-ce - include: remove_oldder_version_docker.yml - name: clean repo yum_repository: name: docker-ce state: absent notify: yum-clean-metadata - include: install_docker-ce_based.yml - name: config repo shell: yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo notify: yum-makecache - name: install docker-ce yum: name: docker-ce state: present - name: config docker repo shell: curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io - name: enable & start docker service: name: docker enabled: yes state: started
2 tasks/install_docker-ce_based.yml
--- # possible saved as install_docker-ce-based.yml - name: install yum-utils device-mapper-persistent-data lvm2 yum: name: ['yum-utils', 'device-mapper-persistent-data', 'lvm2'] state: latest
3 tasks/remove_oldder_version_docker.yml
--- # possible saved as remove_oldder_version_docker.yml - name: remove oldder version docker yum: name: ['docker', 'docker-client', 'docker-client-latest', 'docker-common', 'docker-latest', 'docker-latest-logrotate', 'docker-selinux', 'docker-engine', 'docker-engine-selinux'] state: absent
4 handlers/main.yml
--- # handlers file for install_docker-ce - include: yum-clean-metadata.yml - include: yum-makecache.yml
5 handlers/yum-clean-metadata.yml
--- - name: yum-clean-metadata shell: yum clean metadata
6 handlers/yum-makecache.yml
--- - name: yum-makecache shell: yum makecache
配置完成后,发现并没有配置hosts部分,这部分我们单独存放:
cd /etc/ansible mkdir workflow && cd workflow # vi install_docker-ce.yml --- - hosts: kubernetes remote_user: root roles: - install_docker-ce
这样,一个最简单的Ansible Playbook Roles就配置好了。
RUN Ansible Playbook
因为我事先已经运行过,所以对于可以幂等性的命令,均为OK,而changed的,多为非幂等性任务,每次运行都需要运行一次。
运行中会有些警告,大致意思就是有更好的模块可以选择,当然这里我还是直接使用了shell。
ansible-playbook install_docker-ce.yml PLAY [kubernetes] ************************************************************************************************************************************************************ TASK [Gathering Facts] ******************************************************************************************************************************************************* ok: [k_master] ok: [node03] ok: [node01] ok: [node02] TASK [install_docker-ce : remove oldder version docker] ********************************************************************************************************************** changed: [k_master] changed: [node03] changed: [node02] changed: [node01] TASK [install_docker-ce : clean repo] **************************************************************************************************************************************** ok: [k_master] ok: [node01] ok: [node02] ok: [node03] TASK [install_docker-ce : install yum-utils device-mapper-persistent-data lvm2] ********************************************************************************************** ok: [node03] ok: [node01] ok: [node02] ok: [k_master] TASK [install_docker-ce : config repo] *************************************************************************************************************************************** changed: [node02] changed: [k_master] changed: [node03] changed: [node01] TASK [install_docker-ce : install docker-ce] ********************************************************************************************************************************* changed: [node01] changed: [k_master] changed: [node02] changed: [node03] TASK [install_docker-ce : config docker repo] ******************************************************************************************************************************** [WARNING]: Consider using the get_url or uri module rather than running 'curl'. If you need to use command because get_url or uri is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message. changed: [k_master] changed: [node01] changed: [node02] changed: [node03] TASK [install_docker-ce : enable & start docker] ***************************************************************************************************************************** changed: [k_master] changed: [node03] changed: [node01] changed: [node02] RUNNING HANDLER [install_docker-ce : yum-makecache] ************************************************************************************************************************** [WARNING]: Consider using the yum module rather than running 'yum'. If you need to use command because yum is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message. changed: [node01] changed: [node03] changed: [k_master] changed: [node02] PLAY RECAP ******************************************************************************************************************************************************************* k_master : ok=9 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 node01 : ok=9 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 node02 : ok=9 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 node03 : ok=9 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
验证结果
# docker-ce版本 ansible kubernetes -m shell -a 'docker version' k_master | CHANGED | rc=0 >> Client: Version: 18.09.8 API version: 1.39 Go version: go1.10.8 Git commit: 0dd43dd87f Built: Wed Jul 17 17:40:31 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.8 API version: 1.39 (minimum version 1.12) Go version: go1.10.8 Git commit: 0dd43dd Built: Wed Jul 17 17:10:42 2019 OS/Arch: linux/amd64 Experimental: false node03 | CHANGED | rc=0 >> Client: Version: 18.09.8 API version: 1.39 Go version: go1.10.8 Git commit: 0dd43dd87f Built: Wed Jul 17 17:40:31 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.8 API version: 1.39 (minimum version 1.12) Go version: go1.10.8 Git commit: 0dd43dd Built: Wed Jul 17 17:10:42 2019 OS/Arch: linux/amd64 Experimental: false node01 | CHANGED | rc=0 >> Client: Version: 18.09.8 API version: 1.39 Go version: go1.10.8 Git commit: 0dd43dd87f Built: Wed Jul 17 17:40:31 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.8 API version: 1.39 (minimum version 1.12) Go version: go1.10.8 Git commit: 0dd43dd Built: Wed Jul 17 17:10:42 2019 OS/Arch: linux/amd64 Experimental: false node02 | CHANGED | rc=0 >> Client: Version: 18.09.8 API version: 1.39 Go version: go1.10.8 Git commit: 0dd43dd87f Built: Wed Jul 17 17:40:31 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.8 API version: 1.39 (minimum version 1.12) Go version: go1.10.8 Git commit: 0dd43dd Built: Wed Jul 17 17:10:42 2019 OS/Arch: linux/amd64 Experimental: false # docker是否开启启动 ansible kubernetes -m shell -a "systemctl list-unit-files | grep docker | awk '{print $2}'" k_master | CHANGED | rc=0 >> docker.service enabled docker.socket disabled node02 | CHANGED | rc=0 >> docker.service enabled docker.socket disabled node01 | CHANGED | rc=0 >> docker.service enabled docker.socket disabled node03 | CHANGED | rc=0 >> docker.service enabled docker.socket disabled