使用Ansible开始配置管理工具 Part2

使用 Ansible 进行配置管理工具_Part2

我已经在之前的文章中描述了Ansible发布的最佳实践配置,但现在我进行了详细的调查和验证,以确定应该在哪个文件中写入具体内容。

1.1. Ansible的目录结构

/etc/ansible/
  ├inventories/
  │  ├production/
  │  │  ├hosts                    # 本番環境サーバ用のインベントリファイル
  │  │  ├group_vars/
  │  │  │  ├all.yml
  │  │  │  ├webservers.yml        # 特定のグループに変数を割り当て
  │  │  │  ├dbservers.yml 
  │  │  │  └apservers.yml
  │  │  └host_vars/
  │  │      ├webservers.yml       # 特定のシステムに変数を割り当てます
  │  │      ├dbservers.yml
  │  │      └apservers.yml
  │  ├local/
  │  │  ├hosts                    # ansibleサーバ用のインベントリファイル
  │  │  ├group_vars/
  │  │  │ └local.yml 
  │  │  └host_vars/
  │  │      └local.yml 
  │  └staging/
  │      ├hosts                   # 開発環境サーバ用のインベントリファイル
  │      ├group_vars/
  │      │  ├all.yml
  │      │  ├webservers.yml       # グループに変数を割り当て
  │      │  ├dbservers.yml 
  │      │  └apservers.yml
  │      └host_vars/
  │          ├webservers.yml      # システムに変数を割り当てます
  │          ├dbservers.yml 
  │          └apservers.yml
  ├library/                       # カスタムモジュールを置きます。
  ├module_utils/                  # module_utilsを置きます。
  ├filter_plugins/                # カスタムフィルタプラグインを配置します。
  │
  ├site.yml                       # master playbook
  ├webservers.yml                 # playbook for webserver tier
  ├dbservers.yml                  # playbook for dbserver tier
  ├apservers.yml                  # playbook for apserver tier
  │
  └roles/
      ├common/                 # この階層は「役割」を表します
      │  ├tasks/
      │  │  └main.yml
      │  ├handlers/
      │  │  └main.yml
      │  ├templates/
      │  │  └ntp.conf.j2
      │  ├files/
      │  │  └source files     # コピーリソースで使用するファイル
      │  │  └script files     # スクリプトリソースで使用するスクリプトファイル
      │  ├vars/
      │  │  └main.yml         # このロールに関連する変数
      │  ├defaults/
      │  │  └main.yml         # このロールのデフォルトの優先順位の低い変数
      │  ├meta/
      │  │  └main.yml         # ロール依存関係
      │  ├library/            # カスタムモジュールも含めることができます
      │  ├module_utils/       # カスタムmodule_utilsも含めることができます
      │  └lookup_plugins/     # 検索のように、または他の種類のプラグイン
      ├webtier/               # 「common」と同じ構造
      ├dbtier/                # 「common」と同じ構造
      ├aptier/                # 「common」と同じ構造
      └monitoring/            # 「common」と同じ構造

首先,创建一个目录。
您也可以参考使用playbook创建目录结构的方法,就像下面的URL一样。
“我想要一击创建Ansible最佳实践的目录结构模板”。

