我试着使用Ansible在本地执行按环境分离的httpd conf部署。(Note: This paraphrase assumes that “入門がてら” means “I tried” or “I attempted” and “環境ごとの” means “separating by environment”. Additionally, it assumes you are referring to the deployment of httpd configuration files.)

概述

我试着使用Ansible来整理一下。这是一个关于安装、启动设置、按环境配置conf文件、执行httpd reload的本地示例。当服务器准备好后,我希望能够使用Ansible一条命令(附加dev或stg选项)来完成期望的环境配置。

引入编制

收集基礎知識

我通过搜索“ansible 入门”来阅读了几篇文章
Ansible 入门 – Qiita
试着用 Ansible 创建一个简单的 LAMP 环境 – yk5656 日记
使用 Role 的 Ansible 教程 | Developers.IO

至少有以下的东西似乎就够了。

    • ansible環境

 

    • Inventoryファイル(サーバ情報が記載されたファイル)

 

    playbookファイル(タスク情報がかかれたファイル)

能否通过某种方式省略Inventory文件,并以一个文件来管理呢?我努力尝试了一下,但无法重现,并且似乎也不被推荐。(是否可以像Fabric那样,在执行命令时通过选项来解决呢?)

似乎有一些例子。 【Ansible】不使用Inventory文件执行ansible命令 | Developers.IO

安装

安装可通过yum或sudo进行。本地环境使用pyenv+virtualenv来切换目录环境,因此从pip中引入了依赖。


# yumから
$ sudo yum install epel-release
$ sudo yum install ansible
# こっちだと後述のInventoryファイル(/etc/ansible/hosts)は自前でできるらしい

# pipから(python事前に環境ある前提)
$ pip install ansible

试一试

准备Inventory文件(据说默认情况下将读取/etc/ansible/hosts文件)。


[all]
localhosts ansible_connection=local

准备Playbook

---
- hosts: localhosts
  sudo: yes
  tasks:
  - name: install httpd
    yum: name=httpd state=present
  - name: start httpd service
    service: name=httpd state=started enabled=yes
  - name: setup stg conf file
    template: src=stg-hoge.j2 dest=/etc/httpd/conf.d/hoge.conf
    notify: httpd restart
    when: conf_env == "stg"
  - name: setup dev conf file
    template: src=dev-hoge.j2 dest=/etc/httpd/conf.d/hoge.conf
    notify: httpd restart
    when: conf_env == "dev"
  - name: httpd start confirm
    wait_for: port=80 delay=1
  handlers:
    - name: httpd restart
      action: service name=httpd state=reloaded

准备每个环境的配置文件模板。(这次是示例,所以无论什么都可以)

# /home/hoge/ansible以下にそれぞれ
$ cat dev-hoge.j2
<VirtualHost *:80>
  DocumentRoot /www/public/dev-html
  ServerName www.example.com
</VirtualHost>
$ cat stg-hoge.j2
<VirtualHost *:80>
  DocumentRoot /www/public/stg-html
  ServerName www.example.com
</VirtualHost>

尝试执行


# どのplaybookを実行するか、sudoパスを訊くか?、実行変数指定、Inventoryファイル指定してる
$ ansible-playbook main.yaml --ask-sudo-pass --extra-vars "conf_env=stg" -i hosts

SUDO password:

PLAY [localhosts] *************************************************************

GATHERING FACTS ***************************************************************
ok: [localhosts]

TASK: [install httpd] *********************************************************
ok: [localhosts]

TASK: [start httpd service] ***************************************************
ok: [localhosts]

TASK: [setup stg conf file] ***************************************************
ok: [localhosts]

TASK: [setup dev conf file] ***************************************************
skipping: [localhosts]

TASK: [httpd start confirm] ***************************************************
ok: [localhosts]

PLAY RECAP ********************************************************************
localhosts                 : ok=5    changed=0    unreachable=0    failed=0

