haixin3036 发表于 2018-1-2 23:40:03

使用ansible安装docker以及docker-compose

  环境三台centos7主机:
  master:192.168.101.14,node1:192.168.101.15,node2:192.168.101.19,利用master节点为两个node节点安装docker以及docker-compose
  首先在master上安装ansible,这里采用yum安装(epel中包含ansible,安装之前添加epel源)
  ansible基于ssh密钥认证,于是使用master给两个node进行ssh认证:
  

# ssh-keygen -t rsa -P ''  
#
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.101.15  
#
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.101.19  

  给两个node节点配置hosts:
  

# egrep -v "^#|^$" hosts  

  

192.168.101.15  
192.168.101.19
  

  于是准备工作完成,开始编写playbook:
  

# tree  
.
  
├── ansible.cfg
  
├── hosts
  
├── roles
  
│   ├── docker
  
│   │   ├── files
  
│   │   ├── handlers
  
│   │   │   └── main.yaml
  
│   │   ├── meta
  
│   │   ├── tasks
  
│   │   │   └── main.yaml
  
│   │   ├── templates
  
│   │   │   └── daemon.json.j2
  
│   │   └── vars
  
│   │       └── main.yaml
  
│   └── docker
-compose  
│       ├── files
  
│       │   └── docker
-compose-Linux-x86_64  
│       ├── handlers
  
│       ├── meta
  
│       ├── tasks
  
│       │   └── main.yaml
  
│       ├── templates
  
│       └── vars
  
│         └── main.yaml
  
└── work_dir
  ├── install_docker
-compose.retry  ├── install_docker
-compose.yaml  ├── install_docker.retry
  └── install_docker.yaml
  

  将上面的树形目录进行分解,查看docker这个role的内容:
  

# tree  
.
  
├── files         必要的一些需要的文件存放目录
  
├── handlers
  
│   └── main.yaml    handler处理的动作
  
├── meta          元数据存放的一些依赖
  
├── tasks
  
│   └── main.yaml    主要执行的任务
  
├── templates
  
│   └── daemon.json.j2      一些配置文件的存放
  
└── vars
  └── main.yaml          变量设置的存放目录
  

  查看tasks/main.yaml:
  

# cat tasks/main.yaml  

- name: install required packagesyum:  name:
"{{ item }}"         需要进行安装的一些包名  state: present               安装的包的状态
  with_items:                  对应上面的item(可以循环操作)
- yum-utils- device-mapper-persistent-data- lvm2  

  

- name: add docker repo to /etc/yum.repos.d  shell:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo  
register: result            将shell的操作结果注册为result
  

  
- name: install docker-ce
  yum:
  name: docker-ce
  state: present
  when: result|success         如果上面的result为success,则该任务执行
  

  
- name: create /etc/docker
  file:
  path: "{{ docker_config_dir }}"          利用file模块进行创建一个目录,引用变量
  state: directory
  

  
- name: start docker service
  systemd:                         centos7开启服务,添加到启动项
  name: docker
  state: started
  enabled: true
  

  
- name: provide docker-ce configfile
  template:
  src: daemon.json.j2               提供配置文件
  dest: /etc/docker/daemon.json
  notify: restart docker                  配置文件修改了触发通知机制,提醒handler
  

  查看handlers/main.yaml:
  

# cat handlers/main.yaml  

- name: restart docker  systemd:
  name: docker
  state: restarted            触发机制后,将服务进行重启
  enabled:
true  

  查看变量的设置:
  

# cat vars/main.yaml  
docker_config_dir:
/etc/docker  

  查看template的j2文件:
  

# cat templates/daemon.json.j2  
{
"registry-mirrors": ["https://cbd49ltj.mirror.aliyuncs.com"]  
}
  

  上面的展示了docker这个角色的任务,变量,配置文件,触发条件,但是这个角色作用在哪个环境,哪个节点并没有说明,于是工作目录就是解决这个问题的:
  

# tree  
.
  
├── install_docker
-compose.retry  
├── install_docker
-compose.yaml  
├── install_docker.retry
  
└── install_docker.yaml
  

  查看docker的work_dir:
  

# cat install_docker.yaml  

- hosts: container_nodes         对应hosts配置文件的两个节点  remote_user: root            执行使用root用户
  roles:
- docker                  针对的role名称  

  使用--syntax-check进行语法验证:
  

# ansible-playbook install_docker.yaml --syntax-check  

  
playbook: install_docker.yaml
  

  使用如下命令进行执行playbook:
  

# ansible-playbook install_docker.yaml  

  下面查看另一个角色docker-compose:
  

# tree  
.
  
├── files
  
│   └── docker
-compose-Linux-x86_64         docker-compose的二进制文件  
├── handlers
  
├── meta
  
├── tasks
  
│   └── main.yaml
  
├── templates
  
└── vars
  └── main.yaml
  

  由于docker-compose并不需要像服务启动,没有handler机制,查看task:
  

# cat tasks/main.yaml  

- name: copy docker-compose-Linux-x86_64 to /usr/local/bin  copy:
  src: ..
/files/docker-compose-Linux-x86_64            这里可以使用相对路径,可以使用绝对路径  dest:
"{{ docker_compose_dir }}/docker-compose-Linux-x86_64"  

  
- name: install docker-compose
  shell: cd "{{ docker_compose_dir }}" && mv docker-compose-Linux-x86_64 docker-compose && chmod +x docker-compose
  

  查看变量的设置:
  

# cat vars/main.yaml  
docker_compose_dir:
/usr/local/bin  

  最后执行的work_dir下面的install_docker-compose:
  

# cat install_docker-compose.yaml  

- hosts: container_nodes  remote_user: root
  roles:
- docker-compose  
页: [1]
查看完整版本: 使用ansible安装docker以及docker-compose