为了进行现有环境的维护,引入Ansible
最近很流行使用Ansible来实现“基础设施即代码”,很多情况下会介绍与Vagrant结合使用的方式。因此,对于已经搭建好的服务器之类的本地环境可能有些难以想像如何使用的部分。
只要安装了Python2.4以上版本并且能够连接SSH,就可以轻松地管理本地物理服务器和虚拟服务器。
对于不了解「幂数性」和「不可变基础设施」的老一代人来说,我给出一个简单的使用方法。
设定目标和环境
-
- 管理対象サーバが5台くらいから数十台程度ある(大量ではないが、個別作業はキツいかな、という程度)
-
- とりあえず、管理対象サーバのOSは再インストールしたくない
-
- 設定ファイルぐらいなら書いてもいいが、コードは書きたくない
-
- 暇がない or 新しく覚えることが多いのが嫌で、自動化ツールに手を出すことができていない
-
- CentOS系(6・7)を使っている ※CentOS5を管理対象とする場合、管理対象サーバにpython-simplejsonパッケージが必要
- 管理対象サーバへのSSH接続は公開鍵方式にしたい
安装管理服务器
由于在各地都有介绍,因此我会简明地记录。
在虚拟环境中,您可以部署一个新的虚拟服务器。即使只有2GB内存和1核CPU,它也可以运行得非常流畅。
在实际的服务器环境中,可以重新利用旧的个人电脑。也可以将其与其他服务器共存,但若管理服务器遭到入侵,最糟糕的情况是会导致所有受管理的服务器被接管,因此请将其放置在物理和逻辑上安全的地方。
以下的步骤适用于CentOS7和Ansible2.0系列。安装到CentOS6几乎使用相同的步骤。
- EPELリポジトリを追加する
# yum install epel-release
- 関連パッケージをインストールする
# yum install python-jinja2 --enablerepo=epel
# yum install libyaml
- Ansible 2.0をインストールする
# yum install ansible --enablerepo=epel-testing
- 管理対象サーバ接続用のユーザを作成する(「ansible」としておきます)
# adduser ansible
# passwd ansible
- 公開鍵を生成する
# su - ansible
$ mkdir .ssh
$ chmod 700 .ssh
$ ssh-keygen -t rsa (~/.ssh/ に保存)
注册要管理的服务器。
在管理服务器的/etc/hosts文件中预先注册管理目标服务器的IP地址和名称。
# vi /etc/hosts
192.168.0.1 s01web01.XXX.local
192.168.0.2 s01web02.XXX.local
192.168.1.1 s01db01.XXX.local
接下来,我们要向Ansible的清单文件中添加被管理的服务器。最好按照组别进行分类和注册。您也可以将同一台服务器添加到多个组中。
# vi /etc/ansible/hosts
[s01web]
s01web01.XXX.local
s01web02.XXX.local
[s01db]
s01db01.XXX.local
另外,连接账户的信息(用户名、sudo密码、公钥文件位置)应该考虑加密以保护安全,但如果直接写在清单中,每次修改清单都需要意识到加密/解密,稍显麻烦。
在使用ansible-vault edit命令进行编辑时,虽然可以保持加密状态进行编辑,但需要每次输入密码,并且在某些环境下可能无法成功编辑。因此可以考虑将内容写入单独的文件(每个组对应一个变量文件)。
例如,在/etc/ansible目录下,创建一个group_vars目录,并在其中使用与组名相同的文件名来注册连接账户信息。如果创建名为”all”的文件并注册信息,您也可以将共享的连接账户信息注册到所有受管理的服务器(如果创建了与组名不同的文件,则只适用于其他服务器)。
# mkdir /etc/ansible/group_vars
# cd /etc/ansible/group_vars
# vi s01web
ansible_ssh_user: ansible
ansible_become_pass: 【sudoパスワード】
ansible_ssh_private_key_file: ~/.ssh/id_rsa
一旦保存完成后,使用ansible-vault encrypt命令进行加密。
# ansible-vault encrypt s01web
# chown ansible.ansible s01web
连接到管理目标服务器从管理服务器上
有了Ansible,我们想要使用它来执行这些步骤…因为为了创建连接用户而临时在另一个用户下进行SSH连接会有些复杂,所以我们选择注重易懂性而不是美观性,并介绍在每个受管理的服务器上执行的步骤。
- 接続ユーザ(ansible)を登録する
# adduser ansible
# passwd ansible
- sudoできるようにする
您可以使用visudo命令或在/etc/sudoers.d目录中添加文件。
# vi /etc/sudoers.d/ansible
ansible ALL=(ALL) ALL
如果添加了文件,则更改访问权限。
# chmod 440 /etc/sudoers.d/ansible
- 公開鍵方式で接続できるようにする
如果在检查/etc/ssh/sshd_config文件时发现禁用了公钥连接,则需要启用它并重新启动sshd服务。
# vi /etc/ssh/sshd_config
PubkeyAuthentication yes
通过使用以下命令之一:systemctl restart sshd.service (CentOS7)或 service sshd restart (CentOS6),来重新启动系统中的sshd服务。
- 公開鍵を保存する
将管理服务器的公钥(~/.ssh/id_rsa.pub)的内容(文本)保存到受管理服务器上。可以使用scp命令将其传输到受管理服务器上,或者直接复制和粘贴文本到~/.ssh/authorized_keys以进行保存。
# su - ansible
$ mkdir .ssh
$ chmod 700 .ssh
$ vi .ssh/authorized_keys
ssh-rsa 【中略】 ansible@管理サーバのホスト名
更改访问权限。
$ chmod 600 .ssh/authorized_keys
- 接続テストする
我将从管理服务器上使用Ansible命令发送ping到管理目标服务器。
在设置完成后,只有在首次连接时,由于我们还没有将管理目标服务器添加到管理服务器的 ~/.ssh/known_hosts 文件中,因此每次连接到管理目标服务器时都需要输入 “yes”。
$ ansible all -i /etc/ansible/hosts -m ping --ask-vault-pass
请输入加密(Vault)密码。
只要从所有受管理服务器上得到“pong”的回复,设置就完成了。
使用实际维护中的工作
我认为Ansible的本来使用方式是在Playbook中编写步骤并执行。
-
- 単純にrebootする
-
- yumで単一または少数のパッケージだけをupdateする
- 実行中のkernelバージョン、javaバージョンなどを見る
如果程度允许的话,甚至可以不用编写Playbook,直接使用ansible命令来执行。
- 単純にrebootする
ansible all -i /etc/ansible/hosts -b -m shell -a 'reboot' --ask-vault-pass
- yumで単一のパッケージだけをupdateする
ansible all -i /etc/ansible/hosts -b -m yum -a 'name=【パッケージ名】 state=latest' --ask-vault-pass
- サービスを再起動する
ansible all -i /etc/ansible/hosts -b -m yum -a 'name=【サービス名】 state=restarted' --ask-vault-pass
- 実行中のkernelバージョンを確認する
ansible all -i /etc/ansible/hosts -m shell -a 'uname -a' --ask-vault-pass
- 実行中のjavaバージョンを確認する(グループ「s01web」限定)
ansible s01web -i /etc/ansible/hosts -m shell -a 'java -version' --ask-vault-pass
如果你想尝试一些稍微复杂的事情,可以参考一些文献,然后试着创建一个Playbook。
文献引用
服务器/基础架构工程师要求手册:DevOps版【书籍】
使用Ansible在Linux中创建用户并设置密钥认证
在将Ansible从Centos6升级至2时出现错误:“ERROR!意外异常:’AnsibleLoader’对象没有属性’dispose’”
[Ansible] 命令速查表