目录
Templstes模块
其实就是模板设置好变量,赋值就好
yum install httpd -y
[root@server ~]# mkdir httpd
[root@server ~]# ls
anaconda-ks.cfg httpd initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@server ~]# cp /etc/httpd/conf/httpd.conf /root/httpd/httpd.conf.j2
[root@server ~]# vim /root/httpd/httpd.conf.j2
#设置变量
#给变量赋值
vim /etc/ansible/hosts
[webserver]
192.168.109.77 http_port=192.168.109.77:80 access_num=100 server_name="www.zzz.com:80"
[root@server ~]# mkdir demo
[root@server ~]# ls
anaconda-ks.cfg demo httpd initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@server ~]# cd demo/
[root@server demo]# vim apache.yaml
- hosts: webserver
remote_user: root
vars:
- abc: httpd
tasks:
- name: install httpd
yum: name={{abc}} state=latest
- name: install configure file
template: src=/root/httpd/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd
service: name={{abc}} enabled=true state=started
handlers:
- name: restart httpd
service: name={{abc}} state=restarted
[root@server demo]# ansible-playbook apache.yaml --syntax-check
playbook: apache.yaml
[root@server demo]# ansible-playbook apache.yaml
PLAY [webserver] ***********************************************************************************************
TASK [Gathering Facts] *****************************************************************************************
ok: [192.168.109.77]
TASK [install httpd] *******************************************************************************************
ok: [192.168.109.77]
TASK [install configure file] **********************************************************************************
changed: [192.168.109.77]
TASK [start httpd] *********************************************************************************************
fatal: [192.168.109.77]: FAILED! => {"changed": false, "msg": "Unable to start service httpd: Job for httpd.service failed because the control process exited with error code. See \"systemctl status httpd.service\" and \"journalctl -xe\" for details.\n"}
RUNNING HANDLER [restart httpd] ********************************************************************************
PLAY RECAP *****************************************************************************************************
192.168.109.77 : ok=3 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
#远程主机查看是否是前面的赋值
grep -i listen /etc/httpd/conf/httpd.conf
grep -i maxclient /etc/httpd/conf/httpd.conf
grep -i servername /etc/httpd/conf/httpd.conf
tags模块
在一个playbook中定义多个task,如果想只执行其中某个task,这是就用到tags标签功能。
[root@server demo]# vim hosts.yaml
- hosts: webserver
remote_user: root
tasks:
- name: copy hosts
copy: src=/etc/ansible/hosts dest=/opt/hosts
tags:
- abc
- name: touch file
file: path=/opt/hosts01 state=touch
[root@server demo]# ansible-playbook hosts.yaml --tags="abc"
PLAY [webserver] ***********************************************************************************************
TASK [Gathering Facts] *****************************************************************************************
ok: [192.168.109.77]
TASK [copy hosts] **********************************************************************************************
changed: [192.168.109.77]
PLAY RECAP *****************************************************************************************************
192.168.109.77 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
但是事无绝对,就有那么一个tags很特殊。当tags是always时不管什么情况都要执行。
[root@server demo]# vim hosts.yaml
- hosts: webserver
remote_user: root
tasks:
- name: copy hosts
copy: src=/etc/ansible/hosts dest=/opt/hosts
tags:
- abc
- name: touch file
file: path=/opt/hosts01 state=touch
tags:
- always
[root@server demo]# ansible-playbook hosts.yaml --tags="abc"
PLAY [webserver] ***********************************************************************************************
TASK [Gathering Facts] *****************************************************************************************
ok: [192.168.109.77]
TASK [copy hosts] **********************************************************************************************
ok: [192.168.109.77]
TASK [touch file] **********************************************************************************************
changed: [192.168.109.77]
PLAY RECAP *****************************************************************************************************
192.168.109.77 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
roles模块
roles能够根据层次型结构自动装载变量文件、task以及handlers等。 简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中。
roles/
common/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
web/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
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 文件, 用于定义此角色的特殊设定及其依赖关系
在一个playbook中使用roles的步骤
1、创建roles命令的目录
2、创建全局变量目录
3、在roles目录中分别创建以各角色名称命令的目录,如httpd
4、在每个角色命令的目录中分别创建file、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空
5、在每个角色都handlers、tasks、meta、defaults、vars、目录下创建main.yml文件,千万不能自定义。
6、在playbook文件中调用各角色。
安装搭建LAMP架构
创建文件
#分别在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
yum install tree -y
#树状图递归查看文件内容
tree /etc/ansible/roles/{httpd,mysql,php}/
/etc/ansible/roles/httpd/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
/etc/ansible/roles/mysql/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
/etc/ansible/roles/php/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── 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 #定义变量为pkg。这里是想用httpd的,但是变量赋值要在vars目录下的main.yml文件内编写
#赋值变量
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd #此变量定义在httpd中,下面MySQL模块中使用同一字符串进行不同定义也是可以的,不相干
编写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总脚本
#编写roles总脚本,使各个模块可以联合起来执行
vim /etc/ansible/web.yml
- hosts: webservers
remote_user: root
roles:
- httpd
- mysql
- php
#执行
ansible-playbook /etc/ansible/web.yml