ansible学习(二)
什么是YAML?
YAML是一种标记语言。适合用来表达层次结构式的数据结构。
YAML的基本组件:清单(短杠——空白字符)和散列表(短杠+空白字符分隔key:value对)。
Playbook的核心元素: hosts:主机 tasks:任务列表 variables templates:包含了末班语法的文本文件 handlers:由特定条件出发的任务。 roles: Playbook的基础组件: hosts:运行指定任务的目标主机 remoute_user:在远程主机上执行任务的用户 sudo_user:有必要的情况下切换到特权级用户来 tasks:任务列表 模块,模块参数; 格式: (1)action:module arguments (2)module:arguments 注意:shell和command模块后面直接跟命令,而非key=value类的参数列表。 (1)某任务的状态在运行后为changed时,可通过”notify“通知给响应的handlers; (2)任务可以通过”tags“打标签,而后在ansible-playbook命令上使用-t指定进行调用。就是说只执行指定标签的任务。
运行playbook的方式: (1)测试:
ansible-playbook --check
只检测可能会发生的改变,但不真正执行操作;
ansible-playbook --list-hosts
列出运行任务的主机
(2)运行
handlers:
任务,在特定条件下触发;
接收到其它任务的通知时被触发;
notify: HANDLER TASK NAME
variables:向脚本传递参数法。
(1)facts:可直接调用;
注意:可使用setup模块直接获取目标主机的facters;
常用命令格式:ansible IP -m setup | less
(2)用户ansible-playbook命令的命令行中的自定义变量:
(a)ansible-playbook命令的命令行中的
-e VARS, --extra-vars=VARS
变量引用:{{ vairable }}
(b)在playbook中定义变量的方法:
vars:
- var1: value1
- var2: value2
(3)通过roles传递变量
(4)Host Inventory
(a)用户自定义变量
(i)向不同的主机传递不同的变量;(比如下面的给httpd添加端口的例子)
IP /HOSTNAME variable=value var2=value2
(ii)向组中的主机传递相同的变量;
[groupname:vars]
variable=value
(b)inventory参数
用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
安装多个包的写法:
ansible提供的模板:python-jinja2
是一个模板引擎。文本文件,嵌套有脚本(使用模板编程语言编写)
jinja2:
条件测试:
when语句:在task中使用,jinja2的语法格式,示例:
ansible会去判断符合条件的才会去运行。
循环或迭代:需要重复执行的任务;
对迭代项的引用,固定变量名为”item“
而后,要在task中使用with_items给定要迭代的元素列表;
列表方法:
字符串
字典
比如:
或者是一个字典:
角色(roles):
角色集合:
roles/
mysql/
httpd/
nginx/
memcached/ 每个角色,以特定的层级目录结构进行组织:
mysql/
files/ :存放由copy或script模块等调用的文件;
templates/:template模块查找所需要模板文件的目录;
tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;
default/:设定默认变量时使用此目录中的main.yml文件; 在playbook调用角色方法1:
- hosts: websrvs
remote_user: root
roles:
- mysql
- memcached
- nginx 在playbook调用角色方法2:传递变量给角色
- hosts:
remote_user:
roles:
- { role: nginx, username: nginx }
键role用于指定角色名称;后续的k/v用于传递变量给角色; 还可以基于条件测试实现角色调用;
roles:
- { role: nginx, when: "ansible_distribution_major_version == '7' " }
ansible的配置文件两个需要注意的:
1、forks
表示同时并发多少台主机执行任务,一般会修改的比此值要大一些。使其能够对更多的主机执行任务。
2、default_module
ansible的默认运行模块是 command,即-m command
一、案例演示:
1、首先是编一个YAML文件,将要执行的操作写在里面
- hosts: all
remote_user: root
tasks:
- name: install redis
yum: name=redis state=latest- name: start redis
service: name=redis state=started
说明:一个tasks里面定义多个执行的任务列表,执行顺序是从上向下执行。”notify“表示一旦修改了配置文件,就触发动作重启redis。可以看出来notify一般和handlers联合使用。
2、先检查一下语法看看:
3、运行一下试试
看到最后的状态就表示我们执行成功了。
4、到节点上查看一下端口
6379端口确实已经起来了。
5、针对诸多的redis服务,如果我们想配置一下redis,那么一台台的查看是很麻烦的,因此我们可以将redis的配置文件放在中控机上,然后修改完成后再上传至节点上并进行修改。
但是这里有个需要注意的是,redis修改完配置文件后需要重启服务才会生效,因此我们需要定义一个触发器,当新的配置文件上传至节点时,自动触发重启redis的操作。
6、先从远程节点复制一份配置文件到中控机,以便进行修改
7、我们随便修改一下redis.conf的某个参数的值。然后需要修改YAML文件的内容,主要是配置修改redis.conf文件自动触发重启redis操作。
- hosts: all
remote_user: root
tasks:
- name: install redis
yum: name=redis state=latest
- name: copy config file
copy: src=/root/ansible-playbook/redis.conf dest=/etc/redis.conf owner=redis
notify: restart redis
- name: start redis
service: name=redis state=started
handlers:
- name: restart redis
service: name=redis state=restarted
8、检查一下语法
9、执行以下:
看的出来我们的执行没有任何问题。
10、-t参数指定,主要是用来指定标签的用的。比如:
在对应的任务下添加一个标签。可以做到只执行这一个任务就可以了。
11、执行以下带有标签的哪个任务。
在上面的例子中,表示只执行了第二个name下的操作(复制文件并重启redis),其他的操作,比如install redis不会再执行。
二、案例演示之---------------ansible-playbook传递参数来灵活的执行程序。
使用-e参数可指定向yaml文件传递参数
1、编辑yaml文件
- hosts: all
remote_user: root
tasks:
- name: install package {{ pkgname }}
yum: name={{ pkgname }} state=latest
2、执行以下,主要演示传递参数(我们以干跑为例)
3、下次我们就可以方便的换个程序包来安装,非常灵活
三、案例演示之------inventory参数。
1、首先提前备好环境,也就是在节点上创建好用户chaofeng,编写好ansible-playbook脚本文件
- hosts: all
remote_user: root
tasks:
- name: add user
user: name=chaofeng system=no state=present
- name: set passwd
shell: echo chaofeng | passwd --stdin chaofeng
2、执行一下:
表示在两个节点上创建用户chaofeng成功了。
3、修改/etc/ansible/hosts文件。
4、测试一下:
向Inventory传递参数后,ansible则以指定的用户运行程序。不过第一个用户是root,这是因为在dbservers的执行顺序是最后,因此172.16.0.53被重新使用root用户来执行。所以同一台主机之间会因主机组而受影响。
四、案例演示之-----使用模板自定义每个远程节点的配置(远程节点配置不相同)
1、我们想在redis.conf配置文件中配置每个bind监听为自己的IP,那么要依照不同的节点IP来修改对应的bind值才行。 首先我们要使用setup模块
[root@ELK-chaofeng01 ~]#ansible 172.16.0.52 -m setup | less
找到如下所示的IP地址是如何获取的。
2、接下来我们在redis的配置文件中取出ipv4的变量。此配置文件我又重新命名为redis.conf.j2
3、接下来编写YAML文件
- hosts: all
remote_user: root
tasks:
- name: install config file
template: src=/root/ansible-playbook/redis.conf.j2 dest=/tmp/redis.conf
注意:这里我的目的是把redis.conf.j2的内容复制到远程节点的/tmp/redis.conf文件里面,最终的效果在这里面看到。
4、执行以下此脚本
5、我们到远程节点查看一下/tmp/redis.conf文件。随便一个远程节点即可。
换一个远程节点
成功了,我们在远程主机上配置了模板,然后让其按照不同节点的不同环境来进行配置。这就是模板的用处。
五、再来看一个案例------安装httpd并添加其监听端口。
1、现在/etc/ansible/hosts文件里面添加变量
两个节点的默认监听端口都有80端口,不过现在想一个节点添加端口8080,另外一个节点添加端口10080,在这里定义要取用的变量
2、定义YAML脚本文件
- hosts: all
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=installed
- name: httpd config file
template: src=/root/httpd_port.conf dest=/etc/httpd/conf.d/addport.conf
- name: start httpd
service: name=httpd state=started
3、在中控机上添加httpd获取变量值的配置文件,这个脚本最终是复制到节点上的/etc/httpd/conf.d目录下,因此要以.conf结尾才行。
4、执行playbook脚本。
[root@ELK-chaofeng01 ~]#ansible-playbook fifth.yaml PLAY [all] ************************************************************************************************ TASK [Gathering Facts] ************************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52] TASK [install httpd] **************************************************************************************
changed: [172.16.0.53]
changed: [172.16.0.52] TASK [httpd config file] **********************************************************************************
changed: [172.16.0.53]
changed: [172.16.0.52] TASK [start httpd] ****************************************************************************************
changed: [172.16.0.52]
changed: [172.16.0.53] PLAY RECAP ************************************************************************************************
172.16.0.52 : ok=4 changed=3 unreachable=0 failed=0
172.16.0.53 : ok=4 changed=3 unreachable=0 failed=0
5、去两个节点上查看下状况:
第一个节点:
第二个节点:
成功,符合我们的需求。
六、Ansible-playbook之角色roles案例演示
1、首先是创建角色需要的环境目录
[root@ELK-chaofeng01 ~]#mkdir -pv /etc/ansible/roles
[root@ELK-chaofeng01 roles]#mkdir -pv nginx1/{files,templates,tasks,vars,handlers,meta,default}
mkdir: created directory ‘nginx1’
mkdir: created directory ‘nginx1/files’
mkdir: created directory ‘nginx1/templates’
mkdir: created directory ‘nginx1/tasks’
mkdir: created directory ‘nginx1/vars’
mkdir: created directory ‘nginx1/handlers’
mkdir: created directory ‘nginx1/meta’
mkdir: created directory ‘nginx1/default’
2、接下来需要创建基本的nginx.yml文件,这个是负责调用roles文件的
3、接下来我们就开始准备环境配置文件了。首先是
4、接下来依次创建好各个需要的目录和文件。先来创建基于模板虚拟主机配置文件
5、既然修改了配置文件后需要重启,那么我们需要定义触发器操作
6、接下来是创建站点目录
因为我们已经在主任务tasks文件中有创建站点目录的操作了,因此我们这里只需要定义创建什么目录即可。
7、复制html文件至站点
要复制的普通文本文件则是放在files目录下。
8、部署完成后,我们就可以执行了。
[root@ELK-chaofeng01 ~]#ansible-playbook nginx1.yaml PLAY [all] **************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52] TASK [nginx1 : install nginx] *********************************************************************************
changed: [172.16.0.53]
changed: [172.16.0.52] TASK [nginx1 : config vhost1] *********************************************************************************
ok: [172.16.0.52]
changed: [172.16.0.53] TASK [nginx1 : install site directory] ************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52] TASK [nginx1 : install index html] ****************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52] TASK [nginx1 : start nginx] ***********************************************************************************
changed: [172.16.0.52]
changed: [172.16.0.53] RUNNING HANDLER [nginx1 : restart nginx] **********************************************************************
ok: [172.16.0.53] PLAY RECAP ****************************************************************************************************
172.16.0.52 : ok=6 changed=2 unreachable=0 failed=0
172.16.0.53 : ok=7 changed=3 unreachable=0 failed=0
这样子就完成了。
总结:一个roles角色就是就是在/etc/ansible/roles目录下创建一个主任务即可,比如我们这里的主任务是nginx1,也就是要安装nginx服务器。那么在nginx1目录下我们需要定义tasks、files、vars、handlers等环境依赖需要的目录。所以说一个roles就是把一个大的任务通过分层来实现安装并配置。在上面的例子中,我们还需要定义tags功能,可能有时候只是需要执行某一个步骤即可。
七、基于ansible的LNMT环境搭建。
我们这里是使用172.16.0.51作为ansible的中控机,172.16.0.52作为nginx的反向代理服务器同时还是负载均衡器,172.16.0.53是运行tomcat程序作为web服务器提供服务。不过只有一台web服务器,我们依然使用负载均衡器来演示效果。
1、首先是分配几个角色,分别是nginx(反向代理)、tomcat(jsp执行器)、jdk(java运行环境),那么需要我们依次在/etc/ansible/roles目录下创建这几个juese目录。
[root@ELK-chaofeng01 roles]#mkdir -pv nginx/{files,templates,tasks,vars,handlers,meta,default}
[root@ELK-chaofeng01 roles]#mkdir -pv tomcat/{files,templates,tasks,vars,handlers,meta,default}
[root@ELK-chaofeng01 roles]#mkdir -pv jdk/{files,templates,tasks,vars,handlers,meta,default}
2、接下来写nginx的YAML文件
3、配置nginx负载均衡文件
4、准备handlers自动触发文件
5、nginx服务器配置完成了,那么现在我们需要配置tomcat的主任务tasks文件
6、tomcat配置完成后,开始配置jdk
7、env文件也是需要配置的,设置一下
8、配置tomcat需要的version
9、最后我们需要编辑playbook文件
在/etc/ansible/hosts看看我们是如何定义主机组的
我们就是在这里针对不同的主机进行哪些操作。
10、执行以下看看效果
[root@ELK-chaofeng01 ~]#ansible-playbook nginx.2.yml PLAY [lb] **************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************
ok: [172.16.0.52] TASK [nginx : install nginx] *********************************************************************************
ok: [172.16.0.52] TASK [nginx : install conf] **********************************************************************************
ok: [172.16.0.52] TASK [nginx : start nginx] ***********************************************************************************
changed: [172.16.0.52] PLAY [tcsrv] ************************************************************************************************* TASK [Gathering Facts] ***************************************************************************************
ok: [172.16.0.53] TASK [jdk : install openjdk] *********************************************************************************
changed: [172.16.0.53] TASK [jdk : install env file] ********************************************************************************
changed: [172.16.0.53] TASK [tomcat : install package] *****************************************************************************
changed: [172.16.0.53] TASK [tomcat : start tomcat] *********************************************************************************
changed: [172.16.0.53] PLAY RECAP ***************************************************************************************************
172.16.0.52 : ok=4 changed=1 unreachable=0 failed=0
172.16.0.53 : ok=5 changed=4 unreachable=0 failed=0
完美运行成功。
11、最后我们在windows上运行一下,不过运行之前记得在172.16.0.52这个nginx反向代理主机上添加映射,如下所示:
还有在windows的hosts文件中定义:
最后在windows系统上的浏览器打开看一下。
完美运行成功。
ansible学习(二)的更多相关文章
- ansible 学习与实践
title: ansible 学习与实践 date: 2016-05-06 16:17:28 tags: --- ansible 学习与实践 一 介绍 ansible是新出现的运维工具是基于Pytho ...
- ansible学习笔记一
ansible学习笔记一 参考博客: ansible学习 - 51CTO博客 一.安装 1 .下载epel源 wget -O /etc/yum.repos.d/epel.repo http://mir ...
- Ansible学习记录一:Linux下部署
0.Ansible介绍 Ansible 是一个简单的自动化运维管理工具,可以用来自动化部署应用.配置.编排 task(持续交付.无宕机更新等),采用 paramiko 协议库(fabric 也使用这个 ...
- Ansible学习分享(基本)
背景:Teamleader提到一款好用的自动化配置管理工具,于是前去学习实践,有了下面分享. 纲要 一.Ansible简介 二.Ansible准备 2.1 Ansible安装 2.2 设置SSH公钥验 ...
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
随机推荐
- Pycharm、IDEA等汉化教程
本汉化教程对jetbrains全系列可用:IDEA.Pycharm.WebStorm.phpstorm.AndroidStudio.GoLand.RubyMine.CLion 此汉化无副作用,绝对安全 ...
- Java9发布回顾Java 8的十大新特性
java9已经在北京时间9月22日正式发布,开发者可以在oracle jdk官网上下载到最新的jdk9. 今天,我们先来一起复习一下2014年发布的Java 8的十大新特性.先来喝杯java~~~ 按 ...
- 1.Django安装与运行
Django基本配置 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Se ...
- 1、MySQL主从同步机制及同步中的问题处理
http://www.drupal001.com/2012/03/mysql-master-slave-troubles/ http://www.jb51.net/article/33052.htm
- Java面试题:小白不得不懂的斐波那契数列
很长一段时间里,我都非常疑惑:“我写的技术文章不差啊,有内容的同时还很有趣,不至于每篇只有区区几十个人读啊?为什么有些内容简单到只有一行注册码的文章浏览量反而轻松破万?”这样的疑惑如鲠在喉啊!写技术博 ...
- .NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发
上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架,具体为什么那样设计我也已经在第十篇文章中进行了说明.不过文章发布后很多人都说了这样的分层不是很合理,什么数据库实体应该 ...
- 跳槽 & 思维导图
个人博客原文: 跳槽 & 思维导图 今年的冬天有点"冷".给大家来点实在的东西. 不知道大家在跳槽的时候是怎么做的?直接投简历面试?还是准备了一段时间,复习一波知识点后再投 ...
- hexo配置自己的博客站点
最近业余时间利用hexo为自己搭建一个高度自定义的个人站点,站点发布在github上,访问地址为:https://cqhaibin.github.io/.本博客简单介绍实现此站点的过程.效果图如下 构 ...
- Zara带你快速入门WPF(4)---Command与功能区控件
前言:许多数据驱动的应用程序都包含菜单和工具栏或功能区控件,允许用户控制操作,在WPF中,也可以使用功能区控件,所以这里介绍菜单和功能区控件. 一.菜单控件 在WPF中,菜单很容易使用Menu和Men ...
- SpringBoot入门教程(十五)集成Druid
Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...