1 在playbook剧本中基于Tempalte模块配置标签
可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always作为tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。
vim /etc/ansible/playbook/play5.yaml
- name: five play
hosts: webservers
remote_user: root
tasks:
- name: create abc.txt
file: path=/opt/abc.txt state=touch
tags:
- zhu
- name: create 123.txt
file: path=/opt/123.txt state=touch
tags:
- fenng
2 Templates 模块
Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。
1 准备一个以 .j2为结尾的文件
修改http的配置文件,在文件内进行相关的配置
cp /etc/httpd/conf/httpd.conf /etc/ansible/playbook/httpd.conf.j2
vim /etc/ansible/playbook/httpd.conf.j2
Listen {{http_port}} #42行,修改
ServerName {{server_name}} #95行,修改
DocumentRoot "{{root_dir}}" #119行,修改
2 修改主机清单文件,定义变量的值
vim /etc/ansible/hosts
[webservers]
192.168.80.105 ip_port=192.168.80.105:8050 host_name=www.xy101.com:8050 root_dir=/var/www/html/
3 编写playbook
vim /etc/ansible/playbook/demo6.yaml
- name: sixth play
hosts: webservers
remote_user: root
vars:
- pkg: httpd
tasks:
- name: disable firewalld
service: name=firewalld state=stopped enabled=no
- name: disable selinux
command: '/usr/sbin/setenforce 0'
ignore_errors: true
- name: disable selinux forever
replace: path=/etc/selinux/config regexp="enforcing" replace="disabled"
ignore_errors: true
- name: mount cdrom
mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
ignore_errors: true
- name: install apache
yum: name=httpd state=latest
- name: create root dir
file: state=directory path={{item}}
with_items:
- /var/www/html/accp
- /var/www/html/benet
- name: create index.html in www.accp.com
copy: content="<h1>this is accp web</h1>" dest=/var/www/html/accp/index.html
when: ansible_default_ipv4.address == "192.168.80.50"
- name: create index.html in www.benet.com
copy: content="<h1>this is benet web</h1>" dest=/var/www/html/benet/index.html
when: inventory_hostname == "192.168.80.60"
- name: prepare configuration file
template: src=/etc/ansible/playbook/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify: "reload apache"
- name: start apache
service: name={{pkg}} state=started enabled=yes
handlers:
- name: reload apache
service: name={{pkg}} state=reloaded
最后在文件内容查看文件生成情况
4 使用playbook搭建lnmp
nginx部分
mysql部分
php部分
事先要把配置文件放到指定的目录。
5 Roles 模块
roles用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include它们的一种机制。roles一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。主要使用场景代码复用度较高的情况下。
假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成haproxy服务器,第三个要配置成MySQL(mariadb)服务器。我们如何来定义playbook?
第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建haproxy。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调用。比如说后来又加进来一个主机,这第3个主机既是httpd服务器,又是haproxy服务器,我们只能写第3个play,上面写上安装httpd和haproxy。这样playbook中的代码就重复了。
为了避免代码重复,可以定义一个角色叫httpd,第二个角色叫haproxy,并使用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实现在playbook剧本中代码复用
它将playbook剧本中的每一个play看做一个角色,将每个用到的文件,变量,任务列表定义到对应角色的目录中,在需要用到角色时,可以直接在playbook中调用角色