Ansible_Dir=/etc/ansible
mkdir -m 755 $Ansible_Dir/inventories
mkdir -m 755 $Ansible_Dir/inventories/production/
mkdir -m 755 $Ansible_Dir/inventories/production/group_vars/
mkdir -m 755 $Ansible_Dir/inventories/production/host_vars/
mkdir -m 755 $Ansible_Dir/inventories/staging/
mkdir -m 755 $Ansible_Dir/inventories/staging/group_vars/
mkdir -m 755 $Ansible_Dir/inventories/staging/host_vars/
mkdir -m 755 $Ansible_Dir/library
mkdir -m 755 $Ansible_Dir/module_utils
mkdir -m 755 $Ansible_Dir/filter_plugins
mkdir -m 755 $Ansible_Dir/roles
mkdir -m 755 $Ansible_Dir/roles/common
mkdir -m 755 $Ansible_Dir/roles/common/tasks
mkdir -m 755 $Ansible_Dir/roles/common/handlers
mkdir -m 755 $Ansible_Dir/roles/common/templates
mkdir -m 755 $Ansible_Dir/roles/common/files
mkdir -m 755 $Ansible_Dir/roles/common/vars
mkdir -m 755 $Ansible_Dir/roles/common/defaults
mkdir -m 755 $Ansible_Dir/roles/common/meta
mkdir -m 755 $Ansible_Dir/roles/common/library
mkdir -m 755 $Ansible_Dir/roles/common/module_utils
mkdir -m 755 $Ansible_Dir/roles/common/lookup_plugins
mkdir -m 755 $Ansible_Dir/roles/webtier
mkdir -m 755 $Ansible_Dir/roles/webtier/tasks
mkdir -m 755 $Ansible_Dir/roles/webtier/handlers
mkdir -m 755 $Ansible_Dir/roles/webtier/templates
mkdir -m 755 $Ansible_Dir/roles/webtier/files
mkdir -m 755 $Ansible_Dir/roles/webtier/vars
mkdir -m 755 $Ansible_Dir/roles/webtier/defaults
mkdir -m 755 $Ansible_Dir/roles/webtier/meta
mkdir -m 755 $Ansible_Dir/roles/webtier/library
mkdir -m 755 $Ansible_Dir/roles/webtier/module_utils
mkdir -m 755 $Ansible_Dir/roles/webtier/lookup_plugins
mkdir -m 755 $Ansible_Dir/roles/dbtier/
mkdir -m 755 $Ansible_Dir/roles/dbtier/tasks
mkdir -m 755 $Ansible_Dir/roles/dbtier/handlers
mkdir -m 755 $Ansible_Dir/roles/dbtier/templates
mkdir -m 755 $Ansible_Dir/roles/dbtier/files
mkdir -m 755 $Ansible_Dir/roles/dbtier/vars
mkdir -m 755 $Ansible_Dir/roles/dbtier/defaults
mkdir -m 755 $Ansible_Dir/roles/dbtier/meta
mkdir -m 755 $Ansible_Dir/roles/dbtier/library
mkdir -m 755 $Ansible_Dir/roles/dbtier/module_utils
mkdir -m 755 $Ansible_Dir/roles/dbtier/lookup_plugins
mkdir -m 755 $Ansible_Dir/roles/aptier/
mkdir -m 755 $Ansible_Dir/roles/aptier/tasks
mkdir -m 755 $Ansible_Dir/roles/aptier/handlers
mkdir -m 755 $Ansible_Dir/roles/aptier/templates
mkdir -m 755 $Ansible_Dir/roles/aptier/files
mkdir -m 755 $Ansible_Dir/roles/aptier/vars
mkdir -m 755 $Ansible_Dir/roles/aptier/defaults
mkdir -m 755 $Ansible_Dir/roles/aptier/meta
mkdir -m 755 $Ansible_Dir/roles/aptier/library
mkdir -m 755 $Ansible_Dir/roles/aptier/module_utils
mkdir -m 755 $Ansible_Dir/roles/aptier/lookup_plugins

Ansible的配置文件被设置在【/etc/ansible/ansible.cfg】中。

关于Ansible的配置值,请参考先前的总结如下。

我试着将ansible.cfg的项目列成清单。

Ansible配置文件(ansible.cfg)的官方手册

首先,如果不取消以下的行的注释,它将无法运行,因为这些行是必不可少的。

retry_files_enabled = False
retry_files_save_path = ~/.ansible-retry

1.3. 庫存設置

在部署环境和演练环境中,根据ansible-playbook命令的-i参数指定不同的Inventory文件来执行,可以将Inventory分开记录,以便将playbook针对不同的环境进行部署。

此外,每个Inventory都根据服务器的不同角色进行分组,以便配置每个角色的playbook进行执行。

【$Ansible 目录/清单/生产环境/主机】

[webservers]
192.168.100.101
192.168.100.102
192.168.100.103
192.168.100.104
[dbservers]
192.168.101.101
192.168.101.102
[apservers]
192.168.102.101
192.168.102.102

【$Ansible_Dir/inventories/staging/hosts】
【$ Ansible_Dir/inventories/staging/hosts】

