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