Ansible playbook简介与配置

本文承接本人的上一篇博文:Ansible的安装、配置及常用模块介绍
有需要的可以前去查看!!

Ansible playbook简介

playbook是ansible用于配置,部署,和管理被控节点的剧本。

通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成。

也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。

Ansible playbook使用场景

执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook。

就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。

使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。

Ansible playbook格式

###playbook格式介绍

playbook由YMAL语言编写。YAML( /ˈjæməl/ )参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822,Clark Evans在2001年5月在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。

YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。首先学习了解一下YMAL的格式,对我们后面书写playbook很有帮助。以下为playbook常用到的YMAL格式。

文件的第一行应该以 ”—” (三个连字符)开始,表明YMAL文件的开始。
在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。就像这样:

- apple - banana - orange等价于JSON的这种格式

[ “apple”, “banana”, “orange” ]
同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。

playbook中hosts,variables,roles,tasks等对象的表示方法都是键值中间以”:”分隔表示,”:”后面还要增加一个空格。

house:
	family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
	address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }

由上图可知,在mysql.yml中,主要由三个部分组成:

**hosts部分:**使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的 /etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候,–list-hosts选项会显示那些主机将会参与执行task的过程中。

**remote_user:**指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限。

**tasks:**指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法。tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数。

###ansible-playbook运行playbook文件

使用ansible-playbook运行playbook文件,得到如下输出信息,输出内容为JSON格式。并且由不同颜色组成,便于识别。一般而言

| 绿色代表执行成功,系统保持原样

| 黄色代表系统代表系统状态发生改变

| 红色代表执行失败,显示错误输出。

执行有三个步骤:1、收集facts 2、执行tasks 3、报告结果

[root@CentOS7-master ~]# ansible-playbook mariadb.yml 
---------------------------1、收集facts------------------------------------------
PLAY [webservers] **************************************************************

TASK [setup] *******************************************************************
ok: [172.17.254.165]
ok: [172.17.254.180]
---------------------------2、执行tasks------------------------------------------
TASK [Install mariadb-server package] ******************************************
changed: [172.17.254.165]
changed: [172.17.254.180]

TASK [Starting mysqld service] *************************************************
changed: [172.17.254.165]
changed: [172.17.254.180]
---------------------------3、报告结果-------------------------------------------
PLAY RECAP *********************************************************************
172.17.254.165             : ok=3    changed=2    unreachable=0    failed=0   
172.17.254.180             : ok=3    changed=2    unreachable=0    failed=0 

###Playbook的核心元素及基础组件

Playbook的核心元素:
Hosts:主机;
Tasks:任务列表;
Variables 变量;
Templates:包含了模板语法的文本文件;
Handlers:由特定条件触发的任务;
Playbooks配置文件的基础组件:

####hosts:

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指定进行调用;

####handlers:

任务,在特定条件下触发;
接收到其它任务的通知时被触发;

tasks:
	– name: TASK_NAME
	  module: arguments
	  notify: HANDLER_NAME
	  handlers:
	– name: HANDLER_NAME
	  module: arguments

示例:

[root@CentOS7-master ~]# vim mariadb.yml 
---
- hosts: webservers
  remote_user: root
  tasks:
   - name: Install mariadb-server package
     yum: name=mariadb-server state=present

   - name: copy my.cnf
     copy: src=/etc/my.cnf dest=/etc/ backup=yes
     notify: start
     tags: startmariadb

   - name: Stopping mysqld service
     service: name=mariadb state=stopped
     tags: stopmariadb

  handlers:
   - name: start
     service: name=mariadb state=started

####variables:

(1) facts:可直接调用;
	注意:可使用setup模块直接获取目标主机的facters;
(2) 用户自定义变量:
	(a) ansible-playbook命令的命令行中的
		-e VARS, --extra-vars=VARS
	(b) 在playbook中定义变量的方法:
		vars:
			- var1: value1
			- - var2: value2
(3) 通过roles传递变量;
(4) Host Inventory
	(a) 用户自定义变量
		(i) 向不同的主机传递不同的变量;
			IP/HOSTNAME varaiable=value var2=value2
		(ii) 向组中的主机传递相同的变量;
			[groupname:vars]
			variable=value
			eg:
				[web]
	 				172.17.251.188
					172.17.250.209
				[web:vars]
					rpmname=samba

运行playbook的方式:
(1) 测试

ansible-playbook --check 只检测可能会发生的改变,但不真正执行操作;
ansible-playbook --list-hosts 列出运行任务的主机;

(2) 直接运行

####templates:模板

文本文件,嵌套有脚本(使用模板编程语言编写)
	Jinja2:Jinja2是python的一种模板语言,以Django的模板语言为原本。
	Jinja2文件的创建可以直接将自己创建好的文本文件的后缀改成以“.j2”结尾的即可!
	下面用到的nginx.conf.j2文件就是将nginx.conf文件修改好后将其重命名为nginx.conf.j2的!
	支持:
		字符串:使用单引号或双引号;
        数字:整数,浮点数;
        列表:[item1, item2, ...]
        元组:(item1, item2, ...)
        字典:{key1:value1, key2:value2, ...}
        布尔型:true/false
		算术运算:
			+, -, *, /, //, %, **
		比较操作:
			==, !=, >, >=, <, <=
		逻辑运算:
			and, or, not

示例:

[root@CentOS7-master ~]# vim nginx.yml 
---
- hosts: webservers
  remote_user: root
  vars:
    - rpmname: nginx
      nginxport: 8888
  tasks:
    - name: yum install {{ rpmname }}
      yum: name={{ rpmname }} state=present

    - name: copy {{ rpmname }}.conf
      template: src=/tmp/{{ rpmname }}.conf.j2 dest=/etc/nginx/{{ rpmname }}.c
onf backup=yes
      notify: reload
      tags: reload{{ rpmname }}

    - name: start service
      service: name={{ rpmname }} state=started
      tags: start{{ rpmname }}

  handlers:
    - name: reload
      service: name={{ rpmname }} state=restarted

模板配置文件 :

[root@CentOS7-master ~]# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.j2

[root@CentOS7-master ~]# vim nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};
listen {{ http_port }};

###Ansible playbook条件测试

**when语句:**在task中使用,jinja2的语法格式

tasks:
	- name: install conf file to centos7
	  template: src=files/nginx.conf.c7.j2
	  when: ansible_distribution_major_version == "7"

	- name: install conf file to centos6
	  template: src=files/nginx.conf.c6.j2
	  when: ansible_distribution_major_version == "6"

**循环:**迭代,需要重复执行的任务

对迭代项的引用,固定变量名为”item“;而后,要在task中使用with_items给定要迭代的元素列表。

- name: install some packages
  yum: name={{ item }} state=present
  with_items:
	- nginx
	- memcached
	- php-fpm
	- name: add some groups
  group: name={{ item }} state=present
  with_items:
	- group11
	- group12
	- group13
- name: add some users
  user: name={{ item.name }} group={{ item.group }} state=present
  with_items:
	- { name: 'user11', group: 'group11' }
	- { name: 'user12', group: 'group12' }
	- { name: 'user13', group: 'group13' }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值