淘宝网店开店网站建设,阜新全网营销网站建设,网站开发实战教程,福州高端网站建设一.Ansible playbook简介
1.playbook是ansible用于配置#xff0c;部署#xff0c;和管理被节点的剧本
2.通过playbook的详细描述#xff0c;执行其中的一些列tasks#xff0c;可以让远端的主机达到预期的状态。playbook就像ansible控制器给被控节点列出的一系列to-do-lis…一.Ansible playbook简介
1.playbook是ansible用于配置部署和管理被节点的剧本
2.通过playbook的详细描述执行其中的一些列tasks可以让远端的主机达到预期的状态。playbook就像ansible控制器给被控节点列出的一系列to-do-list而且被控节点必须要完成
3.playbook顾名思义即剧本现实生活中演员按照剧本表演在ansible中这次由被控计算机表演进行安装部署应用提供对外的服务等以及组织计算机处理各种各样的事情。二.Ansible playbook使用场景
1.执行一些简单的任务使用ad-hoc命令可以方便的解决问题但是有时一个设施过于复杂需要大量的操作的时候执行的ad-hoc命令是不合适的这时候最好使用playbook。
2.就像执行shell命令与写shell脚本一样也可以理解为批处理任务不过playbook有自己的语法格式
3.使用playbook可以方便的重复使用这些代码可以移植到不同的机器上面像函数一样最大化的利用代码。在你使用Ansible的过程中你也会发现你所处理的大部分操作都是编写playbook。可以把常见的应用都编写playbook之后管理服务器会变得很简单。三.Ansible playbook格式
格式简介
1.playbook由YAML语言编写。 2.YAML( /ˈjæməl/ )参考了其他多种语言包括XML、C语言、Python、Perl以及电子邮件格式RFC2822Clark Evans在2001年5月在首次发表了这种语言另外Ingy döt Net与OrenBen-Kiki也是这语言的共同设计者。 3.YAML格式是类似JSON的文件格式。YAML用于文件的配置编写JSON多用于开发设计。
YAML的格式如下
1.文件的第一行应该以“---”三个连字符开始表明YAML文件的开始。
2.在同一行中#之后的内容表示注释类似于shellpython和ruby。
3.YAML中的列表元素以“-”开头并且跟着一个空格。后面为元素内容。
4.同一个列表之中的元素应该保持相同的缩进否则会被当做错误处理。
5.play中hosts、variables、roles、tasks等对象的表示方法都是以键值中间以“”分隔表示并且“”之后要加一个空格。host部分使用hosts指示使用哪个主机或者主机组来运行下面的tasks每个playbooks都必须指定hostshost也可以使用通配符格式。主机或者主机组在inventorry清单中指定可以使用系统默认的/etc/ansible/hosts也可以自己编辑在运行的时候加上-i 选项指定清单的位置。在运行清单文件的时候 --list-hosts选项会显示哪些主机将会参与执行task的过程中。
remote_user指定远端主机的哪个用户来登录远端系统在远端系统执行task的用户可以任意指定也可以使用sudo但是用户必须要有执行相应的task权限。
tasks指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块前面已经提到模块的用法tasks包含name和要执行的模块name是可选的只是为了便于用户阅读模块是必须的同时也要给予模块相应的参数4.使用ansible-playbook运行playbook文件得到的输出信息中信息内容为JSON格式并且由不同的颜色组成便于识别。
5.绿色代表执行成功系统保持原样。黄色代表系统状态发生改变。红色代表执行失败显示错误输出。
核心元素 Hosts主机组 Tasks任务列表 Variables变量设置方式有四种 Templates包含了模块语法的文本文件 Handlers由特定条件触发的任务。
基本组件
1.playbooks配置文件的基础组件
Hosts运行指定任务的目标主机
remoute_user:在远程主机上执行任务的用户
sudo_user:
tasks:任务列表tasks的具体格式
tasks:- name: TASK_NAMEmodule: argumentsnotify: HANDLER_NAMEhandlers:- name: HANDLER_NAMEmodule: arguments
##模块模块参数
格式如下1action: module arguments(2) module: arguments
注意shell和command模块后直接加命令而不是keyvalue类的参数列表
handlers任务在特定条件下触发接受到其他任务的通知时被触发2.在某个任务的状态在运行之后为changed时可以通过“notify”通知相应的handlers
3.任务可以通过“tags”打标签而后可以在ansible-playbook命令上使用-t指定进行调用
定义一个安装nginx的playbook
定义playbook
[rootansible ~]# cd /etc/ansible/
[rootansible ansible]# ls
ansible.cfg hosts nginx.yml roles
[rootansible ansible]# vim nginx.yml
---
- hosts: webremote_user: roottasks:- name: install nginx ##安装模块。需要在被控主机里添加上nginx的源yum: namenginx statepresent- name: copy nginx.conf ##复制nginx的配置文件过去需要在本机的/tmp目录下编辑nginx.confcopy: src/tmp/nginx.conf dest/etc/nginx/nginx.conf backupyesnotify: reload ##当nginx.conf发生改变时通知给相应的handerstags: reloadnginx- name: start nginx service ##服务启动模块service: namenginx statestartedtags: startnginx ##打标签handlers:- name: reloadservice: namenginx staterestarted
测试运行结果
[rootansible ansible]# ansible-playbook nginx.yml
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [install nginx] *************************************************************************************************
changed: [10.1.1.173]
changed: [10.1.1.172]
TASK [copy nginx.conf] ***********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [start nginx service] *******************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
PLAY RECAP ***********************************************************************************************************
10.1.1.172 : ok4 changed2 unreachable0 failed0 skipped0 rescued0 ignored0
10.1.1.173 : ok4 changed2 unreachable0 failed0 skipped0 rescued0 ignored0
##查看被控主机上的nginx服务
[rootansible ansible]# ansible web -m shell -a netstat -natp|grep nginx
10.1.1.173 | CHANGED | rc0
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 34304/nginx: master
tcp6 0 0 :::80 :::* LISTEN 34304/nginx: master
10.1.1.172 | CHANGED | rc0
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 33550/nginx: master
tcp6 0 0 :::80 :::* LISTEN 33550/nginx: master 测试标签我们在nginx.yml中已经打了标签所以可以直接应用标签但是需要先将服务关闭在运行剧本并且引用标签
##关闭被控节点的nginx服务
[rootansible ansible]# ansible web -m shell -a systemctl stop nginx
10.1.1.173 | CHANGED | rc0
10.1.1.172 | CHANGED | rc0
##重新加载剧本并应用标签
[rootansible ansible]# ansible web -m shell -a systemctl stop nginx
10.1.1.173 | CHANGED | rc0
10.1.1.172 | CHANGED | rc0
[rootansible ansible]# ansible-playbook nginx.yml -t startnginx
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.173]
ok: [10.1.1.172]
TASK [start nginx service] *******************************************************************************************
changed: [10.1.1.173]
changed: [10.1.1.172]
PLAY RECAP ***********************************************************************************************************
10.1.1.172 : ok2 changed1 unreachable0 failed0 skipped0 rescued0 ignored0
10.1.1.173 : ok2 changed1 unreachable0 failed0 skipped0 rescued0 ignored0 测试notify在nginx.yml中做了一个notify当配置文件改变时条件就被戳发我们修改一下/tem/nginx.conf的监听端口
##使用reloadnginx标签重新加载剧本
[rootansible ~]# cd /etc/ansible/
[rootansible ansible]# ls
ansible.cfg hosts nginx.yml roles
[rootansible ansible]# ansible-playbook nginx.yml -t reloadnginx
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.173]
ok: [10.1.1.172]
TASK [copy nginx.conf] ***********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
RUNNING HANDLER [reload] *********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
PLAY RECAP ***********************************************************************************************************
10.1.1.172 : ok3 changed2 unreachable0 failed0 skipped0 rescued0 ignored0
10.1.1.173 : ok3 changed2 unreachable0 failed0 skipped0 rescued0 ignored0
##查看被控主机上nginx服务是否开启
[rootansible ansible]# ansible web -m shell -a netstat -natp|grep nginx
10.1.1.173 | CHANGED | rc0
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 35440/nginx: master
10.1.1.172 | CHANGED | rc0
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 34688/nginx: master variables变量
variables变量有四种定义方法。如下 facts:可以直接调用
1.ansible中有setup模块这个模块就是通过facts组件来实现的。这里的variables也可以直接调用facts组件的facters我们可以使用setup模块来获取然后直接放入我们的剧本之中调用即可 用户自定义变量
自定义变量有两种方式
通过命令行传入
ansible-playbook命令行中的 -e VARS--extra-varsVARS这样就可以直接把自定义的变量传入在playbook中定义变量
##在playbook中定义变量如下
vars- var1: value1- var2: value2使用playbook定义变量实例如下
定义剧本将ngixn替换成变量
[rootansible ansible]# cat nginx.yml
---
- hosts: webremote_user: roottasks:- name: install {{ rpmname }}yum: name{{ rpmname }} statepresent- name: copy {{ rpmname }}.confcopy: src/tmp/{{ rpmname }}.conf dest/etc/{{ rpmname }}/{{ rpmname }}.conf backupyesnotify: reloadtags: reload{{ rpmname }}- name: start {{ rpmname }} serviceservice: name{{ rpmname }} statestartedtags: start{{ rpmname }}handlers:- name: reloadservice: name{{ rpmname }} staterestarted
拷贝配置文件
##因为我们要安装keepalive服务所以将keepalived的配置文件拷贝到/tmp目录下
##可以在本机上下载keepalived服务
[rootansible ~]# cp /etc/keepalived/keepalived.conf /tmp/keepalived.conf运行剧本变量有命令行传入
[rootansible ~]# cd /etc/ansible/
[rootansible ansible]# ls
ansible.cfg hosts nginx.yml roles
##-e表示编辑yml内部变量
[rootansible ansible]# ansible-playbook nginx.yml -e rpmnamekeepalived
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [install keepalived] ********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
TASK [copy keepalived.conf] ******************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
TASK [start keepalived service] **************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
RUNNING HANDLER [reload] *********************************************************************************************
changed: [10.1.1.173]
changed: [10.1.1.172]
PLAY RECAP ***********************************************************************************************************
10.1.1.172 : ok5 changed4 unreachable0 failed0 skipped0 rescued0 ignored0
10.1.1.173 : ok5 changed4 unreachable0 failed0 skipped0 rescued0 ignored0修改剧本直接定义变量同样我们可以直接在剧本中定义好变量这样就不需要再通过命令行传入。以后想要俺咋混给不同的服务直接在剧本内部修改变量即可
[rootansible ansible]# vim nginx.yml
---
- hosts: webremote_user: rootvars: ##添加此处两行- rpmname: keepalived ##定义rmpname变量值tasks:- name: install {{ rpmname }}yum: name{{ rpmname }} statepresent- name: copy {{ rpmname }}.confcopy: src/tmp/{{ rpmname }}.conf dest/etc/{{ rpmname }}/{{ rpmname }}.conf backupyesnotify: reloadtags: reload{{ rpmname }}- name: start {{ rpmname }} serviceservice: name{{ rpmname }} statestartedtags: start{{ rpmname }}handlers:- name: reloadservice: name{{ rpmname }} staterestarted运行定义过变量的剧本
[rootansible ansible]# ansible-playbook nginx.yml
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.173]
ok: [10.1.1.172]
TASK [install keepalived] ********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [copy keepalived.conf] ******************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [start keepalived service] **************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
PLAY RECAP ***********************************************************************************************************
10.1.1.172 : ok4 changed0 unreachable0 failed0 skipped0 rescued0 ignored0
10.1.1.173 : ok4 changed0 unreachable0 failed0 skipped0 rescued0 ignored0 通过roles传递变量
当说到roles时具体说明
Host Inventory
我们也可以在主机清单中定义方法如下
#向不同的主机传递不同的变量
IP/HOSTNAME varaiablevalue var2value2
#向组中的主机传递相同的变量
[groupname:vars]
variablevalue模板templates
1.模板是一个文本文件嵌套有脚本使用模板编程语言编写 2.Jinja2是python的一种模板语言以Django的模板语言为原本 3.该模板支持 字符串使用单引号或双引号数字整数浮点数列表[item1, item2, ...]元组(item1, item2, ...)字典{key1:value1, key2:value2, ...}布尔型true/false算术运算, -, *, /, //, %, **比较操作, !, , , , 逻辑运算and, or, not4.通常模板都是通过引用变量来运用的 实例如下
定义模板
定义模板
[rootansible ansible]# mv /tmp/nginx.conf /tmp/nginx.conf.j2
修改剧本如下两个地方
[rootansible ansible]# vim nginx.yml
---
- hosts: webremote_user: rootvars:- rpmname: nginxnginxport: 8888 ##修改此处tasks:- name: install {{ rpmname }}yum: name{{ rpmname }} statepresent- name: copy {{ rpmname }}.conf##修改此处模板源地址copy: src/tmp/{{ rpmname }}.conf.j2 dest/etc/{{ rpmname }}/{{ rpmname }}.conf backupyesnotify: reloadtags: reload{{ rpmname }}- name: start {{ rpmname }} serviceservice: name{{ rpmname }} statestartedtags: start{{ rpmname }}handlers:- name: reloadservice: name{{ rpmname }} staterestarted运行剧本
[rootansible ansible]# ansible-playbook nginx.yml -t reloadnginx
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [copy nginx.conf] ***********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
RUNNING HANDLER [reload] *********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
PLAY RECAP ***********************************************************************************************************
10.1.1.172 : ok3 changed2 unreachable0 failed0 skipped0 rescued0 ignored0
10.1.1.173 : ok3 changed2 unreachable0 failed0 skipped0 rescued0 ignored0 条件测试
when语句在task中使用jinja2的语法格式
tasks:- name: install conf file to centos8template: srcfiles/nginx.conf.c8.j2when: ansible_distribution_major_version 8- name: install conf file to centos7template: srcfiles/nginx.conf.c.j2when: ansible_distribution_major_version 7循环迭代需要重复执行的任务对于迭代项的引用固定变量名为item,而后在task中使用with_items给定的迭代的元素列表
tasks:- name: unstall web packagesyum: name{{ item }} stateabsentwith_items:- httpd- php- php-mysql字典
ansible playbook也支持字典功能举例如下
- name: install some packagesyum: name{{ item }} statepresentwith_items:- nginx- memcached- php-fpm- name: add some groupsgroup: name{{ item }} statepresentwith_items:- group11- group12- group13- name: add some usersuser: name{{ item.name }} group{{ item.group }} statepresentwith_items:- { name: user11,group: group11 }- { name: user12,group: group12 }- { name: user13,group: group13 }角色定制
简介
1.对于以上所有方式有个缺点就是无法实现同时部署web、database、keepalived等不同服务或者不同服务器组合不同的应用就需要写多个yaml文件很难实现灵活的调用
2.roles用于层次性结构化地组织playbook。roles能够根据层次结果自动装载变量文件、tasks以及handlers等。
3.要使用roles只需要在playbook中使用include指令即可。
4.简单来讲roles就是通过分别将变量vars、文件files、任务tasks、模块modules以及处理器handlers放置于单独的目录中并且可以便捷的include它们地一种机制。
5.角色一般用于基于主机构建服务的场景中但是也可以用于构建守护进程等场景中。角色集合
roles/
mysql/mysql服务的yml文件
httpd/apached服务的yml文件
nginx/nginx服务的yml文件
files/存储由copy或者script等模块调用的文件或者脚本
tasks/此目录中至少应该有一个名为main.yml的文件用于定义各个task其他文件需要由main.yml进行包含调用
handlers/此目录中至少应该有一个名为main.yml的文件用于定义各个handler其他文件需要由main.yml进行包含调用
vars/此目录至少应该有一个名为main,yml的文件用于定义各个variable其他的文件需要由main.yml进行包含调用
templates/存储由templates模块调用的模板文件
meta/此目录中至少应该有一个名为main.yml的文件定义当前角色的特殊设定以及依赖关系其他文件需要由main.yml进行包含调用
default/此目录至少应该有一个名为main.yml的文件用于设定默认变量角色定制实例
在roles目录下生成对应的目录结构
[rootansible ~]# cd /etc/ansible/
[rootansible ansible]# ls
ansible.cfg hosts nginx.yml roles
[rootansible ansible]# cd roles/
[rootansible roles]# ls
[rootansible roles]# mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
[rootansible roles]# tree
.
├── httpd
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
├── mysql
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── nginx├── default├── files├── handlers├── meta├── tasks├── templates└── vars定义配置文件
[rootansible nginx]# pwd
/etc/ansible/roles/nginx
[rootansible nginx]# ls
default files handlers meta tasks templates vars
[rootansible nginx]# vim tasks/main.yml
- name: installyum: namenginx statelatest
- name: conftemplate: srcnginx.conf.j2 dest/etc/nginx/nginx.conftags: nginxconfnotify: new conf to reload
- name: start serviceservice: namenginx statestarted enabledtrue放置需要的文件到指定目录下
[rootansible nginx]# cp /tmp/nginx.conf.j2 /etc/ansible/roles/nginx/templates/
[rootansible nginx]# tree
.
├── default
├── files
├── handlers
│ └── main.yml
├── meta
├── tasks
│ └── main.yml
├── templates
│ └── nginx.conf.j2
└── vars└── main.yml修改变量文件
[rootansible nginx]# vim vars/main.yml
nginxport: 9999定义handler文件
[rootansible nginx]# vim handlers/main.yml
- name: new conf to reloadservice: namenginx staterestarted定义剧本文件
[rootansible ansible]# pwd
/etc/ansible
[rootansible ansible]# vim roles.yml
- hosts: webremote_user: rootroles:- nginx启动服务
[rootansible ansible]# ansible-playbook roles.yml
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [nginx : install] ***********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
TASK [nginx : conf] **************************************************************************************************
changed: [10.1.1.173]
changed: [10.1.1.172]
TASK [nginx : start service] *****************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
RUNNING HANDLER [nginx : new conf to reload] *************************************************************************
changed: [10.1.1.173]
changed: [10.1.1.172]
PLAY RECAP ***********************************************************************************************************
10.1.1.172 : ok5 changed4 unreachable0 failed0 skipped0 rescued0 ignored0
10.1.1.173 : ok5 changed4 unreachable0 failed0 skipped0 rescued0 ignored0
##验证是否部署成功可以查看到9999端口
[rootansible ansible]# ansible web -m shell -a ss -ntl
10.1.1.173 | CHANGED | rc0
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:9999 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*
10.1.1.172 | CHANGED | rc0
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:9999 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*