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: yes
become_user: root
become_method: sudo
gather_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 - $basearch
baseurl=https://download.docker.com/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/7/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://download.docker.com/linux/centos/7/source/stable
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-edge]
name=Docker CE Edge - $basearch
baseurl=https://download.docker.com/linux/centos/7/$basearch/edge
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-edge-debuginfo]
name=Docker CE Edge - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/7/debug-$basearch/edge
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-edge-source]
name=Docker CE Edge - Sources
baseurl=https://download.docker.com/linux/centos/7/source/edge
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://download.docker.com/linux/centos/7/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/7/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://download.docker.com/linux/centos/7/source/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://download.docker.com/linux/centos/7/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/7/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://download.docker.com/linux/centos/7/source/nightly
enabled=0
gpgcheck=1
gpgkey=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 installed
package:
name: "{{ item }}"
state: present
with_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.repo
owner: root
group: root
mode: 0644
# 安装指定版本
- name: Install docker
package:
name: "docker-ce-19.03.4-3.el7" # 指定版本名,可以找到repo仓库中的url,去查看相应的版本写到这,比如:docker-ce-17.09.1.ce-1.el7.centos
state: present
enablerepo: docker-ce-stable # 就去repo文件中找到这个仓库的url
# 配置docker镜像加速器,默认docker镜像从国外下载,所以更改为阿里镜像站,加快速度
- name: mkdir docker daemon directory
file: # 创建/etc/docker目录
path: /etc/docker/
mode: 0600
state: directory
- name: Mirror accelerator
copy:
src: daemon.json # 这个文件也是docker/files/目录下的文件
dest: /etc/docker/
# 启动docker服务
- name: Ensure Docker is started and enabled at boot
systemd: # 调用systemd模块控制服务状态
name: docker # 服务名为docker
state: 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 repo
get_url: # 调用get_url模块下载阿里的epel源
url: http://mirrors.aliyun.com/repo/epel-7.repo
dest: /etc/yum.repos.d/ # 下载到该目录
mode: 0444 # 下载后的文件权限为所有人只读
- name: install the 'Development tools' package group
yum: # 调用yum模块安装开发者工具
name: "@Development tools"
state: present
- name: Install packages
yum: # 再次调用yum模块循环安装pkg_lists定义的模块
name: "{{pkg_list}}"
state: latest
[root@nginx yum]# cat vars/main.yml # 查看定义的变量
---
# vars file for yum
pkg_list:
- bash-completion
- bash-completion-extras
我将上述的目录打了个压缩包,有需要的可以进行下载,提取码:jfu3。
执行结果如下:
[root@nginx ansible]# ansible-playbook install_docker.yml
PLAY [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=0
192.168.20.3 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
最后在客户端上查看docker的版本及运行状态都准确无误,如下:
docker版本:
[root@nginx yum]# docker -v
Docker version 19.03.8, build afacb8b
运行状态: