date: 2020-03-15title: playbook语法——安装docker示例 #标题
tags: playbook语法 #标签
categories: ansible # 分类
记录工作中使用到的编写playbook文件的语法。这篇博文的目的不在于实现某个功能,而是尽可能的展示playbook的多方面。
ansible中编写playbook文件,通过不同的角色执行操作。
入口文件
[root@nginx ansible]# cat install_docker.yml # 入口文件如下---- hosts: test1#sudo: yes # ansible 2 版本后,以什么用户执行什么命令改为以下方式become: yesbecome_user: rootbecome_method: sudogather_facts: no # 不收集主机信息roles:- docker- yum
执行入口文件
[root@nginx ansible]# ansible-playbook install_docker.yml# 执行这条指令后,会发生什么呢?
1、找到hosts指定的主机组test1
2、sudo:yes 表示允许普通用户执行sudo权限
3、roles: roles会默认去找/etc/ansible/roles目录下找 docker和yum这两个role目录, 当然此目录也可以通过ansible.cfg文件修改,如下:
[root@nginx ansible]# grep roles_path /etc/ansible/ansible.cfg#roles_path = /etc/ansible/roles
4、进入/etc/ansible/roles目录
# 确定当前目录[root@nginx roles]# pwd/etc/ansible/roles# 可以使用`ansible-galaxy init role名称`指令来创建role目录,可以使用`--init-path`指定role的路径[root@nginx roles]# ansible-galaxy init docker- Role docker was created successfully[root@nginx roles]# ansible-galaxy init --init-path /etc/ansible/roles yum- Role yum was created successfully
查看docker角色目录结构及内容
[root@nginx roles]# tree -C docker # 初始化的role目录结构如下docker/├── defaults # 默认变量存放的目录,文件中定义了此角色使用的默认变量│ └── main.yml├── files # 存放由copy或script等模块调用的文件,下面的两个文件是我自己准备的│ ├── daemon.json│ └── docker-ce.repo├── handlers # 存放相关触发执行器的目录,在playbook中通过notify定义│ └── main.yml├── meta # 定义当前角色的依赖关系│ └── main.yml├── README.md├── tasks # 任务存放的目录│ └── main.yml├── templates # 存放template模块查找所需要的模块文件的目录,如mysql配置文件等模板├── tests│ ├── inventory│ └── test.yml└── vars # 变量存放的目录└── main.yml
在上面的目录中,大多数目录下都会有一个main.yml文件,我们的tasks就写在那个文件中,当然,文件名也可以不是main.yml,但需要在main.yml文件中使用include进行引入,有些目录(比如files目录),则直接存放要使用的文件即可。
我们使用ansible-galaxy指令初始化的role目录,并不是所有目录都要有,用到哪个目录,创建哪个即可,比如我上面初始化的目录精简后如下:
[root@nginx roles]# tree -C docker/docker/├── files│ ├── daemon.json│ └── docker-ce.repo├── meta│ └── main.yml└── tasks└── main.yml
daemon.json文件为配置镜像加速的文件
[root@nginx roles]# cat docker/files/daemon.json # 下面的url自己去网上找,每个人的都不一样,我这里修改为错误的url了,不要复制我的哦# 搜索docker镜像加速服务即可。{"registry-mirrors": ["https://xxxxxxxxx.mirror.aliyuncs.com"]}
docker-ce.repo为配置的官方repo源文件
[root@nginx roles]# cat docker/files/docker-ce.repo[docker-ce-stable]name=Docker CE Stable - $basearchbaseurl=https://download.docker.com/linux/centos/7/$basearch/stableenabled=1gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-stable-debuginfo]name=Docker CE Stable - Debuginfo $basearchbaseurl=https://download.docker.com/linux/centos/7/debug-$basearch/stableenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-stable-source]name=Docker CE Stable - Sourcesbaseurl=https://download.docker.com/linux/centos/7/source/stableenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-edge]name=Docker CE Edge - $basearchbaseurl=https://download.docker.com/linux/centos/7/$basearch/edgeenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-edge-debuginfo]name=Docker CE Edge - Debuginfo $basearchbaseurl=https://download.docker.com/linux/centos/7/debug-$basearch/edgeenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-edge-source]name=Docker CE Edge - Sourcesbaseurl=https://download.docker.com/linux/centos/7/source/edgeenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-test]name=Docker CE Test - $basearchbaseurl=https://download.docker.com/linux/centos/7/$basearch/testenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-test-debuginfo]name=Docker CE Test - Debuginfo $basearchbaseurl=https://download.docker.com/linux/centos/7/debug-$basearch/testenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-test-source]name=Docker CE Test - Sourcesbaseurl=https://download.docker.com/linux/centos/7/source/testenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-nightly]name=Docker CE Nightly - $basearchbaseurl=https://download.docker.com/linux/centos/7/$basearch/nightlyenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-nightly-debuginfo]name=Docker CE Nightly - Debuginfo $basearchbaseurl=https://download.docker.com/linux/centos/7/debug-$basearch/nightlyenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg[docker-ce-nightly-source]name=Docker CE Nightly - Sourcesbaseurl=https://download.docker.com/linux/centos/7/source/nightlyenabled=0gpgcheck=1gpgkey=https://download.docker.com/linux/centos/gpg
tasks定义的是真正的任务
[root@nginx roles]# cat docker/tasks/main.yml---# tasks file for docker- name: Ensure old versions of Docker are not installed.package: #调用ansible的package模块,卸载rpm包name: '{{ item }}' #{{ item }} 使用模板变量语法,item可以迭代执行元素, 就是with_items中定义的元素state: absent # package安装包的几种状态 absent代表删除软件包 present 监测是否安装,否,则安装with_items:- lxc-docker- docker-engine- docker- docker-common- docker.io# 安装存储库- name: Ensure depend package is installedpackage:name: "{{ item }}"state: presentwith_items:- yum-utils- device-mapper-persistent-data- lvm2# 添加 repo- name: Add Docker repository.copy:src: docker-ce.repo # 这个文件就是docker/files/目录下的文件dest: /etc/yum.repos.d/docker-ce.repoowner: rootgroup: rootmode: 0644# 安装指定版本- name: Install dockerpackage:name: "docker-ce-19.03.4-3.el7" # 指定版本名,可以找到repo仓库中的url,去查看相应的版本写到这,比如:docker-ce-17.09.1.ce-1.el7.centosstate: presentenablerepo: docker-ce-stable # 就去repo文件中找到这个仓库的url# 配置docker镜像加速器,默认docker镜像从国外下载,所以更改为阿里镜像站,加快速度- name: mkdir docker daemon directoryfile: # 创建/etc/docker目录path: /etc/docker/mode: 0600state: directory- name: Mirror acceleratorcopy:src: daemon.json # 这个文件也是docker/files/目录下的文件dest: /etc/docker/# 启动docker服务- name: Ensure Docker is started and enabled at bootsystemd: # 调用systemd模块控制服务状态name: docker # 服务名为dockerstate: started # 启动docker服务enabled: yes # 开机自启动
meta定义的是docker角色所依赖的角色
[root@nginx roles]# cat docker/meta/main.yml # 也就是说docker的tasks执行前肯定会先去执行yum的tasks---dependencies:- { role: yum }
查看yum角色的目录结构及内容
[root@nginx yum]# pwd # 确定当前目录/etc/ansible/roles/yum[root@nginx yum]# cat tasks/main.yml # 查看tasks任务---# tasks file for yum- name: download epel repoget_url: # 调用get_url模块下载阿里的epel源url: http://mirrors.aliyun.com/repo/epel-7.repodest: /etc/yum.repos.d/ # 下载到该目录mode: 0444 # 下载后的文件权限为所有人只读- name: install the 'Development tools' package groupyum: # 调用yum模块安装开发者工具name: "@Development tools"state: present- name: Install packagesyum: # 再次调用yum模块循环安装pkg_lists定义的模块name: "{{pkg_list}}"state: latest[root@nginx yum]# cat vars/main.yml # 查看定义的变量---# vars file for yumpkg_list:- bash-completion- bash-completion-extras
我将上述的目录打了个压缩包,有需要的可以进行下载,提取码:jfu3。
执行结果如下:
[root@nginx ansible]# ansible-playbook install_docker.ymlPLAY [test1] ************************************************************************************************************************************************TASK [yum : download epel repo] *****************************************************************************************************************************changed: [192.168.20.2]changed: [192.168.20.3]TASK [yum : install the 'Development tools' package group] **************************************************************************************************ok: [192.168.20.2]ok: [192.168.20.3]TASK [yum : Install packages] *******************************************************************************************************************************changed: [192.168.20.3]changed: [192.168.20.2]TASK [docker : Ensure old versions of Docker are not installed.] ********************************************************************************************ok: [192.168.20.2] => (item=lxc-docker)ok: [192.168.20.3] => (item=lxc-docker)ok: [192.168.20.2] => (item=docker-engine)ok: [192.168.20.3] => (item=docker-engine)ok: [192.168.20.2] => (item=docker)ok: [192.168.20.3] => (item=docker)ok: [192.168.20.2] => (item=docker-common)ok: [192.168.20.3] => (item=docker-common)ok: [192.168.20.2] => (item=docker.io)ok: [192.168.20.3] => (item=docker.io)TASK [docker : Ensure depend package is installed] **********************************************************************************************************ok: [192.168.20.2] => (item=yum-utils)ok: [192.168.20.3] => (item=yum-utils)ok: [192.168.20.2] => (item=device-mapper-persistent-data)ok: [192.168.20.3] => (item=device-mapper-persistent-data)ok: [192.168.20.2] => (item=lvm2)ok: [192.168.20.3] => (item=lvm2)TASK [docker : Add Docker repository.] **********************************************************************************************************************changed: [192.168.20.3]changed: [192.168.20.2]TASK [docker : Install docker] ******************************************************************************************************************************changed: [192.168.20.3]changed: [192.168.20.2]TASK [docker : mkdir docker daemon directory] ***************************************************************************************************************changed: [192.168.20.2]changed: [192.168.20.3]TASK [docker : Mirror accelerator] **************************************************************************************************************************changed: [192.168.20.3]changed: [192.168.20.2]TASK [docker : Ensure Docker is started and enabled at boot] ************************************************************************************************changed: [192.168.20.3]changed: [192.168.20.2]PLAY RECAP **************************************************************************************************************************************************192.168.20.2 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0192.168.20.3 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
最后在客户端上查看docker的版本及运行状态都准确无误,如下:
docker版本:
[root@nginx yum]# docker -vDocker version 19.03.8, build afacb8b
运行状态:

