• 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
  • 相关阅读:
    有关 JavaScript 的 10 件让人费解的事情
    Apache ab介绍1
    Oracle Raw,number,varchar2... 转换
    Flex开发者需要知道的10件事
    linux命令之nice
    JavaIO复习和目录文件的复制
    使用php获取网页内容
    linux 安装sysstat使用iostat、mpstat、sar、sa
    SQL Injection 实战某基金
    ubuntu root锁屏工具
  • 原文地址:https://www.cnblogs.com/evenchen/p/11937328.html
Copyright © 2020-2023  润新知