自动化运维工具ansible:(三)playbook中template、tags、roles操作示例

目录

一:template模块介绍

二: tags模块

三: roles

3.1roles内各目录含义解释 

3.2在一个playbook中使用roles的步骤 

3.2.1创建以roles命令的目录

3.2.2创建全局变量目录

3.2.3在roles目录中分别创建以各角色名称命令的目录,如httpd 

3.2.4在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空

3.2.5在每个角色的handlers、tasks、meta、defaults、vars目录下创建main.yml文件,千万不能自定义

3.2.6在playbook文件中,调用各角色 

3.3实验 

一:template模块介绍

ansible的template模块,可以将带有参数的配置文件传递到目标地址,可以对文件进行属组属主的修改以及备份。优先类似于docker的consul。

templates功能:根据模板文件动态生成对应的配置文件,命名必须以 .j2 结尾

示例:

yum -y install httpd
rpm -qc httpd
 
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak
#修改httpd配置文件
[root@localhost conf]# vim /etc/httpd/conf/httpd.conf 		
42 Listen {
   
   {http_port}}				#给监听端口定义变量
43 MaxClients {
   
   {client_num}}		#最大并发量定义变量
95 ServerName {
   
   {server_name}}		#给域名定义变量

vim /etc/ansible/hosts
[webserver]
192.168.163.150 httpd_port=192.168.163.150:80 server_name="www.test.com:80" access_num=100

vim apache.yaml
- hosts: webserver
  remote_user: root
  vars:
   - ap: httpd
  tasks:
   - name: install httpd
     yum: name={
   
   {ap}}
   - name: create configure file
     template: src=/root/httpd/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
     notify:
      - restart httpd
   - name: start httpd server
     service: name={
   
   {ap}} enabled=true state=started
  handlers:
   - name: restart httpd
     service: name={
   
   {ap}} state=restarted

ansible-playbook apache.yaml --syntax-check
ansible-playbook apache.yaml    #执行脚本

去两台远程主机上查看
ansible webserver -m shell -a 'cat /etc/httpd/conf/httpd.conf | grep -i "listen"'
ansible webserver -m shell -a 'cat /etc/httpd/conf/httpd.conf | grep -i "maxclient"'
ansible webserver -m shell -a 'cat /etc/httpd/conf/httpd.conf | grep -i "servername"'


二: tags模块

当你写了一个很长的playbook,其中有很多的任务,这并没有什么问题,不过在实际使用这个剧本时,你可能只是想要执行其中的一部分任务而已,或者,你只想要执行其中一类任务而已,而并非想要执行整个剧本中的全部任务,这时,我们可以借助tags模块为任务进行打标签操作,任务存在标签后,我们可以在执行playbook时利用标签,指定执行哪些任务,或者不执行哪些任务

简单的说:在一个playbook中,我们一般会定义很多个task,如果我们只想执行其中的某一个task或多个task时就可以使用tags标签功能了。

示例:

vim tags1.yaml
- hosts: webserver
  remote_user: root
  tasks:
   - name: copy hosts file
     copy: src=/etc/hosts dest=/opt/hosts
     tags:
      - only
   - name: touch file
     file: path=/opt/touch1 state=touch
执行命令:ansible-playbook tags1.yaml --tags="only"
ansible-playbook hosts.yml

事实上,不光可以为单个或多个task指定同一个tags。playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。 

//远程删除文件,虚拟机实验也可以直接切换虚拟机删除
ansible webserver -a 'rm /opt/hosts -f'
ansible webserver -a 'rm /opt/touch1 -f'
ansible webserver -a 'ls /opt'

vim tags1.yaml
- hosts: webserver
  remote_user: root
  tasks:
   - name: copy hosts file
     copy: src=/etc/hosts dest=/opt/hosts
     tags:
      - only
   - name: touch file
     file: path=/opt/touch1 state=touch
     tags:
      - always
执行命令:ansible-playbook tags1.yaml --tags="only"
查看/opt目录下的文件:ansible webserver -a 'ls /opt'


三: roles

roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用  include 指令即可。

简单的说,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。

角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中。

3.1roles内各目录含义解释 

目录名称 作用
files 用来存放由copy模块或script模块调用的文件。
templates 用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
tasks 此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
handlers 此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
vars 此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
defaults 此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
meta 此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。

3.2在一个playbook中使用roles的步骤 

3.2.1创建以roles命令的目录

//yum装完默认就有
mkdir /etc/ansible/roles/ -p

3.2.2创建全局变量目录

mkdir /etc/ansible/group_vars/ -p
 
//文件名自己定义,引用的时候注意
touch /etc/ansible/group_vars/all

3.2.3在roles目录中分别创建以各角色名称命令的目录,如httpd 

mkdir /etc/ansible/roles/common -p

3.2.4在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p

3.2.5在每个角色的handlers、tasks、meta、defaults、vars目录下创建main.yml文件,千万不能自定义

touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml

3.2.6在playbook文件中,调用各角色 

vim /etc/ansible/site.yml
- hosts: webserver
  remote_user: root
  roles:
   - httpd
   - mysql

3.3实验 

安装httpd、mysql和php服务

创建相应的目录和目录中的main.yml文件

#分别在httpd,mysql,php下创建files,templates,tasks,handlers,vars,defaults,meta文件夹,以便在其下面创建main.yml文件进行编写
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
 
#也可三条并一条写:
mkdir /etc/ansible/roles/{httpd,mysql,php}/{files,templates,tasks,handlers,vars,defaults,meta} -p
#分别在httpd,mysql,php的defaults,vars,tasks,meta,handlers下创建main.yml文件,便于编译内容,名称千万不能自定义。
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
 
#也可三条并一条写:
touch /etc/ansible/roles/{httpd,mysql,php}/{tasks,handlers,vars,defaults,meta}/main.yml
#树状图递归查看文件内容
tree /etc/ansible/roles/{httpd,mysql,php}/

编写httpd模块

定义变量可以定义在全局变量中,也可以定义在ansible的roles角色变量中,一般定义在角色变量中

#编写一个简单的tasks/main.yml文件
 
#定义变量
vim /etc/ansible/roles/httpd/tasks/main.yml 
- name: ensure apache is at the latest version
  yum: pkg={
   
   {pkg}} state=latest		#定义变量为pkg。这里是想用httpd的,但是变量赋值要在vars目录下的main.yml文件内编写

定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中

#赋值变量
vim /etc/ansible/roles/httpd/vars/main.yml 
pkg: httpd				#此变量定义在httpd中,下面MySQL模块中使用同一字符串进行不同定义也是可以的,不相干

下面的mysql模块、php模块的配置和httpd模块的配置一样 

编写mysql模块

#定义变量
vim /etc/ansible/roles/mysql/tasks/main.yml 
- name: ensure mysql is at the latest version
  yum: pkg={
   
   {pkg}} state=latest
 
#变量赋值
vim /etc/ansible/roles/mysql/vars/main.yml 
pkg: mariadb*

编写php模块

#定义变量
vim /etc/ansible/roles/php/tasks/main.yml 
- name: ensure php is at the latest version
  yum: pkg={
   
   {pkg}} state=latest
 
#变量赋值
vim /etc/ansible/roles/php/vars/main.yml 
pkg: php

编写roles示例

vim /etc/ansible/site.yml
- hosts: webserver
  remote_user: root
  roles:
   - httpd
   - mysql
   - php

//检查脚本的有没有语法问题
ansible-playbook site.yml --syntax-check
//执行脚本
ansible-playbook site.yml

猜你喜欢

转载自blog.csdn.net/ver_mouth__/article/details/126215210