date: 2020-03-15title: playbook语法——安装docker示例 #标题
tags: playbook语法 #标签
categories: ansible # 分类

记录工作中使用到的编写playbook文件的语法。这篇博文的目的不在于实现某个功能,而是尽可能的展示playbook的多方面。

ansible中编写playbook文件,通过不同的角色执行操作。

入口文件

  1. [root@nginx ansible]# cat install_docker.yml # 入口文件如下
  2. ---
  3. - hosts: test1
  4. #sudo: yes # ansible 2 版本后,以什么用户执行什么命令改为以下方式
  5. become: yes
  6. become_user: root
  7. become_method: sudo
  8. gather_facts: no # 不收集主机信息
  9. roles:
  10. - docker
  11. - yum

执行入口文件

  1. [root@nginx ansible]# ansible-playbook install_docker.yml
  2. # 执行这条指令后,会发生什么呢?

1、找到hosts指定的主机组test1
2、sudo:yes 表示允许普通用户执行sudo权限
3、roles: roles会默认去找/etc/ansible/roles目录下找 docker和yum这两个role目录, 当然此目录也可以通过ansible.cfg文件修改,如下:

  1. [root@nginx ansible]# grep roles_path /etc/ansible/ansible.cfg
  2. #roles_path = /etc/ansible/roles

4、进入/etc/ansible/roles目录

  1. # 确定当前目录
  2. [root@nginx roles]# pwd
  3. /etc/ansible/roles
  4. # 可以使用`ansible-galaxy init role名称`指令来创建role目录,可以使用`--init-path`指定role的路径
  5. [root@nginx roles]# ansible-galaxy init docker
  6. - Role docker was created successfully
  7. [root@nginx roles]# ansible-galaxy init --init-path /etc/ansible/roles yum
  8. - Role yum was created successfully

查看docker角色目录结构及内容

  1. [root@nginx roles]# tree -C docker # 初始化的role目录结构如下
  2. docker/
  3. ├── defaults # 默认变量存放的目录,文件中定义了此角色使用的默认变量
  4. └── main.yml
  5. ├── files # 存放由copy或script等模块调用的文件,下面的两个文件是我自己准备的
  6. ├── daemon.json
  7. └── docker-ce.repo
  8. ├── handlers # 存放相关触发执行器的目录,在playbook中通过notify定义
  9. └── main.yml
  10. ├── meta # 定义当前角色的依赖关系
  11. └── main.yml
  12. ├── README.md
  13. ├── tasks # 任务存放的目录
  14. └── main.yml
  15. ├── templates # 存放template模块查找所需要的模块文件的目录,如mysql配置文件等模板
  16. ├── tests
  17. ├── inventory
  18. └── test.yml
  19. └── vars # 变量存放的目录
  20. └── main.yml

在上面的目录中,大多数目录下都会有一个main.yml文件,我们的tasks就写在那个文件中,当然,文件名也可以不是main.yml,但需要在main.yml文件中使用include进行引入,有些目录(比如files目录),则直接存放要使用的文件即可。

我们使用ansible-galaxy指令初始化的role目录,并不是所有目录都要有,用到哪个目录,创建哪个即可,比如我上面初始化的目录精简后如下:

  1. [root@nginx roles]# tree -C docker/
  2. docker/
  3. ├── files
  4. ├── daemon.json
  5. └── docker-ce.repo
  6. ├── meta
  7. └── main.yml
  8. └── tasks
  9. └── main.yml

daemon.json文件为配置镜像加速的文件
  1. [root@nginx roles]# cat docker/files/daemon.json # 下面的url自己去网上找,每个人的都不一样,我这里修改为错误的url了,不要复制我的哦
  2. # 搜索docker镜像加速服务即可。
  3. {
  4. "registry-mirrors": ["https://xxxxxxxxx.mirror.aliyuncs.com"]
  5. }