[webservers]
192.168.200.101
192.168.200.102
192.168.200.103
192.168.200.104
[dbservers]
192.168.201.101
192.168.201.102
[apservers]
192.168.202.101
192.168.202.102

1.4. 主控台手册

在执行ansible-playbook命令时需要指定的就是playbook。

为了尽量简化,我们只将每个服务器角色的YAML文件用作包含。

Ansible_Dir/site.yml 在中文中的意思是”Ansible目录/site.yml”。

---
- import_playbook: webservers.yml
- import_playbook: dbservers.yml
- import_playbook: apservers.yml

1.5. 按照服务器角色的playbook

根据服务器角色创建playbook,并指定要在此文件中执行的服务器组以及要执行的角色。在roles中指定的common是指通用配置以及特定于web服务器的webtier配置。Ansible的角色将包括role目录中指定目录的main.yml(对于common角色来说,是[$Ansible_Dir/roles/common]目录下的main.yml)。

$Ansible_Dir/webservers.yml -> $答案_目录/webservers.yml

---
- hosts: webservers
  roles:
    - common
    - webtier

$任务管理器/数据库服务器.yml

---
- hosts: dbservers
  roles:
    - common
    - dbtier

$Ansible_Dir/apservers.yml 可以被翻译为 “Ansible目录/apservers.yml”。

---
- hosts: apservers
  roles:
    - common
    - aptier

1.6. role下的每个角色

任务

定义在角色(role)中执行的任务(tasks)。由role自动加载main.yml文件,如果想要分离到其他文件,则可以从main.yml中进行include。

另外,如果有多个任务需要执行,我们会定义变量并进行循环执行。

关于变量,请参考下文中的【vars】。

$Ansible_Dir/roles/common/tasks/main.yml 的目录

---
- name: install yum packages
  yum: name={{ item }} state=latest
  notify: Start handler common
  with_items:
   - "{{ common_packages }}"

 - name: users exist
   user: name={{item.name}} state=present password={{item.password}} group={{item.group}} uid={{item.uid}} generate_ssh_key={{item.generate_ssh_key}} home={{item.home}} shell={{item.shell}} create_home={{item.create_home}}
  with_items: 
   - "{{ common_users }}"

- name: ~/.ssh for users exsit
  file: path="/home/{{item.name}}/.ssh" state=directory owner={{item.name}} group={{item.name}} mode=0700
  with_items:
   - "{{ common_users }}"

- name: authorized keys is deployed
  copy: src="authorized_keys_for_{{item.name}}" dest="/home/{{item.name}}/.ssh/authorized_keys" owner={{item.name}} group={{item.name}} mode=0600
  with_items:
   - "{{ common_users }}"

- name: sudo configured
  copy: src="sudoers" dest="/etc/sudoers" owner=root group=root mode=0440

- name: Start the ntp service
  service: name=ntpd state=started enabled=yes
  tags: ntp

- template: src=templates/ntp.conf.j2 dest=/etc/ntp.conf owner=root group=root mode=0644
  notify: restart ntp

$Ansible_Dir/roles/webtier/tasks/main.yml 的位置。

---
- name: install yum packages
  yum: name={{ item }} state=latest
  notify: Start handler webtier
  with_items:
   - "{{ webtier_packages }}"
- name: httpd.conf configured
  copy: src="httpd.conf" dest="/etc/httpd/conf/httpd.conf" owner=root group=root mode=0644

$Ansible_Dir/roles/dbtier/tasks/main.yml 的路径

---
- name: install yum packages
  yum: name={{ item }} state=latest
  notify: Start handler dbtier
  with_items:
 - "{{ dbtier_packages }}"

$Ansible_Dir/roles/aptier/tasks/main.yml 的路径

---
- name: install yum packages
  yum: name={{ item }} state=latest
  notify: Start handler aptier
  with_items:
 - "{{ aptier_packages }}"
- name: tomcat configured
  copy: src="tomcat" dest="/etc/sysconfig/tomcat" owner=root group=root mode=0644

默认设置

在main.yml中定义用于role使用的变量的默认值。

在vars中,可以通过group_vars等覆盖变量。

