使用 Ansible 进行安装(Apache 2.4)

我使用Ansible的Playbook来安装Apache 2.4,以下是我记录的备忘录。

这次我们将源文件打包为rpm文件然后进行安装。

环境

    • CentOS 6.7

 

    ansible 2.0

※为了开发环境的利用,事先已经禁用了iptables / SELinux。
※使用yum安装了 “Developer tools” 组,并适时引入所需命令。

角色的初始化。

因为是第一次使用 Role,所以从基本的角度开始。
首先,创建一个 Role 的模板。

# 適当なフォルダを作成し、移動しておきます。
# Role 用ディレクトリを作成
$ mkdir roles
$ cd roles
# 共通用の Role を作成(必須ではありません)
$ ansible-galaxy init common
# apache 2.4 用 Role を作成
$ ansible-galaxy init web
# 構成内容確認
$ cd ..
# tree コマンドは別途インストールしてください(標準ではありません)。
$ tree
.
└── roles
    ├── web
    │   ├── defaults
    │   │   └── main.yml
    │   ├── files
    │   ├── handlers
    │   │   └── main.yml
    │   ├── meta
    │   │   └── main.yml
    │   ├── README.md
    │   ├── tasks
    │   │   └── main.yml
    │   ├── templates
    │   ├── tests
    │   │   ├── inventory
    │   │   └── test.yml
    │   ├── vars
    │   │   └── main.yml
    └── common
        ├── (以下、web と同一構成)

为了执行目标服务器的配置文件,我们将创建一个设置文件。
这次我们将安装在本地服务器上,所以将设置为localhost。

[webservers]
localhost

创建用于安装执行的 Playbook。

---

- name: apply common configuration to all nodes
  hosts: all
  remote_user: root

  roles:
    - common

- name: install and configure the web
  hosts: webservers
  remote_user: root

  roles:
    - web

细节任务将在职位内的个别文件中执行。

构成如下。

.
├── hosts
├── roles
│   ├── web
│   └── common
└── webservers.yml

我们试着执行一下。

$ ansible-playbook -i hosts webservers.yml
PLAY [apply common configuration to all nodes] *********************************

TASK [setup] *******************************************************************
ok: [localhost]

PLAY [install and configure the web] *******************************************

TASK [setup] *******************************************************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0

我已确认正常运行。

任务描述

接下来,我们将编写用于安装 Apache 2.4 的代码。

构成如下所示。

.
├── group_vars
│   └── webservers                    # 各タスクで使用する変数定義
├── hosts
├── roles
│   ├── web
│   │   ├── handlers
│   │   │   └── main.yml              # httpd handler の定義
│   │   └── tasks
│   │       ├── main.yml              # 各インストール yaml の呼び出し
│   │       ├── install_apr.yml       # apr-devel インストール
│   │       ├── install_apr_util.yml  # apr-util-devel インストール
│   │       ├── install_distcache.yml # distcache インストール
│   │       └── install_httpd_2_4.yml # httpd インストール
│   └── common
└── webservers.yml

除了构建和安装httpd之外,还需要构建和安装其他必要的库。

组变量/网络服务器

我正在定义在每个任务中使用的变量。
请参考注释中的定义内容。

# webservers Variables

apache_2_4:
  # 起動ユーザ
  user_name: apache
  # 起動グループ
  group_name: apache
  # ソースファイル作業ディレクトリ
  work_dir: /usr/local/src
  # RPM ファイルビルド先ディレクトリ
  rpmbuild_dir: /root/rpmbuild
  # ソースファイルダウンロード URL
  url: http://ftp.tsukuba.wide.ad.jp/software/apache//httpd/httpd-2.4.18.tar.bz2
  # ソースファイル名
  src_filename: httpd-2.4.18.tar.bz2
  # RPM ファイル名
  rpm_filenames:
    - httpd-2.4.18-1.x86_64.rpm
    - httpd-tools-2.4.18-1.x86_64.rpm
    - mod_ssl-2.4.18-1.x86_64.rpm
  # RPM ファイル配置ディレクトリ
  rpm_directory: /usr/local/src/httpd
  # 設定ファイルパス
  conf_file: /etc/httpd/conf/httpd.conf

apr:
  # ソースファイルダウンロード URL
  url: http://archive.apache.org/dist/apr/apr-1.5.2.tar.bz2
  # ソースファイル名
  src_filename: apr-1.5.2.tar.bz2
  # RPM ファイル名
  rpm_filenames:
    - apr-1.5.2-1.x86_64.rpm
    - apr-devel-1.5.2-1.x86_64.rpm
  # RPM ファイル配置ディレクトリ
  rpm_directory: /usr/local/src/apr