docker-ce.repo为配置的官方repo源文件
  1. [root@nginx roles]# cat docker/files/docker-ce.repo
  2. [docker-ce-stable]
  3. name=Docker CE Stable - $basearch
  4. baseurl=https://download.docker.com/linux/centos/7/$basearch/stable
  5. enabled=1
  6. gpgcheck=1
  7. gpgkey=https://download.docker.com/linux/centos/gpg
  8. [docker-ce-stable-debuginfo]
  9. name=Docker CE Stable - Debuginfo $basearch
  10. baseurl=https://download.docker.com/linux/centos/7/debug-$basearch/stable
  11. enabled=0
  12. gpgcheck=1
  13. gpgkey=https://download.docker.com/linux/centos/gpg
  14. [docker-ce-stable-source]
  15. name=Docker CE Stable - Sources
  16. baseurl=https://download.docker.com/linux/centos/7/source/stable
  17. enabled=0
  18. gpgcheck=1
  19. gpgkey=https://download.docker.com/linux/centos/gpg
  20. [docker-ce-edge]
  21. name=Docker CE Edge - $basearch
  22. baseurl=https://download.docker.com/linux/centos/7/$basearch/edge
  23. enabled=0
  24. gpgcheck=1
  25. gpgkey=https://download.docker.com/linux/centos/gpg
  26. [docker-ce-edge-debuginfo]
  27. name=Docker CE Edge - Debuginfo $basearch
  28. baseurl=https://download.docker.com/linux/centos/7/debug-$basearch/edge
  29. enabled=0
  30. gpgcheck=1
  31. gpgkey=https://download.docker.com/linux/centos/gpg
  32. [docker-ce-edge-source]
  33. name=Docker CE Edge - Sources
  34. baseurl=https://download.docker.com/linux/centos/7/source/edge
  35. enabled=0
  36. gpgcheck=1
  37. gpgkey=https://download.docker.com/linux/centos/gpg
  38. [docker-ce-test]
  39. name=Docker CE Test - $basearch
  40. baseurl=https://download.docker.com/linux/centos/7/$basearch/test
  41. enabled=0
  42. gpgcheck=1
  43. gpgkey=https://download.docker.com/linux/centos/gpg
  44. [docker-ce-test-debuginfo]
  45. name=Docker CE Test - Debuginfo $basearch
  46. baseurl=https://download.docker.com/linux/centos/7/debug-$basearch/test
  47. enabled=0
  48. gpgcheck=1
  49. gpgkey=https://download.docker.com/linux/centos/gpg
  50. [docker-ce-test-source]
  51. name=Docker CE Test - Sources
  52. baseurl=https://download.docker.com/linux/centos/7/source/test
  53. enabled=0
  54. gpgcheck=1
  55. gpgkey=https://download.docker.com/linux/centos/gpg
  56. [docker-ce-nightly]
  57. name=Docker CE Nightly - $basearch
  58. baseurl=https://download.docker.com/linux/centos/7/$basearch/nightly
  59. enabled=0
  60. gpgcheck=1
  61. gpgkey=https://download.docker.com/linux/centos/gpg
  62. [docker-ce-nightly-debuginfo]
  63. name=Docker CE Nightly - Debuginfo $basearch
  64. baseurl=https://download.docker.com/linux/centos/7/debug-$basearch/nightly
  65. enabled=0
  66. gpgcheck=1
  67. gpgkey=https://download.docker.com/linux/centos/gpg
  68. [docker-ce-nightly-source]
  69. name=Docker CE Nightly - Sources
  70. baseurl=https://download.docker.com/linux/centos/7/source/nightly
  71. enabled=0
  72. gpgcheck=1
  73. gpgkey=https://download.docker.com/linux/centos/gpg

tasks定义的是真正的任务
  1. [root@nginx roles]# cat docker/tasks/main.yml
  2. ---
  3. # tasks file for docker
  4. - name: Ensure old versions of Docker are not installed.
  5. package: #调用ansible的package模块,卸载rpm包
  6. name: '{{ item }}' #{{ item }} 使用模板变量语法,item可以迭代执行元素, 就是with_items中定义的元素
  7. state: absent # package安装包的几种状态 absent代表删除软件包 present 监测是否安装,否,则安装
  8. with_items:
  9. - lxc-docker
  10. - docker-engine
  11. - docker
  12. - docker-common
  13. - docker.io
  14. # 安装存储库
  15. - name: Ensure depend package is installed
  16. package:
  17. name: "{{ item }}"
  18. state: present
  19. with_items:
  20. - yum-utils
  21. - device-mapper-persistent-data
  22. - lvm2
  23. # 添加 repo
  24. - name: Add Docker repository.
  25. copy:
  26. src: docker-ce.repo # 这个文件就是docker/files/目录下的文件
  27. dest: /etc/yum.repos.d/docker-ce.repo
  28. owner: root
  29. group: root
  30. mode: 0644
  31. # 安装指定版本
  32. - name: Install docker
  33. package:
  34. name: "docker-ce-19.03.4-3.el7" # 指定版本名,可以找到repo仓库中的url,去查看相应的版本写到这,比如:docker-ce-17.09.1.ce-1.el7.centos
  35. state: present
  36. enablerepo: docker-ce-stable # 就去repo文件中找到这个仓库的url
  37. # 配置docker镜像加速器,默认docker镜像从国外下载,所以更改为阿里镜像站,加快速度
  38. - name: mkdir docker daemon directory
  39. file: # 创建/etc/docker目录
  40. path: /etc/docker/
  41. mode: 0600
  42. state: directory
  43. - name: Mirror accelerator
  44. copy:
  45. src: daemon.json # 这个文件也是docker/files/目录下的文件
  46. dest: /etc/docker/
  47. # 启动docker服务
  48. - name: Ensure Docker is started and enabled at boot
  49. systemd: # 调用systemd模块控制服务状态
  50. name: docker # 服务名为docker
  51. state: started # 启动docker服务
  52. enabled: yes # 开机自启动