变量

在main.yml中定义用于角色的变量。一般来说,我们会在此处写入每个环境特定的固定值等。请注意,由于无法在group_vars等中覆盖变量,所以需要小心操作。

$Ansible_Dir/roles/common/vars/main.yml的文件路径

---
common_packages:
  - ntpd
  - ntpdate
  - ncompress
common_users:
  - { name: opeuser,  password: "*****", group: "opegroup", uid: "1001", home: "/home/opeuser", create_home: "yes", shell: "/bin/bash", generate_ssh_key: "yes" }

请使用openssl命令输入经过哈希处理的密码作为密码。
哈希处理方法是使用openssl passwd -l <明文密码>。

$Ansible_Dir/roles/webtier/vars/main.yml 的路径

---
webtier_packages:
  - httpd
  - httpd-tools
  - apr
  - apr-util

$Ansible_Dir/roles/dbtier/vars/main.yml的位置

---
dbtier_packages:
  - postgresql-server
  - postgresql-contrib

$Ansible_Dir/roles/aptier/vars/main.yml 可以被用作 Ansible 目录下 aptier 角色的主要变量文件。

---
aptier_packages:
  - tomcat
  - tomcat-el
  - tomcat-jsp
  - tomcat-lib
  - tomcat-servlet

文件

使用copy模块将文件配置设置。可以是ASCII或二进制格式都可以。

如果设定了上述的任务,则需要准备以下的文件。

httpd.conf
tomcat
authorized_keys_for_***

模板

将使用template模块设置的Jinja2格式的文本文件放置在指定位置。
Jinja2格式的文本文件与files目录下的文件的不同之处在于它可以嵌入变量。这些变量需要在【default】【group_vars】或【vars】中进行配置。

$Ansible_Dir/roles/common/templates/ntp.conf.j2 的路径

driftfile /var/lib/ntp/drift

restrict 127.0.0.1 
restrict -6 ::1

server {{ ntpserver }}

includefile /etc/ntp/crypto/pw

keys /etc/ntp/keys

元数据

通过设置meta可以设置角色之间的依存关系。在使用任务执行多个角色时,通过依存关系来指定应先执行的角色。

操作者

在handlers中,我们定义了在特定条件下触发事件任务(比如重新启动服务)。在另一个角色中,当我们修改了Apache配置文件之后,希望重新启动Apache时,我们可以使用它。在这种情况下,如果我们从另一个角色通知handler执行“重新启动Apache2服务”的操作,那么就会得到期望的行为。

$Ansible_Dir/roles/common/handlers/main.yml可以转述为:
$Ansible_Dir/角色/常规/处理程序/主要.yml

---
- name: restart ntp
  service: name=ntpd state=restarted
  listen:restart ntp

$Ansible_Dir/roles/webtier/handlers/main.yml 的位置。

---
- name: restart httpd
  service: name=httpd state=restarted
  listen:Start handler webtier

$Ansible_Dir/roles/dbtier/handlers/main.yml :将以下内容用中文进行重述,只需提供一种选项:
$Ansible_Dir/roles/dbtier/handlers/main.yml

---
- name: restart postgrad
  service: name=postgrad state=restarted
  listen:Start handler dbtier

$Ansible_Dir/roles/aptier/handlers/main.yml的中文翻译为:$Ansible_Dir/roles/aptier/handlers/main.yml。

---
- name: restart tomcat
  service: name=tomcat state=restarted
  listen:Start handler aptier

变量组

将共通设置变量存储。

$Ansible_Dir/inventories/production/group_vars/all.yml

---
ntpserver: 192.168.1.2

$Ansible_Dir/inventories/staging/group_vars/all.yml 可以被变换为:$Ansible_Dir/库存/暂存/群组变量/全部.yml

---
ntpserver: 192.168.1.2

最后

理想情况下,当在Git上推送到构建用仓库后,Jenkins会构建Ansible服务器,并从Jenkins执行Ansible的playbook,以完成各服务器的配置。

如果可能的话,我希望能够自动化虚拟机配置、操作系统安装和单元测试,但这可以在以后完成。

广告
将在 10 秒后关闭
bannerAds