一、Templates 模块
Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。
yum -y install httpd
mkdir httpd
mv /etc/httpd/conf/httpd.conf /root/httpd/httpd.conf.j2
cd httpd/
编写templates模板,放在管理端
//在管理端讲配置文件要修改的地方定义变量
vim httpd.conf.j2
Listen {{httpd_port}}
ServerName {{server_name}}
MaxClients {{access_num}} //客户端最大连接数
vim /etc/ansible/hosts
[webserver]
192.168.10.16 httpd_port=192.168.10.16: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中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用–tags选项能实现仅运行指定的tasks。
- playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的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
Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。
1、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文件,用于定义此角色的特殊设定及其依赖关系。 |
2、在一个playbook中使用roles的步骤
创建以roles命令的目录
//yum装完默认就有
mkdir /etc/ansible/roles/ -p
创建全局变量目录
mkdir /etc/ansible/group_vars/ -p
//文件名自己定义,引用的时候注意
touch /etc/ansible/group_vars/all
在roles目录中分别创建以各角色名称命令的目录,如httpd
mkdir /etc/ansible/roles/common -p
在每个角色命令的目录中分别创建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
在每个角色的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
在playbook文件中,调用各角色
vim /etc/ansible/site.yml
- hosts: webserver
remote_user: root
roles:
- httpd
- mysql
3、实验:
安装httpd、mysql和php服务
创建相应的目录和目录中的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
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模块
vim /etc/ansible/roles/httpd/tasks/main.yml
- name: install apache
yum: pkg={{pkg}} state=latest
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
编写mysql模块
vim /etc/ansible/roles/mysql/tasks/main.yml
- name: install mysql
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: install php
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
验证
ansible webserver -a 'rpm -q httpd'
ansible webserver -a 'rpm -q mariadb'
ansible webserver -a 'rpm -q mariadb-server'
ansible webserver -a 'rpm -q php'