使用Ansible来构建Ruby环境
首先
这是一个关于使用Ansible搭建Ruby环境的实操指南、资料或笔记。
本文适用于有以下经验的人:
– 曾搭建过Ruby环境
– 曾接触过Ansible
准备事前的环境条件
vagrantとvirtualboxをインストール
$ brew cask install vagrant
$ brew cask install virtualbox
环境
-
- OS X Sierra 10.12.6
-
- Vagrant 2.1.2(ansible 2.6.2)
- VirtualBox 5.2.14
Vagrant配置
创建并移动工作目录。
$ mkdir ansible-ruby; cd $_
Vagrant的初始配置
$ vagrant init mvbcoding/awslinux
虚拟机的设置
Vagrant.configure(2) do |config|
config.vm.define :ansible_host do |node|
node.vm.box = "mvbcoding/awslinux"
node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
node.vm.network :private_network, ip: "192.168.33.11"
end
config.vm.define :server_1 do |node|
node.vm.box = "mvbcoding/awslinux"
node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
node.vm.network :forwarded_port, guest: 80, host: 8000, id: "http"
node.vm.network :private_network, ip: "192.168.33.12"
end
end
虚拟机启动
$ vagrant up
确认状态
$ vagrant status
连接到虚拟机的SSH
$ vagrant ssh ansible_host
$ vagrant ssh server_1
定期使用的命令(补充)
# 仮想マシンリロード
$ vagrant reload
# 仮想マシン停止
$ vagrant halt
# 仮想マシン削除
$ vagrant destroy
故障排除
如果您在主机操作系统和文件共享配置时遇到问题,启动vagrant时可能会出现Guest Additions版本不匹配的错误。请安装vagrant-vbguest插件,并重复执行vagrant up和vagrant halt命令几次。
$ vagrant plugin install vagrant-vbguest
在ansible_host服务器上安装Ansible
# Ansibleインストール
$ sudo yum -y --enablerepo=epel install ansible
# バージョン確認
$ ansible --version
ansible 2.6.2
如果要在AmazonLinux2上安装Ansible,通过amazon-linux-extras命令安装会非常方便。
$ sudo amazon-linux-extras install ansible2
Ansible执行前的准备工作
- Ansibleは操作したい対象サーバにSSH接続して環境を構築します。
# SSH鍵作成
$ ssh-keygen -t rsa
# ユーザー作成
$ sudo useradd ansible
# ansibleユーザーにホストサーバで作成した公開鍵(id_rsa.pub)を設置
$ sudo su - ansible
$ mkdir .ssh
$ chmod 700 .ssh
$ vim ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
# ansibleユーザーにsudo権限付与(rootユーザーで実行してください)
$ visudo
(下記1行を追加)
ansible ALL=(ALL) NOPASSWD: ALL
# SSH接続
$ ssh ansible@192.168.33.12
请注意,虽然本次操作允许使用sudo命令而无需密码,但出于管理上的考虑不建议这样做。
创建库存文件
- 対象サーバを指定するためにインベントリファイルを作成します。
$ vi hosts
---
[server1]
192.168.33.12
- 対象サーバにansibleコマンドで接続確認(ユーザーを指定)
$ ansible server1 -i hosts -u ansible -m ping
192.168.33.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
構築Ruby環境的回顧
在写入Playbook之前,我会简单地列出Ruby环境设置的步骤,以使其更容易理解。
-
- 安装必要的包,如git、gcc、openssl-devel等
-
- 安装rbenv
-
- 将shell文件放置在/etc/profile.d/目录下,以便在系统范围内使用
-
- 安装ruby-build
-
- 创建可以执行rbenv命令的用户组
-
- 根据需要将用户加入用户组
-
- 更改rbenv目录下的所属用户组
-
- 使用rbenv安装ruby
- 安装bundler
创建Playbook文件
为了使大家熟悉Ansible的写法,我们将按照上述环境搭建步骤参考创建Playbook文件。
(由于这次我们只是为了让大家熟悉Ansible的写法,所以文件夹结构会保持简单)。
- 初期定義
$ vi site.yml
---
- hosts: server1 # インベントリファイルの対象サーバを指定
become: yes # rootユーザーでの実行
- yum update(yum-module)
tasks:
- name: 'yum update'
yum:
name: '*'
state: latest
- 必要なパッケージ群をインストール(yum-module)
...
- name: 'Install packages'
yum:
name: "{{ item }}"
with_items:
- git
- gcc
- openssl-devel
- libyaml-devel
- readline-devel
- zlib-devel
- libffi-devel
- rbenvインストール(git-module)
- name: 'Install rbenv'
git:
repo: https://github.com/sstephenson/rbenv.git
dest: /usr/local/rbenv
- rbenvのパス設定(template-module)
将这样的sh文件放置在/etc/profile.d/目录下,以便全系统使用。
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
在与site.yml文件相同的目录下创建一个名为”templates”的文件夹,并将模板文件存放为.j2扩展名的文件。(j2是用于Python的模板引擎库jinja2的缩写)
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
- name: 'rbenvのshファイルを配置'
template:
src: rbenv_system.sh.j2
dest: /etc/profile.d/rbenv.sh
owner: root
group: root
mode: 0755
我还可以使用(补充)Shell命令来编写如下,但感觉有点不太好。。。
shell: echo 'export PATH="export RBENV_ROOT=/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh
shell: echo 'export PATH="export PATH="${RBENV_ROOT}/bin:${PATH}""' >> /etc/profile.d/rbenv.sh
shell: echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
- ruby-buildインストール(git-module)
- name: 'ruby-buildインストール'
git:
repo: https://github.com/sstephenson/ruby-build.git
dest: /usr/local/rbenv/plugins/ruby-build
- rbenvコマンドが実行出来るグループを作成(group-module)
- name: 'deploy用のグループを作成'
group:
name: deploy
- ansibleユーザーをdeploy用グループに所属させる(user-module)
- name: 'ansibleユーザーをdeployグループに所属'
user:
name: ansible
groups: deploy
- rbenvディレクトリの所有グループをdeployグループに変更(file-module)
- name: 'rbenvディレクトリの所有グループをdeployに変更'
file:
path: /usr/local/rbenv
owner: root
group: deploy
recurse: yes
state: directory
- rubyインストール(shell-module)
- name: 'rubyインストール'
shell: bash -lc "rbenv install --skip-existing 2.5.0"
- インストールしたRubyバージョンをglobalセット(shell-module)
- name: 'globalセット'
shell: bash -lc "rbenv global 2.5.0"
- bundlerインストール(gem-module)
- name: 'bundlerインストール'
gem:
name: bundler
user_install: no
executable: /usr/local/rbenv/shims/gem
确认-执行
语法检查
以中国式的方式对以下进行改写,只需要提供一种选择:
“`
ansible-playbook site.yml -i hosts –syntax-check
“`
将`ansible-playbook site.yml -i hosts –syntax-check`改写为:
“`
ansible-playbook site.yml -i hosts –检查语法
“`
模拟测试
使用ansible用户名ansible,在hosts文件中,通过ansible-playbook命令以–check参数运行site.yml剧本。
跑步 ♪
使用ansible-playbook命令,通过hosts文件,并以ansible用户身份运行site.yml playbook。
$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
在执行干扰模拟时需要注意的事项
在进行dry-run执行时,远程系统上的更改不会生效。因此,如果存在依赖于执行命令结果的处理,则可能会出现错误。自ansible 2.2版本起,增加了check_mode选项,通过以下方式编写可以在执行–check选项时跳过task。
tasks:
- name: 'yum update'
yum:
name: '*'
state: latest
check_mode: yes
总结
“虽然在Ansible中可以有各种不同的编写方式,很难找到一个典范的答案,所以我只是为了让它能够运行而创建了这个脚本。(如果有任何意见,请多多指教)
下次我希望能够涉及到目录结构和冪等性等问题
本次源码放置处: ”
请参考
安装 rbenv 的 Ansible 角色