转自:https://www.cnblogs.com/jsonhc/p/7879028.html
环境三台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:
[root@docker ansible]# egrep -v "^#|^$" hosts [container_nodes] 192.168.101.15 192.168.101.19
于是准备工作完成,开始编写playbook:
[root@docker ansible]# 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的内容:
[root@docker docker]# tree . ├── files 必要的一些需要的文件存放目录 ├── handlers │ └── main.yaml handler处理的动作 ├── meta 元数据存放的一些依赖 ├── tasks │ └── main.yaml 主要执行的任务 ├── templates │ └── daemon.json.j2 一些配置文件的存放 └── vars └── main.yaml 变量设置的存放目录
查看tasks/main.yaml:
[root@docker docker]# cat tasks/main.yaml - name: install required packages yum: 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:
[root@docker docker]# cat handlers/main.yaml - name: restart docker systemd: name: docker state: restarted 触发机制后,将服务进行重启 enabled: true
查看变量的设置:
[root@docker docker]# cat vars/main.yaml docker_config_dir: /etc/docker
查看template的j2文件:
[root@docker docker]# cat templates/daemon.json.j2 { "registry-mirrors": ["https://cbd49ltj.mirror.aliyuncs.com"] }
上面的展示了docker这个角色的任务,变量,配置文件,触发条件,但是这个角色作用在哪个环境,哪个节点并没有说明,于是工作目录就是解决这个问题的:
[root@docker work_dir]# tree . ├── install_docker-compose.retry ├── install_docker-compose.yaml ├── install_docker.retry └── install_docker.yaml
查看docker的work_dir:
[root@docker work_dir]# cat install_docker.yaml - hosts: container_nodes 对应hosts配置文件的两个节点 remote_user: root 执行使用root用户 roles: - docker 针对的role名称
使用--syntax-check进行语法验证:
[root@docker work_dir]# ansible-playbook install_docker.yaml --syntax-check playbook: install_docker.yaml
使用如下命令进行执行playbook:
[root@docker work_dir]# ansible-playbook install_docker.yaml
下面查看另一个角色docker-compose:
[root@docker docker-compose]# tree . ├── files │ └── docker-compose-Linux-x86_64 docker-compose的二进制文件 ├── handlers ├── meta ├── tasks │ └── main.yaml ├── templates └── vars └── main.yaml
由于docker-compose并不需要像服务启动,没有handler机制,查看task:
[root@docker docker-compose]# 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
查看变量的设置:
[root@docker docker-compose]# cat vars/main.yaml docker_compose_dir: /usr/local/bin
最后执行的work_dir下面的install_docker-compose:
[root@docker work_dir]# cat install_docker-compose.yaml - hosts: container_nodes remote_user: root roles: - docker-compose
标签: ansible