apr_util:
  # ソースファイルダウンロード URL
  url: http://archive.apache.org/dist/apr/apr-util-1.5.2.tar.bz2
  # ソースファイル名
  src_filename: apr-util-1.5.2.tar.bz2
  # RPM ファイル名
  rpm_filenames:
    - apr-util-1.5.2-1.x86_64.rpm
    - apr-util-devel-1.5.2-1.x86_64.rpm
  # RPM ファイル配置ディレクトリ
  rpm_directory: /usr/local/src/apr-util

distcache:
  # ソースファイルダウンロード URL
  url: https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/18/Everything/source/SRPMS/d/distcache-1.4.5-23.src.rpm
  # ソースファイル名
  src_filename: distcache-1.4.5-23.src.rpm
  # RPM ファイル名
  rpm_filenames:
    - distcache-1.4.5-23.x86_64.rpm
    - distcache-devel-1.4.5-23.x86_64.rpm
  # RPM ファイル配置ディレクトリ
  rpm_directory: /usr/local/src/distcache

任务/主要.yml

在 main.yml 文件中,我们进行了每个任务的加载。
每个文件都记录了任务的详细信息。

---
- include: install_apr.yml
- include: install_apr_util.yml
- include: install_distcache.yml
- include: install_httpd_2_4.yml

安装_apr.yml / 安装_apr-util

apr/apr-util是构建httpd所必需的库。
通常情况下,我们会从源代码进行构建。

・下载源文件
・解压缩
・配置/编译/安装

在这种情况下,我们将 make 的部分替换为适用于 rpm 包处理的方法。

---
# build and install apr-devel

- name: apr のソースファイルをダウンロード
  get_url:
    url: "{{ apr.url }}"
    dest: "{{ apache_2_4.work_dir }}"

- name: apr のパッケージ化(rpm)
  shell: "rpmbuild -ta --clean {{ apr.src_filename }}"
  args:
    chdir: "{{ apache_2_4.work_dir }}"
    creates: "{{ apr.rpm_directory }}/{{ apr.rpm_filenames.1 }}"

- name: apr パッケージ配置用ディレクトリ作成
  file:
    path: "{{ apr.rpm_directory }}"
    state: directory
    owner: root
    group: root
    mode: 0755

- name: apr のパッケージ配置
  shell: "find {{ apache_2_4.rpmbuild_dir }} -name '*.rpm' | xargs -i mv {} ."
  args:
    chdir: "{{ apr.rpm_directory }}"
    creates: "{{ apr.rpm_directory }}/{{ apr.rpm_filenames.1 }}"

- name: apr-devel のインストール
  yum:
    name: "{{ apr.rpm_directory }}/{{ item }}"
    state: present
  with_items: "{{ apr.rpm_filenames }}"
---
# build and install apr-util-devel

- name: apr-util のビルドに必要なパッケージのインストール
  yum:
    name: "{{ item }}"
    state: present
  with_items:
    - expat-devel
    - db4-devel
    - postgresql-devel
    - mysql-devel
    - sqlite-devel
    - unixODBC-devel
    - nss-devel
    - epel-release
    - libuuid-devel
    - openldap-devel

- name: apr-util のビルドに必要なパッケージのインストール(epel)
  yum:
    name: freetds-devel
    state: present

- name: apr-util のソースファイルをダウンロード
  get_url:
    url: "{{ apr_util.url }}"
    dest: "{{ apache_2_4.work_dir}}"

- name: apr-util のパッケージ化(rpm)
  shell: "rpmbuild -ta --clean {{ apr_util.src_filename}}"
  args:
    chdir: "{{ apache_2_4.work_dir}}"
    creates: "{{ apr_util.rpm_directory }}/{{ apr_util.rpm_filenames.1 }}"

- name: apr-util パッケージ配置用ディレクトリ作成
  file:
    path: "{{ apr_util.rpm_directory }}"
    state: directory
    owner: root
    group: root
    mode: 0755

- name: apr-util のパッケージ配置
  shell: "find {{ apache_2_4.rpmbuild_dir }} -name '*.rpm' | xargs -i mv {} ."
  args:
    chdir: "{{ apr_util.rpm_directory }}"
    creates: "{{ apr_util.rpm_directory }}/{{ apr_util.rpm_filenames.1 }}"

- name: apr-util-devel のインストール
  yum:
    name: "{{ apr_util.rpm_directory }}/{{ item }}"
    state: present
  with_items: "{{ apr_util.rpm_filenames }}"

安装distcache.yml

以下是安装 distcache 这个必要的库所需的 APR 的步骤。
同样,我们也将从源码创建一个适用于 RPM 的文件。

