環境三台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