使用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环境设置的步骤,以使其更容易理解。

    1. 安装必要的包,如git、gcc、openssl-devel等

 

    1. 安装rbenv

 

    1. 将shell文件放置在/etc/profile.d/目录下,以便在系统范围内使用

 

    1. 安装ruby-build

 

    1. 创建可以执行rbenv命令的用户组

 

    1. 根据需要将用户加入用户组

 

    1. 更改rbenv目录下的所属用户组

 

    1. 使用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 角色

广告
将在 10 秒后关闭
bannerAds