Ansible Playbook安裝Docker-CE


 

如果想給服務器安裝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不會反復去執行。
但是有兩個模塊是例外,commandshell,所以為了效率,盡量改用其他的模塊去完成操作。

 

安裝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文件,文件該如下配置:
比較簡單,僅使用了shellserviceyum三個模塊。
請注意,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比較簡單,所以只用到了taskshandlers。涉及到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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM