Ansible初学笔记(CentOS7安装 #1)
Ansible 简易备忘录(CentOS7设置 #1)
首先
在接触到Ansible之前,我有些落后于时代的潮流。我试着研究并创建了一个用于进行CentOS 7的初始设置的工具,现在我想记录下其内容。
如果有了解的人,能給予評論等,我會很高興。
Ansible是什么?
我理解为使用SSH在远程服务器上执行命令的自动化工具。它与Chef和Puppet等类似,但最好的地方是它无需代理。
因为不需要在目标主机上安装代理或软件包,所以不会破坏环境。
而且由于通过 SSH 连接,我觉得人们手动设置服务器和这种方式很接近,感觉直观上更易理解。
就流程而言
-
- Ansible サーバを立てる
-
- 構築対象サーバと ssh 疎通させる
-
- 構築内容を Ansible サーバ上に設定ファイルとして作成する
-
- 設定ファイルの内容を Ansible サーバ上で実行する
- Ansible が 構築対象サーバへ ssh 接続を繰り返し設定ファイルの内容の操作を順次行う
听起来有这种感觉。
搭建Ansible服务器
除了構建目標的伺服器,我們將建立一個CentOS 7的伺服器,並在那裡安裝Ansible。
實際上,我們打算將其配置在類似跳板伺服器的位置,
但在這次,我們將在個人電腦的虛擬環境中安裝CentOS 7,然後在那裡進行構建。
[Ansible服务器环境]
OS : CentOS Linux release 7.3.1611 (Core)
(SELinux, Firewalld はとりあえず停止・無効化)
由于epel存储库中存在ansible,因此我们需要添加epel存储库并使用yum进行安装。
[安装 epel]
yum install epel-release
sed -i "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo
Ansible 安装
yum install ansible --enablerepo=epel
ansible --version
- - - - -
ansible 2.2.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
- - - - -
我进来了。
建立与目标服务器的 SSH 通信连接
使用 SSH 与构建目标服务器进行通信。
这次让我们确保在服务器之间 root 用户可以通过密钥认证通过 SSH 访问。
首先要准备目标构建服务器。
本次以在ESXi上安装的”CentOS-7-x86_64-DVD-1503-01.iso”镜像为例,构建CentOS7服务器。
[目标构建服务器环境]
OS : CentOS7
IP : 10.210.104.24
DNS : 8.8.8.8
使用Ansible服务器生成SSH密钥,并将密钥集发送到目标服务器,以便能够通过SSH无密码方式进行连接。
ssh-keygen
mv /root/.ssh/{id_rsa.pub,authorized_keys}
scp -r /root/.ssh root@10.210.104.24:/root/
※ 纏めて scp した後 id_rsa は構築対象サーバから削除しておきます。
现在,我们可以通过Ansible服务器连接到目标构建服务器了。
在Ansible服务器上创建配置文件作为构建内容 (关于创建的配置文件)
现在我们将在Ansible服务器上创建配置文件。
首先,我想大致确认需要哪些文件。
安装完后的目录如下所示。
[目录结构]
/etc/ansible/
|------ ansible.cfg ## Ansible 自体の設定ファイル
|------ hosts ## Ansible で管理するリモートホストの一覧
'------ roles/ ## Ansible に実行させる yaml 形式の設定ファイル置き場(インストール直後は空)
我們從這裡開始,最終的目標是按照以下方式創建文件。
/etc/ansible/
|------ ansible.cfg
|------ hosts_org ## デフォルトのものは保持しておく
|------ hosts
'------ roles/
|------ files/ ## 構築対象のリモートホストに配置したいファイルを置く場所
| |------ chrony.conf
| |------ ifcfg-eth0
| '------ syslog
|------ handlers/ ## 構築中特定の状態になった時に呼び出される処理の設定ファイル
| |------ reboot_os.yaml
| |------ reload_chrony_config.yaml
| |------ reload_postfix_config.yaml
| |------ reload_chrony_config.yaml
| |------ reload_rsyslog_config.yaml
| '------ reload_sshd_config.yaml
|------ setup_CentOS7.yaml ## 実行する設定ファイル (playbook) の大本となるファイル
'------ tasks/ ## 実行する処理を大本のファイルから切り出したもの
|------ disable_unnecessary_daemons.yaml
|------ enable_necessary_daemons.yaml
|------ disable_ipv6.yaml
|------ disable_selinux.yaml
|------ install_and_setup_chrony.yaml
|------ install_and_setup_epel.yaml
|------ install_utill_packages.yaml
|------ setup_eth0_interface.yaml
|------ setup_kdump.yaml
|------ setup_logrotate.yaml
|------ setup_postfix.yaml
|------ setup_rsyslog.yaml
|------ setup_sshd.yaml
'------ setup_unix_users.yaml
在Ansible服务器上创建配置文件作为构建内容(稍微绕了一下路)。
首先,我想编写一个设置文件,以便在Ansible服务器上进行配置更改,并确认文件格式和执行流程。(不仅可以对远程主机进行配置更改,还可以对Ansible服务器本身进行配置更改。虽然与 “ssh root@localhost” 相同。)
由于在密钥文件创建阶段,本地主机的 ssh 已设置为无需密码,因此我们将从 Ansible 的配置开始。
首先,在 /etc/ansible/hosts 文件中写入要管理的目标主机。(在此例中为本地主机)
## デフォルトのファイルを保持
cp -av /etc/ansible/hosts{,_org}
## デフォルトの記載を消して空にする
:> /etc/ansible/hosts
## 空っぽのファイルに新しく記入( とりあえず "localhost" と書いておけば今回は動きます )
vi /etc/ansible/hosts
-追記 - -
loaclhost
- - - - -
通过ansible命令检查是否可以连接到本地主机。
## ping モジュールを使って、localhost へ疎通確認
ansible -m ping localhost
## SUCCESS と出ればとりあえず OK
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
本地主机已设为管理对象。
接下来我们要创建一个用于设定实际执行操作的配置文件,这个文件被称为 playbook。
它相当于 Chef 中的 cookbook。
在制作文件之前,让我们确定要做什么。
这次,我想在本地主机上完成以下事项。
-
- hostname を “ansible_test001.localdomain” に変更する。
-
- firawalld を 停止し、自動起動も off にする。
- /etc/hosts に ipv6 の設定 “:1” の行があったらその行を削除する。
剧本的格式如下所示。 de .)
为了与刚刚决定的“要做的事情”相匹配,我们会考虑设置的内容。
将主机名更改为”ansible_test001.localdomain”。
使用”hostname”模块来设置服务器的主机名,将要设置的”ansible_test001.localdomain”传递给”name”参数。另外,将任务命名为”更改主机名”。
- name: Change hostname
hostname: name=ansible_test001.localdomain
停止firawalld并将自动启动设置为关闭。
请使用名为 “servicec” 的模块来控制服务器的服务,
将要控制的服务名 “firewalld” 作为 “name” 参数传递,
希望服务停止,因此将 “state” 设置为 “stopped”,并且希望在启动时停止,所以将 “enabled” 设置为 “no”。
另外,将任务命名为 “关闭 firewalld 服务”。
- name: Turn off firewalld service
service: name=firewalld state=stopped enabled=no
如果在/etc/hosts文件中存在ipv6的”:1″设置行,将该行注释掉。
在进行修改之前,我想要为文件备份,所以使用”shell”模块并直接执行cp命令。
- name: Keep default /etc/hosts
shell: cp -a /etc/hosts{,_org}
然后,我们将删除该行。
使用文件重写模块”replace”,
将要编辑的文件路径传递给”dest”,将要匹配的正则表达式传递给”regexp”。
匹配的部分将被替换为传递给”replace”的字符串。
- name: CommentOut IPv6 row at /etc/hosts
replace: dest=/etc/hosts regexp='^::1' replace='#::1'
参考:
* 主机名 – 管理主机名。
* 服务 – 管理服务。
* 命令行 – 在节点中执行命令。
* 替换 – 替换所有实例中的特定字符串…
在/etc/ansible/role下创建 playbook,并使用上述内容。
vi /etc/ansible/roles/setup_localhost.yaml
[设置_本地主机.yaml]
---
- hosts: localhost
tasks:
- name: Change hostname
hostname: name=ansible_test001.localdomain
- name: Turn off firewalld service
service: name=firewalld state=stopped enabled=no
- name: Keep default /etc/hosts
shell: cp -a /etc/hosts{,_org}
- name: CommentOut IPv6 row at /etc/hosts
replace: dest=/etc/hosts regexp='^::1' replace='#::1'
让我们试着从命令行中运行这个。
ansible-playbook /etc/ansible/roles/setup_localhost.yaml
PLAY [localhost] ***************************************************************
PLAY [localhost] ***************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [Change hostname] *********************************************************
changed: [localhost]
TASK [Turn off firewalld service] **********************************************
ok: [localhost]
TASK [Keep default /etc/hosts] *************************************************
changed: [localhost]
TASK [CommentOut IPv6 row at /etc/hosts] *******************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=5 changed=2 unreachable=0 failed=0
得到了如上所示的结果。设定的处理结果部分是。
TASK [Change hostname] *********************************************************
changed: [localhost]
TASK [Turn off firewalld service] **********************************************
ok: [localhost]
TASK [Keep default /etc/hosts] *************************************************
changed: [localhost]
TASK [CommentOut IPv6 row at /etc/hosts] *******************************************
changed: [localhost]
在中文中,只需要一個選項:
↑是指執行所設定的TASK,並表示在伺服器上進行了變更的“changed:”。
如果設定的TASK已經處於所需的狀態,則會輸出“ok:”。
对于 “Turn off firewalld service” 任务,状态已显示为 “ok:”。
顺便提一下,这台 Ansible 服务器上的 firewalld 已经被停止了。
当你注销并重新进行ssh连接后,可以检查设置内容。
[root@ansible_test001 ~]# hostname
ansible_test001.localdomain
[root@ansible_test001 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@ansible_test001 ~]# systemctl list-unit-files | grep "firewalld"
firewalld.service disabled
[root@ansible_test001 ~]# diff /etc/hosts{,_org}
2c2
<
---
> ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
根据设定,看起来已经进行了更改。
那么,接下来我们将考虑为远程主机准备 playbook。