目录
一、Templates 模块
1.1准备模板文件并设置引用的变量
1.2修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
1.3编写 playbook
1.4ansible主机远程查看修改参数
1.5验证
always应用
三、Roles 模块
3.1roles 的目录结构
3.2roles 内各目录含义解释
3.2.1files
3.2.2templates
3.2.3tasks
3.2.4handlers
3.2.5vars
3.2.6defaults
3.2.7meta
3.3在一个 playbook 中使用 roles 的步骤
3.4Roles模块举例——LAMP
3.4.1创建相应的目录和目录中的main.yml文件
3.4.2编写httpd模块
3.4.2.1编写yml文件
3.4.2.2定义变量
3.4.3编写mysql模块
3.4.3.1编写yml文件
3.4.3.2定义变量 编辑
3.4.4编写php模块
3.4.4.1编写yml文件
3.4.4.2定义变量
3.4.5编写roles示例并启动
3.4.6验证查看服务状态
四、使用Playbook编译安装nginx
一、Templates 模块
- Jinja是基于Python的模板引擎。
- Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。
- 一定要以.j2 为后缀的 template 模板文件
templates是ansible的一个模块,其功能是根据模板文件动态生成配置文件,templates文件必须存放于templates目录下,且命名为".j2"结尾,yaml/yml文件需要和templates目录平级,这样我们在yml文件中调用模板的时候,就不需要写模板文件的路径,否则需要描述模板文件的路径,因为template模块会自动去找templates目录下的模板文件
环境准备
服务器类型 | IP地址 | 需要安装的组件 |
---|---|---|
Ansible管理服务器 | 192.168.246.7 | Ansible |
被管理客户端 | 192.168.246.8 | ——— |
被管理客户端 | 192.168.246.10 | ——— |
1.1准备模板文件并设置引用的变量
先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量
1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量
yum install httpd -y
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2 拷贝模板
#注意ansible本身要安装httpd,其他2台被控制的不能安装httpd
vim /opt/httpd.conf.j2
Listen {{http_port}} #42行,修改
ServerName {{server_name}} #95行,修改
DocumentRoot "{{root_dir}}" #119行,修改
#修改template配置文件模块的端口和主机名、根目录为变量
1.2修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
[web-z1]
192.168.246.8 http_port=192.168.246.8:80 server_name=www.kgc.com:80 root_dir=/etc/httpd/htdocs
[web-z2]
192.168.246.10 http_port=192.168.246.10:8081 server_name=www.benet.com:8081 root_dir=/etc/httpd/htdocs
vim /etc/hosts #主机添加hosts
192.168.246.8 zz2 www.kgc.com
192.168.246.10 zz3 www.benet.com
1.3编写 playbook
---
- hosts: all
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd package
yum: name={{package}} state=latest
- name: copy configure file
template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: create root dir
file: path=/etc/httpd/htdocs state=directory
- name: start httpd server
service: name={{service}} enabled=true state=started
handlers:
- name: restart httpd
service: name={{service}} state=restarted
1.4ansible主机远程查看修改参数
ansible all -m shell -a 'cat /etc/httpd/conf/httpd.conf| grep -i "Servername"'
ansible all -m shell -a 'cat /etc/httpd/conf/httpd.conf| grep -i "Listen"'
ansible all -m shell -a 'cat /etc/httpd/conf/httpd.conf| grep -i "DocumentRoot"'
grep -i 不区分大小写
1.5验证
查看httpd服务状态
查看域名访问效果
如果想在浏览器检测,在真机修改/etc/hosts文件
二、tags 模块
可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。
---
- name: ceshi tags
hosts: web-z1
remote_user: root
tasks:
- name: copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- nihao
- name: touch file
file: path=/opt/anhui state=touch
可以看到当指定标签tags就执行到标签为止
always应用
---
- name: ceshi tags
hosts: web-z1
remote_user: root
tasks:
- name: copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- nihao
- name: touch file
file: path=/opt/anhui state=touch
tags:
- always
查看添加了always之后,再指定标签执行,无论执行哪一个tags时,定义有always的tags都会执行。
三、Roles 模块
Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。
3.1roles 的目录结构
要创建才会有这些目录哦(如下图),不然是没有的哦
cd /etc/ansible/
tree roles/
roles/
├── web/
│ ├── files/
│ ├── templates/
│ ├── tasks/
│ ├── handlers/
│ ├── vars/
│ ├── defaults/
│ └── meta/
└── db/
├── files/
├── templates/
├── tasks/
├── handlers/
├── vars/
├── defaults/
└── meta/
3.2roles 内各目录含义解释
3.2.1files
用来存放由 copy 模块或 script 模块调用的文件。
3.2.2templates
用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
3.2.3tasks
此目录应当包含一个main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。
3.2.4handlers
此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
3.2.5vars
此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
3.2.6defaults
此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。
3.2.7meta
此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。
3.3在一个 playbook 中使用 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、mysql
mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
(4)在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
(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)修改 site.yml 文件,针对不同主机去调用不同的角色
vim /etc/ansible/site.yml
---
- hosts: webservers
remote_user: root
roles:
- httpd
- hosts: dbservers
remote_user: root
roles:
- mysql
(7)运行 ansible-playbook
cd /etc/ansible
ansible-playbook site.yml
3.4Roles模块举例——LAMP
在Linux上面安装apache(httpd)、mysql和php服务
3.4.1创建相应的目录和目录中的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
3.4.2编写httpd模块
3.4.2.1编写yml文件
写一个简单的tasks/main.yml
vim /etc/ansible/roles/httpd/tasks/main.yml
---
- name: install apache
yum: name={{pkg}} state=latest
- name: start apache
service: enabled=true name={{svc}} state=started
3.4.2.2定义变量
定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
svc: httpd
3.4.3编写mysql模块
3.4.3.1编写yml文件
vim /etc/ansible/roles/mysql/tasks/main.yml
---
- name: install mysql
yum: name={{pkg}} state=latest
- name: start mysql
service: enabled=true name={{svc}} state=started
3.4.3.2定义变量
vim /etc/ansible/roles/mysql/vars/main.yml
pkg:
- mariadb
- mariadb-server
svc: mariadb
3.4.4编写php模块
3.4.4.1编写yml文件
vim /etc/ansible/roles/php/tasks/main.yml
- name: install php
yum: name={{pkg}} state=latest
- name: start php-fpm
service: enabled=true name={{svc}} state=started
3.4.4.2定义变量
vim /etc/ansible/roles/php/vars/main.yml
pkg:
- php
- php-fpm
svc: php-fpm
3.4.5编写roles示例并启动
vim /etc/ansible/site.yml
---
- hosts: all
remote_user: root
roles:
- httpd
- mysql
- php
cd /etc/ansible
ansible-playbook site.yml
3.4.6验证查看服务状态
查看apache状态(httpd)
查看数据库状态
查看php服务状态
四、使用Playbook编译安装nginx
准备nginx安装包与安装脚本文件
[root@zz1 opt]#ls
nginx-1.18.0.tar.gz nginx.sh
[root@zz1 opt]#chmod +x nginx.sh
#给脚本文件添加执行权限
查看脚本内容
#/bin/bash
systemctl start nginx >>/dev/null
if [ $? -eq 0 ];then
echo "nginx服务已安装"
else
useradd -M -s /sbin/nologin nginx
cd /opt
wget http://nginx.org/download/nginx-1.18.0.tar.gz >>/dev/null
echo "正在安装,请耐心等待"
tar xf nginx-1.18.0.tar.gz
cd /opt/nginx-1.18.0
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel &>>/dev/null
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
make -j `lscpu|sed -n '4p'|awk '{print $2}'`&>>/dev/null
make install &>>/dev/null
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
cat > /usr/lib/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -1 $MAINPID
ExecStop=/bin/kill -3 $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
chown -R nginx.nginx /usr/local/nginx
systemctl daemon-reload &>>/dev/null
systemctl enable --now nginx
echo "nginx服务已开启"
fi
编写playbook脚本
unarchive模块可以把安装包拷贝到远程主机,并在拷贝过程中自动解压
---
- name: install nginx
hosts: all
remote_user: root
tasks:
- name: firewalld stop
service: name=firewalld state=stopped
- name: package
unarchive: copy=yes src=/opt/nginx-1.18.0.tar.gz dest=/opt owner=root group=root
- name: Execute script
script: /opt/nginx.sh
nginx服务安装好了,查看nginx服务状态
开启nginx服务
总结
定义变量
ansible-playbook 一种定义的任务方式,在编写 playbook 时可以使用变量来传数据。
playbook引用变量指的是再playbook中使用变量代理静态常量值,来实现动态的配置过程 通过引用变量 可以使 playbook跟具有灵活性和课重复性
when
用来进行条件判断的关键字 ,其作用只在你指定条件下会执行下面的任务,当条件为真时,任务就会被执行,否则任务将被跳过
迭代
通常指持续地对ansible playbook进行修改、更改 和改进的过程
template
是一种创建配置文件的工具 在配置文件中,会有一些数据动态地改变,如IP地址 主机名 端口用户 页面路径等 需要使用变量来表示
template 模块 就是将 变量和动态文件 结合起来 最终生成一个配置文件(你需要动态改变)
文件配置 使用jinjia2 模版语言来去编写 结尾()一定是 j2(xxx.j2)
tags
是一种标记任务或 一系列的任务的功能,通过任务或一个命名的任务列表上定义标记可以在运行playbook时去选择你需要执行的任务或者列表