RH358配置Web服务器–自动化执行 Web 服务器配置
使用Ansible部署httpd和nginx并配置https。比实用的章节。
RH358专栏地址:https://blog.csdn.net/qq_41765918/category_11532281.html
1. 自动化Web服务器配置
-
确保在web服务器上安装了httpd或nginx包和任何其他需要的支持包。如果你的剧本可能会更新正在运行的系统上的软件,通知处理器重新启动web服务器软件。
-
将每个虚拟主机的web内容部署到web服务器上。确保它具有正确的权限和SELinux上下文。
-
确保您的web服务器的配置文件是正确的配置和安装。如果配置发生变化,请使用处理程序重新加载web服务器。
-
确保您的TLS配置是正确的,并且服务器证书和匹配的私钥是安全配置和安装的。如果配置改变,使用一个处理程序来重新加载web服务器。
-
使用Ansible service模块启用和启动服务。
-
使用Ansible firewalld模块配置防火墙规则。
2. 安装Web服务软件包
使用yum Ansible模块安装web服务包httpd或nginx。
- name: Web server software is installed
yum:
name: httpd
state: present
3. 部署Web内容
-
可通过多种方式使用 Ansible 部署网站的内容
-
可使用 copy 或 template 模块来部署单个文件和目录
-
可使用 synchronize 模块将目录同步到 web 服务器。比如copy模块更高效且更具可扩展性
-
可使用 git 模块克隆站点
- name: Make sure web site content is present
git:
repo: 'https://git.example.com/website/webcontent.git'
dest: /srv/website
version: production
在前面的例子中,版本指令可以是一个分支名称或标记名称,以及其他选项。
配置 DocumentRoot 目录的权限
-
许多你用来部署网页内容的模块也可以同时设置文件所有权和权限。例如可以使用file模块来确保web内容的权限是正确的。
-
需要确保SELinux标签是正确的。最好确保web服务器上的SELinux策略已经更新,以便文档根目录中的文件的默认类型是httpd_sys_content_t或运行在httpd_t域中的web服务器进程可以读取的其他类型
- name: SELinux policy is correct for web site location
sefcontext:
target: '/srv/website(/.*)?'
setype: httpd_sys_content_t
state: present
当SELinux默认策略正确时,可以使用file模块setype设置为_default并递归运行,与 restorecon -R 等效的操作:
- name: Correct file permissions and SELinux context on web content
file:
path: /srv/website
state: directory
recurse: yes
follow: no
owner: root
group: root
mode: 'a=rX'
setype: _default
4. 部署服务器证书和密钥
可使用Ansible 生成证书和私钥,并使用 copy 模块将它们部署到正确的位置。
记得在TLS证书更改时通知处理程序重新启动web服务器,以便更改生效。对于Nginx,重新加载就足够了,但是Apache HTTP Server需要完全重启。
- name: Server and CA certificates are in place
copy:
src: "{
{ item }}"
dest: /etc/pki/tls/certs
loop:
- website.crt
- example-ca.crt
notify: restart server
- name: Server TLS private key is in place
copy:
src: website.key
dest: /etc/pki/tls/private
mode: '0600'
notify: restart server
5. 部署配置文件
如果需要在每个主机上定制配置文件,那么部署配置文件的最佳方法是使用jinj2模板。这很强大,因为可以通过使用具有不同变量值的相同模板为不同的虚拟主机部署多个文件。
如果这个任务改变了web服务器上的配置文件,记得通知处理程序重新加载服务。
- name: Deploy Apache virtual host configuration
template:
src: "website.conf.j2"
dest: "/etc/httpd/conf.d/website.conf"
notify: reload server
6. 配置防火墙规则
通过firewalld模块打开http和https服务的防火墙端口。
- name: Firewall ports are open
firewalld:
service: "{
{ item }}"
permanent: yes
immediate: yes
state: enabled
loop:
- https
- http
7. 确保Web服务器正在运行
service模块用于启用和启动web服务。
- name: Web server is enabled and started
service:
name: httpd
state: started
enabled: yes
8. 准备处理程序
不要忘记在play中包含一个handlers部分,以便根据任务的需要重新加载或重启服务器。
9. 课本练习
[student@workstation ~]$ lab web-automation start
1. 熟悉项目情况。
[student@workstation ~]$ cd /home/student/web-automation
[student@workstation web-automation]$ tree
.
├── ansible.cfg
├── deploy_content.yml
├── files
│ ├── cacert.pem
│ ├── example-ca.crt
│ ├── servera.lab.example.com.crt
│ ├── servera.lab.example.com.key
│ ├── serverb.lab.example.com.crt
│ └── serverb.lab.example.com.key
├── group_vars
│ ├── all
│ │ └── default.yml
│ ├── httpd
│ │ └── vars.yml
│ └── nginx
│ └── vars.yml
├── httpd.yml
├── inventory
├── nginx.yml
├── site.yml
├── solutions
│ ├── disable_all_webservers.yml
│ ├── httpd.yml
│ └── nginx.yml
└── templates
├── httpd.conf.j2
├── index.html.j2
└── nginx.conf.j2
7 directories, 21 files
[student@workstation web-automation]$ cat inventory
[webservers]
servera.lab.example.com
serverb.lab.example.com
[httpd]
servera.lab.example.com
[nginx]
serverb.lab.example.com
[student@workstation web-automation]$ cat group_vars/all/default.yml
---
httpd_packages:
- httpd
- mod_ssl
nginx_packages:
- '@nginx:1.16'
cacert_file: "example-ca.crt"
[student@workstation web-automation]$ cat group_vars/httpd/vars.yml
web_hosts:
- "servera.lab.example.com"
[student@workstation web-automation]$ cat group_vars/nginx/vars.yml
web_hosts:
- "serverb.lab.example.com"
[student@workstation web-automation]$ cat site.yml
- import_playbook: httpd.yml
- import_playbook: nginx.yml
[student@workstation web-automation]$ cat deploy_content.yml
- name: Document root exists for web sites
# 通过遍历从group_vars加载的服务器,使用file模块创建每个根目录。
file:
path: "/srv/www/{
{ item }}"
state: directory
owner: root
mode: '0755'
loop: "{
{ web_hosts }}"
- name: Index test pages are correct
# 使用模板模块复制index.html.j2文件。
template:
src: "index.html.j2"
dest: "/srv/www/{
{ item }}/index.html"
loop: "{
{ web_hosts }}"
- name: SELinux policy is correct for web site location
# 使用sefcontext模块设置SELinux策略,用httpd_sys_content_t类型标记文档根目录,这样web服务器就可以读取这些文件。
sefcontext:
target: '/srv/www(/.*)?'
setype: httpd_sys_content_t
state: present
- name: Correct SELinux file context is on web content
# 使用file模块重新标记文件。当setype设置为_default时,将使用策略的默认上下文(前一个任务确保是正确的)。
file:
path: /srv/www
state: directory
recurse: yes
follow: no
setype: _default
- name: Virtual host TLS certs in place
# 使用copy模块将证书和私钥复制到受管理的主机。
copy:
src: "{
{ item }}.crt"
dest: "/etc/pki/tls/certs"
loop: "{
{ web_hosts }}"
- name: Virtual host TLS private keys in place
copy:
src: "{
{ item }}.key"
dest: "/etc/pki/tls/private"
mode: '0600'
owner: root
group: root
loop: "{
{ web_hosts }}"
- name: example.com CA cert in place
copy:
src: "{
{ cacert_file }}"
dest: "/etc/pki/tls/certs/{
{ cacert_file }}"
2. 创建httpd.yml剧本。
[student@workstation web-automation]$ cat httpd.yml
---
- name: Apache HTTP Server web server deployment
hosts: httpd
become: true
tasks:
- name: Latest software installed for Apache HTTPD
yum:
name: "{
{ httpd_packages }}"
state: present
- name: Web content is in place
import_tasks: deploy_content.yml
- name: Virtual hosts are configured
template:
src: "httpd.conf.j2"
dest: "/etc/httpd/conf.d/{
{ item }}.conf"
loop: "{
{ web_hosts }}"
- name: Firewall ports are open
firewalld:
service: "{
{ item }}"
permanent: yes
immediate: yes
state: enabled
loop:
- https
- http
- name: Web server is started and enabled
service:
name: httpd
state: started
enabled: yes
3. 创建nginx.yml剧本。
[student@workstation web-automation]$ cat nginx.yml
---
- name: Nginx web server deployment
hosts: nginx
become: true
tasks:
- name: Latest software installed for nginx
yum:
name: "{
{ nginx_packages }}"
state: present
- name: Web content is in place
import_tasks: deploy_content.yml
- name: Set up nginx serverblock
template:
src: "nginx.conf.j2"
dest: "/etc/nginx/conf.d/{
{ item }}.conf"
loop: "{
{ web_hosts }}"
- name: Firewall ports are open
firewalld:
service: "{
{ item }}"
permanent: yes
immediate: yes
state: enabled
loop:
- https
- http
- name: Nginx is enabled and started
service:
name: nginx
state: started
enabled: yes
4. 语法检查并运行剧本。
[student@workstation web-automation]$ ansible-playbook site.yml
5. 测试访问
完成实验
[student@workstation ~]$ lab web-automation finish
总结
- 介绍如何使用Ansible部署httpd和nginx。
- 演示如何配置主页目录并设置HTTPS。
- 若喜欢金鱼哥的文章,顺手点个赞。也可点个关注,因为后续会不断上干货。