---
# build and install distcache-devel

- name: distcache のソースファイルをダウンロード
  get_url:
    url: "{{ distcache.url }}"
    dest: "{{ apache_2_4.work_dir}}"

- name: distcache のパッケージ化(rpm)
  shell: "rpmbuild --rebuild {{ distcache.src_filename }}"
  args:
    chdir: "{{ apache_2_4.work_dir}}"
    creates: "{{ distcache.rpm_directory }}/{{ distcache.rpm_filenames.1 }}"

- name: distcache パッケージ配置用ディレクトリ
  file:
    path: "{{ distcache.rpm_directory }}"
    state: directory
    owner: root
    group: root
    mode: 0755

- name: distcache のパッケージ配置
  shell: "find {{ apache_2_4.rpmbuild_dir }} -name '*.rpm' | xargs -i mv {} ."
  args:
    chdir: "{{ distcache.rpm_directory }}"
    creates: "{{ distcache.rpm_directory }}/{{ distcache.rpm_filenames.1 }}"

- name: distcache-devel のインストール
  yum:
    name: "{{ distcache.rpm_directory }}/{{ item }}"
    state: present
  with_items: "{{ distcache.rpm_filenames }}"

安装_httpd_2_4.yml.

在确保所有必要的库都准备好之后,我们来描述安装 Apache 的步骤。

---
# build and install httpd_2.4

- name: httpd ソースファイルのビルドに必要なパッケージのインストール
  yum:
    name: "{{ item }}"
    state: present
  with_items:
    - zlib-devel
    - libselinux-devel
    - pcre-devel
    - lua-devel
    - libxml2-devel
    - openssl-devel

- name: httpd のソースファイルをダウンロード
  get_url:
    url: "{{ apache_2_4.url }}"
    dest: "{{ apache_2_4.work_dir }}"

- name: httpd のパッケージ化(rpm)
  shell: rpmbuild -ta --clean "{{ apache_2_4.src_filename }}"
  args:
    chdir: "{{ apache_2_4.work_dir }}"
    creates: "{{ apache_2_4.rpm_directory }}/{{ apache_2_4.rpm_filenames.0 }}"

- name: httpd パッケージ配置用ディレクトリ
  file:
    path: "{{ apache_2_4.rpm_directory }}"
    state: directory
    owner: root
    group: root
    mode: 0755

- name: httpd のパッケージ配置
  shell: find "{{ apache_2_4.rpmbuild_dir }}" -name '*.rpm' | xargs -i mv {} .
  args:
    chdir: "{{ apache_2_4.rpm_directory }}"
    creates: "{{ apache_2_4.rpm_directory }}/{{ apache_2_4.rpm_filenames.0 }}"

- name: httpd のインストール
  yum:
    name: "{{ apache_2_4.rpm_directory }}/{{ item }}"
    state: present
  with_items: "{{ apache_2_4.rpm_filenames }}"

- name: 起動ユーザ・グループ設定
  lineinfile:
    dest: "{{ apache_2_4.conf_file}}"
    backrefs: yes
    regexp: '{{ item.regexp}}'
    line: '{{ item.line }}'
  with_items:
    - regexp: "^User.*"
      line: "User {{ apache_2_4.user_name}}"
    - regexp: "^Group.*"
      line: "Group {{ apache_2_4.group_name}}"
  notify: restart httpd

- name: httpd のサービス起動・自動起動設定
  service:
    name: httpd
    state: started
    enabled: yes

处理程序/主要.yml

将 httpd 的重启操作在 handler 中进行记录,该操作会在最后修改配置文件之后执行。

---
# handlers file for web
- name: restart httpd
  service:
    name: httpd
    state: restarted

以上是任务的描述。

执行Playbook

让我们执行所制作的Playbook。

$ ansible-playbook -i hosts webservers.yml
・・・
PLAY RECAP *********************************************************************
localhost                  : ok=32   changed=26   unreachable=0    failed=0
# 確認の為、再実行
$ ansible-playbook -i hosts webservers.yml
・・・
PLAY RECAP *********************************************************************
localhost                  : ok=31   changed=0    unreachable=0    failed=0
# Web アクセス確認
$ curl http://localhost/
<html><body><h1>It works!</h1></body></html>

请问是否能够正常执行?
您可以复制一次创建的RPM文件,并可以通过yum模块的定义来编写Playbook。
此外,您还可以将httpd.conf的副本放置在templates中进行编辑,并通过vars定义每个环境的变量,从而可以根据不同环境来管理配置文件。

尽管有许多人转向使用nginx,但我们只安装了基本的Apache服务器。

bannerAds