meta定义的是docker角色所依赖的角色
  1. [root@nginx roles]# cat docker/meta/main.yml # 也就是说docker的tasks执行前肯定会先去执行yum的tasks
  2. ---
  3. dependencies:
  4. - { role: yum }

查看yum角色的目录结构及内容

  1. [root@nginx yum]# pwd # 确定当前目录
  2. /etc/ansible/roles/yum
  3. [root@nginx yum]# cat tasks/main.yml # 查看tasks任务
  4. ---
  5. # tasks file for yum
  6. - name: download epel repo
  7. get_url: # 调用get_url模块下载阿里的epel源
  8. url: http://mirrors.aliyun.com/repo/epel-7.repo
  9. dest: /etc/yum.repos.d/ # 下载到该目录
  10. mode: 0444 # 下载后的文件权限为所有人只读
  11. - name: install the 'Development tools' package group
  12. yum: # 调用yum模块安装开发者工具
  13. name: "@Development tools"
  14. state: present
  15. - name: Install packages
  16. yum: # 再次调用yum模块循环安装pkg_lists定义的模块
  17. name: "{{pkg_list}}"
  18. state: latest
  19. [root@nginx yum]# cat vars/main.yml # 查看定义的变量
  20. ---
  21. # vars file for yum
  22. pkg_list:
  23. - bash-completion
  24. - bash-completion-extras

我将上述的目录打了个压缩包,有需要的可以进行下载,提取码:jfu3。

执行结果如下:

  1. [root@nginx ansible]# ansible-playbook install_docker.yml
  2. PLAY [test1] ************************************************************************************************************************************************
  3. TASK [yum : download epel repo] *****************************************************************************************************************************
  4. changed: [192.168.20.2]
  5. changed: [192.168.20.3]
  6. TASK [yum : install the 'Development tools' package group] **************************************************************************************************
  7. ok: [192.168.20.2]
  8. ok: [192.168.20.3]
  9. TASK [yum : Install packages] *******************************************************************************************************************************
  10. changed: [192.168.20.3]
  11. changed: [192.168.20.2]
  12. TASK [docker : Ensure old versions of Docker are not installed.] ********************************************************************************************
  13. ok: [192.168.20.2] => (item=lxc-docker)
  14. ok: [192.168.20.3] => (item=lxc-docker)
  15. ok: [192.168.20.2] => (item=docker-engine)
  16. ok: [192.168.20.3] => (item=docker-engine)
  17. ok: [192.168.20.2] => (item=docker)
  18. ok: [192.168.20.3] => (item=docker)
  19. ok: [192.168.20.2] => (item=docker-common)
  20. ok: [192.168.20.3] => (item=docker-common)
  21. ok: [192.168.20.2] => (item=docker.io)
  22. ok: [192.168.20.3] => (item=docker.io)
  23. TASK [docker : Ensure depend package is installed] **********************************************************************************************************
  24. ok: [192.168.20.2] => (item=yum-utils)
  25. ok: [192.168.20.3] => (item=yum-utils)
  26. ok: [192.168.20.2] => (item=device-mapper-persistent-data)
  27. ok: [192.168.20.3] => (item=device-mapper-persistent-data)
  28. ok: [192.168.20.2] => (item=lvm2)
  29. ok: [192.168.20.3] => (item=lvm2)
  30. TASK [docker : Add Docker repository.] **********************************************************************************************************************
  31. changed: [192.168.20.3]
  32. changed: [192.168.20.2]
  33. TASK [docker : Install docker] ******************************************************************************************************************************
  34. changed: [192.168.20.3]
  35. changed: [192.168.20.2]
  36. TASK [docker : mkdir docker daemon directory] ***************************************************************************************************************
  37. changed: [192.168.20.2]
  38. changed: [192.168.20.3]
  39. TASK [docker : Mirror accelerator] **************************************************************************************************************************
  40. changed: [192.168.20.3]
  41. changed: [192.168.20.2]
  42. TASK [docker : Ensure Docker is started and enabled at boot] ************************************************************************************************
  43. changed: [192.168.20.3]
  44. changed: [192.168.20.2]
  45. PLAY RECAP **************************************************************************************************************************************************
  46. 192.168.20.2 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  47. 192.168.20.3 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

最后在客户端上查看docker的版本及运行状态都准确无误,如下:
docker版本:

  1. [root@nginx yum]# docker -v
  2. Docker version 19.03.8, build afacb8b

运行状态:

playbook语法——安装docker示例 - 图1