ansible—templates/tags/roles 使用介绍
templates 模板
[root@ansible ~]# cd /opt/
[root@ansible opt]# ssh-agent bash '//控制用来保存公钥身份验证所使用的私钥'
[root@ansible opt]# ssh-add '//把专用秘钥添加至ssh-agent高速缓存中'
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
[root@ansible opt]# scp root@192.168.126.20:/etc/httpd/conf/httpd.conf /opt/
'//将webserver端的apache配置文件远程复制至本地'
httpd.conf 100% 11KB 10.1MB/s 00:00
[root@ansible opt]# vim httpd.conf
'//修改配置文件,添加模板(变量)'
43 Listen {{http_port}} '//监听'
98 ServerName {{server_name}} '//域名'
99 MaxClients {{access_num}} '//访问量'
[root@ansible opt]# mv httpd.conf httpd.conf.j2
'//修改完配置文件,复制一份,j2格式表示为模板'
[root@ansible opt]# vim /etc/ansible/hosts
'//后续需要对参数进行赋值'
25 [webserver] '//设定变量'
26 192.168.126.20 http_port=192.168.126.20:80 server_name="www.chenwei.com:80" access_num=300
[root@ansible opt]# vim apache.yml
- hosts: webserver '//指定webserver'
remote_user: root '//指定远程主机使用root用户'
vars: '//变量可以定义在vars中,也可以在hosts主机清单中'
- package: httpd
- server: httpd
tasks:
- name: check latest '//检查最新版本'
yum: name={{package}} state=latest '//安装最新版本服务'
- name: configure apache '//配置apache'
template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
'//源文件在ansible端,生成至对方服务器端'
notify: '//修改配置文件后需重启服务'
- restart httpd
- name: statrt httpd '//最后一步需要开启服务项'
service: name={{server}} enabled=true state=started '//开启自启'
handlers: '//notify通知handlers执行'
- name: restart httpd '//重启服务使配置生效'
service: name={{server}} state=restarted
[root@ansible opt]# ansible-playbook apache.yml --syntax-check
'//检查语法,正确'
playbook: apache.yml
[root@ansible opt]# ansible-playbook apache.yml
'//执行'
PLAY [webserver] ****************************************************************
TASK [Gathering Facts] **********************************************************
ok: [192.168.126.20]
TASK [check latest] *************************************************************
ok: [192.168.126.20]
TASK [configure apache] *********************************************************
changed: [192.168.126.20]
TASK [statrt httpd] *************************************************************
ok: [192.168.126.20]
RUNNING HANDLER [restart httpd] *************************************************
changed: [192.168.126.20]
PLAY RECAP **********************************************************************
192.168.126.20 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
'//切换至webserver主机,查看配置文件是否更改'
[root@webserver ~]# grep -i Listen /etc/httpd/conf/httpd.conf
[root@webserver ~]# grep -i MaxClients /etc/httpd/conf/httpd.conf
[root@webserver ~]# grep -i ServerName /etc/httpd/conf/httpd.conf
'//可以看到配置好的模板已自动生效'
'//所有服务器皆可按照模板来,非常强大及便捷!'
tags 模块
1.在一个剧本中,一般会定义多个task,而tags可以选择执行哪一个
[root@ansible opt]# vim file.yml
- 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/hosts01 state=touch
'//以上操作表示为只执行完第一个就结束而不执行第二个'
'//若不设置标签则会执行到底
'
[root@ansible opt]# ansible-playbook file.yml --syntax-check
playbook: file.yml
[root@ansible opt]# ansible-playbook file.yml --tags="only"
PLAY [webserver] ****************************************************************
TASK [Gathering Facts] **********************************************************
ok: [192.168.126.20]
TASK [Copy hosts file] **********************************************************
changed: [192.168.126.20]
PLAY RECAP **********************************************************************
192.168.126.20 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible opt]# ansible webserver -a "ls /opt"
192.168.126.20 | CHANGED | rc=0 >>
hosts '//结果反馈,只有hosts,没有hosts01,执行成功'
rh
--always--
[root@ansible opt]# vim file.yml
- 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/hosts01 state=touch
tags: '//添加此项,always表示在任何条件前提下始终执行'
- always
[root@ansible opt]# ansible webserver -a "rm -rf /opt/hosts"
[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.
192.168.126.20 | CHANGED | rc=0 >>
'//删除旧文件,方便后续测试'
[root@ansible opt]# ansible-playbook file.yml
PLAY [webserver] ****************************************************************
TASK [Gathering Facts] **********************************************************
ok: [192.168.126.20]
TASK [Copy hosts file] **********************************************************
changed: [192.168.126.20]
TASK [touch file] ***************************************************************
changed: [192.168.126.20]
PLAY RECAP **********************************************************************
192.168.126.20 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible opt]# ansible webserver -a "ls -l /opt"
192.168.126.20 | CHANGED | rc=0 >>
总用量 4
-rw-r--r-- 1 root root 158 4月 8 10:00 hosts
-rw-r--r-- 1 root root 0 4月 8 10:00 hosts01 '//有了,always生效'
drwxr-xr-x. 2 root root 6 3月 26 2015 rh
roles 模块
roles介绍
Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。
角色(roles)是ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单的说,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中。
角色是ansible自带的工具,在我之前的博客学习了playbook的用法,将所有的操作写入playbook里面,但是如果hosts较多,写在一起容易混淆并且读起来也不方便。所以我们引入了roles,roles将每个部分分割开来,生成不同的目录,每个目录有每个目录的作用。
讲解每个目录的作用,其实不难发现,每个目录就是我们之前写playbook中所用到的,将每个部分分离出来。
roles内各目录含义解释
files | 用来存放由copy模块或script模块调用的文件。 |
---|---|
templates | 用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。 |
tasks | 此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件 |
handlers | 此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。 |
vars | 此目录应当包含一个main.yml文件,用于定义此角色用到的变量。 |
defaults | 此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。 |
meta | 此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。 |
roles使用步骤
在一个palybook中使用roles的步骤
1)创建以roles命令的目录
mkdir /etc/ansible/roles/ -p #yum安装的默认就有
2)创建全局变量目录
mkdir /etc/ansible/group-vars/ -p
touch /etc/ansible/group_vars/all #文件名自己定义,引用的时候注意
3) 在roles目录中分别创建以各角色名称命令的目录,如httpd。
mkdir /etc/ansible/roles/common -p
4) 在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空(以httpd和mysql举例)
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
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
6) 在playbook文件中,调用各角色。
vim /etc/ansible/site.yml
-hosts: webserver
remote_user: root
roles:
- httpd
- mysql
实验:安装搭建LAMP架构
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
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
–编写httpd模块
-----写一个简单的tasks/main.yml
vim /etc/ansible/roles/httpd/tasks/main.yml
- name: ensure apache is at the latest version
yum: pkg={{pkg}} state=latest
定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
-------编写mysql模块-------
vim fetc/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/lamp.yml
- hosts: webserver
remote_user: root
roles:
- httpd
- mysql
- php
----验证ansible-playbook----
ansible-playbook lamp.yaml