使用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,以完成各服务器的配置。
如果可能的话,我希望能够自动化虚拟机配置、操作系统安装和单元测试,但这可以在以后完成。