$ ansible-playbook main.yaml --ask-sudo-pass --extra-vars "conf_env=dev" -i hosts
SUDO password:

PLAY [localhosts] *************************************************************

GATHERING FACTS ***************************************************************
ok: [localhosts]

TASK: [install httpd] *********************************************************
ok: [localhosts]

TASK: [start httpd service] ***************************************************
ok: [localhosts]

TASK: [setup stg conf file] ***************************************************
skipping: [localhosts]

TASK: [setup dev conf file] ***************************************************
ok: [localhosts]

TASK: [httpd start confirm] ***************************************************
ok: [localhosts]

PLAY RECAP ********************************************************************
localhosts                 : ok=5    changed=0    unreachable=0    failed=0

因为在命令执行时通过选项指定了是dev还是stg,所以一切顺利。

关于Playbook的说明

这次做过的事情

在名为”hosts”的环境单位中,执行与该环境单位相关的”tasks”。

在“hosts”文件中,可以指定是否通过sudo来进行操作。

# localhostsにsudoで実行する
- hosts: localhosts
  sudo: yes
    • “tasks”には”name”ごと各タスクに名前をつけて、その下に実際の所望の状態を記載する。

これらをmoduleと呼び、今回はyum、service、template、wait_forなど利用
参考:All Modules — Ansible Documentation

# httpdインストールしてプロセス起動と自動起動を有効にするまで
  tasks:
  - name: install httpd
    yum: name=httpd state=present
  - name: start httpd service
    service: name=httpd state=started enabled=yes
  ...

在模板中,通过jinja2的文件(.j2)进行引用。
在其下方,可以使用notify来指定在该任务发生更改时的下一个任务,或者使用when来指定在哪种情况下执行分支。

### stgの場合のconf配置
  - name: setup stg conf file
    template: src=stg-hoge.j2 dest=/etc/httpd/conf.d/hoge.conf
    notify: httpd restart
    when: conf_env == "stg"

只需要一种方式,对以下内容进行中文本地化改写:
通过notify指定的”httpd restart”被指定为处理程序,类似于助手任务。

# handlerとして"httpd restart"を定義
  handlers:
    - name: httpd restart
      action: service name=httpd state=reloaded

未来可能实现的事情

    • main.yamlの中にvarsで変数も埋め込める

 

    • main.yamlは各taskを別ファイルにしてinculudeして再利用性をあげられる

 

    • roleでchefっぽく規約に従ったファイル構造にすれば自動で読み込んでくれる

 

    • moduleはbashとかで自作もできるらしい

 

    • chefのdatabag的なのはVaultというのを使えばいいらしい

 

    sudoじゃなくてrootじゃないと実行できない、とかいう悲しい環境でもできるっぽい

参考:使用Ansible的Playbook- akishin999的日志
Ansible模块开发之道- Nulab公司
使用ansible进行密码认证和以root身份执行命令- Qiita

感受之处

虽然能够迅速完成想做的事情,但由于我目前仅处于入门级别,所以未来的发展还不确定。

    • いい?ところ

2ファイルとか最小でできるのはよい
chefの様に謎コマンドたくさんで混乱しない?(ansibleとansible-playbookコマンドとかあるけど…)

わるい?ところ

Inventoryファイルはやっぱり省略可能にして欲しい
結果が”OK”だけでよくわからない。ファイル変更したら差分とか欲しい。
小規模は気楽だけど、やっぱ大規模だと大丈夫かな?感
(ansible関係ないけど)できたコードはgitなりでどう管理すると運用便利かな?とふと

今回なぜchefを使わないか?

ファイル構成とか複雑なので簡単に始めるなら1ファイルで構成を管理したかった(できなかったけど)
単純にrubyよりpythonのが考え方が慣れてるから
chefばっかりだとあれなので、他のにも手を出しといた方が頭の体操的にはいいかなと

前面所述。

广告
将在 10 秒后关闭
bannerAds