提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
[1.1 playbook](#1.1 playbook)
[1.1.1 YMAL格式](#1.1.1 YMAL格式)
[1.1.2 playbook实例](#1.1.2 playbook实例)
[1.1.3 Playbook常见语法](#1.1.3 Playbook常见语法)
[1.1.4 playbook编排多个hosts任务](#1.1.4 playbook编排多个hosts任务)
[1.2 roles](#1.2 roles)
[1.2.1 roles介绍](#1.2.1 roles介绍)
[1.2.2 创建roles的目录结构](#1.2.2 创建roles的目录结构)
[1.2.3 通过roles实现lamp](#1.2.3 通过roles实现lamp)
前言
今天是接上次的内容,讲的还是模块的部分。
提示:以下是本篇文章正文内容,下面案例可供参考
一、模块
1.1 playbook
playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。
使用的格式为yaml格式(saltstack,elk,docker,docker-compose,kubernetes等也都会用到yaml格式)
1.1.1 YMAL格式
以.yaml或.yml结尾
文件的第一行以 "---"开始,表明YMAL文件的开始(可选的)
以#号开头为注释
列表中的所有成员都开始于相同的缩进级别, 并且使用一个 "- "
作为开头(一个横杠和一个空格)
一个字典是由一个简单的 键: 值
的形式组成(这个冒号后面必须是一个空格)
==注意: 写这种文件不要使用tab键,都使用空格==
下面看一个官方的示例感受一下
bash
---
# 一位职工记录
name: Example Developer
job: Developer
skill: Elite
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
ruby: Elite
python: Elite
dotnet: Lame
1.1.2 playbook实例
先直接来看一个实例
第1步: 创建一个存放playbook的目录(路径自定义)
master# mkdir /etc/ansible/playbook
第2步: 准备httpd配置文件,并修改成你想要的配置
master# yum install httpd -y
按需要修改你想要的配置(为了测试可以随意改动标记一下)
master# vim /etc/httpd/conf/httpd.conf
第3步: 写一个playbook文件(后缀为.yml或.yaml)
# vim /etc/ansible/playbook/example.yaml
---
- hosts: group1
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd,httpd-devel state=latest
- name: write the apache config file
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
第4步: 执行写好的palybook
-
会显示出执行的过程,并且执行的每一步都有ok,changed,failed等标识
-
执行如果有错误(failed)会回滚,解决问题后,直接再执行这条命令即可,并会把failed改为changed(幂等性)
# ansible-playbook /etc/ansible/playbook/example.yaml
1.1.3 Playbook常见语法
hosts: 用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组.
remote_user: 用于指定远程主机上的执行任务的用户.
- hosts: group1
remote_user: root
tasks: 任务列表, 按顺序执行任务.
- 如果一个host执行task失败, 整个tasks都会回滚, 修正playbook 中的错误, 然后重新执行即可.
tasks:
- name: ensure apache is at the latest version
yum: name=httpd,httpd-devel state=latest
- name: write the apache config file
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
handlers: 类似task,但需要使用notify通知调用。
-
不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次.
-
handlers最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
variables: 变量
- 定义变量可以被多次方便调用
master# vim /etc/ansible/playbook/example2.yaml
---
- hosts: group1
remote_user: root
vars:
- user: test1
tasks:
- name: create user
user: name={{user}} state=present
~
master# ansible-playbook /etc/ansible/playbook/example2.yaml
案例: playbook编排vsftpd
写一个playbook实现
-
配置yum
-
安装vsftpd包
-
修改配置文件(要求拒绝匿名用户登录)
-
启动服务并实现vsftpd服务开机自动启动
---
- hosts: group1
remote_user: root
tasks:
- name: rm yum repository
file: path=/etc/yum.repos.d/ state=absent
- name: 同步master上的yum源到group1
copy: src=/etc/yum.repos.d dest=/etc/
- name: ensure vsftpd is at the latest version
yum: name=vsftpd state=latest
- name: write the apache config file
copy: src=/etc/vsftpd/vsftpd.conf dest=/etc/vsftpd/vsftpd.conf
notify:
- restart vsftpd
- name: ensure vsftpd is running (and enable it at boot)
service: name=vsftpd state=started enabled=yes
handlers:
- name: restart vsftpd
service: name=vsftpd state=restarted
1.1.4 playbook编排多个hosts任务
--- # ---代表开始(可选项,不写也可以)
- hosts: 10.1.1.12
remote_user: root
tasks:
- name: 创建/test1/目录
file: path=/test1/ state=directory
# 这里不能用---分隔,会报语法错误(后面课程玩k8s编排也写YAML文件,是可以用---来分隔段落的)
- hosts: 10.1.1.13
remote_user: root
tasks:
- name: 创建/test2/目录
file: path=/test2/ state=directory
... # ...代表结束(可选项,不写也可以)
案例: 编排nfs搭建与客户端挂载
1, 在master上准备nfs配置文件
# vim /etc/exports
/share *(ro)
2, 编写yaml编排文件
# vim /etc/ansible/playbook/nfs.yaml
---
- hosts: 192.168.156.12
remote_user: root
tasks:
- name: 安装nfs服务相关软件包
yum: name=nfs-utils,rpcbind,setup state=latest
- name: 创建共享目录
file: path=/share/ state=directory
- name: 同步nfs配置文件
copy: src=/etc/exports dest=/etc/exports
notify: restart nfs
- name: 启动rpcbind服务,并设置为开机自启动
service: name=rpcbind state=started enabled=on
- name: 启动nfs服务,并设置为开机自启动
service: name=nfs state=started enabled=on
handlers:
- name: restart nfs
service: name=nfs state=restarted
- hosts: 192.168.156.13
remote_user: root
tasks:
- name: 安装nfs客户端软件包
yum: name=nfs-utils state=latest
- name: 挂载nfs服务器的共享
shell: mount 192.168.156.12:/share /mnt
3, 执行playbook
# ansible-playbook /etc/ansible/playbook/nfs.yaml
bash
[root@hd1 ~]# vim /etc/ansible/playbook/nfs.yaml
[root@hd1 ~]# ansible-playbook /etc/ansible/playbook/nfs.yaml
PLAY [192.168.156.12] *************************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [192.168.156.12]
TASK [安装nfs服务相关软件包] ***************************************************************************************
changed: [192.168.156.12]
TASK [创建共享目录] *********************************************************************************************
changed: [192.168.156.12]
TASK [同步nfs配置文件] ******************************************************************************************
changed: [192.168.156.12]
TASK [启动rpcbind服务,并设置为开机自启动] ******************************************************************************
ok: [192.168.156.12]
TASK [启动nfs服务,并设置为开机自启动] **********************************************************************************
changed: [192.168.156.12]
RUNNING HANDLER [restart nfs] *****************************************************************************
changed: [192.168.156.12]
PLAY [192.168.156.13] *************************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [192.168.156.13]
TASK [安装nfs客户端软件包] ****************************************************************************************
changed: [192.168.156.13]
TASK [挂载nfs服务器的共享] ****************************************************************************************
[WARNING]: Consider using the mount module rather than running 'mount'. If you need to use command
because mount 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: [192.168.156.13]
PLAY RECAP ************************************************************************************************
192.168.156.12 : ok=7 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.156.13 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.2 roles
1.2.1 roles介绍
roles(角色): 就是通过分别将variables, tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。
假设我们要写一个playbook来安装管理lamp环境,那么这个playbook就会写很长。所以我们希望把这个很大的文件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使用的时候直接调用就可以了,以免重复写。就类似编程里的模块化的概念,以达到代码复用的效果。
1.2.2 创建roles的目录结构
files:用来存放由copy模块或script模块调用的文件。
tasks:至少有一个main.yml文件,定义各tasks。
handlers:有一个main.yml文件,定义各handlers。
templates:用来存放jinjia2模板。
vars:有一个main.yml文件,定义变量。
meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。
注意: 在每个角色的目录中分别创建files, tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录.
1.2.3 通过roles实现lamp
需定制三个角色: httpd,mysql,php
第1步: 创建roles目录及文件,并确认目录结构
master# cd /etc/ansible/roles/
master# mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
master# touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
master# yum install tree -y
master# tree /etc/ansible/roles/
/etc/ansible/roles/
├── httpd
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
│ └── main.yml
├── mysql
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
│ └── main.yml
└── php
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
第2步: 准备httpd服务器的主页文件,php测试页和配置文件等
master# echo "test main page" > /etc/ansible/roles/httpd/files/index.html
master# echo -e "<?php\n\tphpinfo();\n?>" > /etc/ansible/roles/httpd/files/test.php
master# yum install httpd -y
按需求修改配置文件后,拷贝到httpd角色目录里的files子目录
master# vim /etc/httpd/conf/httpd.conf
master# cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files
第3步: 编写httpd角色的main.yml文件
vim /etc/ansible/roles/httpd/files/main.yml
---
- name: 安装httpd
yum: name=httpd,httpd-devel state=present
- name: 同步httpd配置文件
copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: 同步主页文件
copy: src=/etc/ansible/roles/httpd/files/index.html dest=/var/www/html/index.html
- name: 同步php测试页
copy: src=/etc/ansible/roles/httpd/files/test.php dest=/var/www/html/test.php
- name: 启动httpd并开机自启动
service: name=httpd state=started enabled=yes
第4步: 编写httpd角色里的handler
master# vim /etc/ansible/roles/httpd/handlers/main.yml
---
- name: restart httpd
service: name=httpd state=restarted
第5步: 编写mysql角色的main.yml文件
---
- name: 安装mysql
yum: name=mariadb,mariadb-server,mariadb-devel state=present
- name: 启动mysql并开机自启动
service: name=mariadb state=started enabled=yes
第6步: 编写php角色的main.yml文件
master# vim /etc/ansible/roles/php/tasks/main.yml
---
- name: 安装php及依赖包
yum: name=php,php-gd,php-ldap,php-odbc,php-pear,php-xml,php-xmlrpc,php-mbstring,php-snmp,php-soap,curl,curl-devel,php-bcmath,php-mysql state=present
notify: restart httpd
第7步:编写lamp的playbook文件调用前面定义好的三个角色
master# vim /etc/ansible/playbook/lamp.yaml
---
- hosts: group1
remote_user: root
roles:
- httpd
- mysql
- php
第8步: 执行lamp的playbook文件
master# ansible-playbook /etc/ansible/playbook/lamp.yaml
拓展案例: 通过roles实现lamp并安装discuz
第1步: 创建roles目录及文件,并确认目录结构
master# cd /etc/ansible/roles/
master# mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
master# touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
第2步: 准备httpd相关文件
master# ls /etc/ansible/roles/httpd/files/
Discuz_X3.2_SC_UTF8.zip Discuz相关软件包
httpd.conf 配置好的httpd.conf配置文件
第3步: 编写httpd角色的main.yml文件
master# vim /etc/ansible/roles/httpd/tasks/main.yml
- name: 安装httpd相关软件包
yum: name=httpd,httpd-devel state=latest
- name: 同步配置文件
copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: 拷贝discuz压缩包
copy: src=/etc/ansible/roles/httpd/files/Discuz_X3.2_SC_UTF8.zip dest=/tmp/
- name: 解压并mv网站文件到httpd家目录
shell: rm -rf /var/www/html/* && rm -rf /test/ && mkdir -p /test/ && unzip /tmp/Discuz_X3.2_SC_UTF8.zip -d /test/ &> /dev/null && mv /test/upload/* /var/www/html/ && chown -R apache.apache /var/www/html/
# 上面的命令有点多,可以写成脚本,然后使用script模块来调用执行
- name: 启动httpd并开机自启动
service: name=httpd state=started enabled=on
第4步: 编写httpd角色里的handler
master# vim /etc/ansible/roles/httpd/handlers/main.yml
---
- name: restart httpd
service: name=httpd state=restarted
第5步: 编写mysql角色的main.yml文件
master# vim /etc/ansible/roles/mysql/tasks/main.yml
---
- name: 安装mariadb相关软件包
yum: name=mariadb-server,mariadb-devel state=latest
- name: 启动mariadb服务并设置开机自启动
service: name=mariadb state=started enabled=on
- name: 执行建库脚本
script: /etc/ansible/roles/mysql/files/create.sh
第6步: 编写mysql的建库脚本
master# vim /etc/ansible/roles/mysql/files/create.sh
#!/bin/bash
mysql << EOF
create database if not exists discuz default charset=utf8;
grant all on discuz.* to 'discuz'@'localhost' identified by '123';
flush privileges;
EOF
第7步: 编写php角色的main.yml文件
master# vim /etc/ansible/roles/php/tasks/main.yml
---
- name: 安装php相关软件包
yum: name=php,php-gd,php-ldap,php-odbc,php-pear,php-xml,php-xmlrpc,php-mbstring,php-snmp,php-soap,curl,curl-devel,php-bcmath,php-mysql state=present
notify: restart httpd
第8步:编写lamp的playbook文件调用前面定义好的三个角色
master# vim /etc/ansible/playbook/lamp.yaml
---
- hosts: group1
remote_user: root
roles:
- httpd
- mysql
- php
第9步: 执行lamp的playbook文件
master# ansible-playbook /etc/ansible/playbook/lamp.yaml
bash
[root@hd1 files]# ansible-playbook /etc/ansible/playbook/lamp.yaml
PLAY [group1] *********************************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [192.168.156.12]
ok: [192.168.156.13]
TASK [安装httpd相关软件包] ***************************************************************************************
ok: [192.168.156.12]
ok: [192.168.156.13]
TASK [httpd : 同步配置文件] *************************************************************************************
ok: [192.168.156.13]
ok: [192.168.156.12]
TASK [httpd : 拷贝discuz压缩包] ********************************************************************************
changed: [192.168.156.13]
changed: [192.168.156.12]
TASK [解压并mv网站文件到httpd家目录] *********************************************************************************
[WARNING]: Consider using the file module with state=absent rather than running 'rm'. If you need to use
command because file 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: [192.168.156.12]
changed: [192.168.156.13]
TASK [启动httpd并开机自启动] **************************************************************************************
ok: [192.168.156.13]
ok: [192.168.156.12]
TASK [mysql : 安装mariadb相关软件包] *****************************************************************************
changed: [192.168.156.13]
changed: [192.168.156.12]
TASK [mysql : 启动mariadb服务并设置开机自启动] ************************************************************************
changed: [192.168.156.13]
changed: [192.168.156.12]
TASK [mysql : 执行建库脚本] *************************************************************************************
changed: [192.168.156.12]
changed: [192.168.156.13]
TASK [安装php及依赖包] ******************************************************************************************
ok: [192.168.156.12]
ok: [192.168.156.13]
PLAY RECAP ************************************************************************************************
192.168.156.12 : ok=10 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.156.13 : ok=10 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
总结
以上就是今天要讲的内容,内容详细,但也是仅供参考。