开始执行Ansible角色任务

本文是AP Communications 2019年Advent Calendar第4篇文章。

首先

这次我想简单介绍一下我在今年一整年中终于开始在工作中使用的Ansible角色。
最近,我已经习惯了先创建角色然后再开始编码,感觉很少单独创建playbook的场景了。
这次我将从安装Ansible开始,一直介绍到创建一个简单的角色并执行playbook。

环境构成 –

    • VirtualBox:6.0.14

 

    • OS:CnetOS 7.7

 

    • python:3.6.8

 

    ansible:2.9.1
CentOS では yum でインストール可能な Ansible ですが、
python モジュールの1つでもあるため python のパッケージ管理でもある pip でもインストール可能です。

CentOS の yum では以下のバージョンがインストール可能です。
※2019/12/03 時点
・extras repository:2.4.2
・epel   repository:2.9.1

上記以外のバージョンをインストールしたい場合には python-pip をインストールし、
pip コマンドでバージョンを指定しインストールすることも可能です。

Ansible 配置

$ yum install python3
$ python3 -V
Python 3.6.8

$ pip3 install ansible
$ ansible --version
ansible 2.9.1
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.6.8 (default, Aug  7 2019, 17:28:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

Ansible的连通性确认

在安装完成后,需要进行连接确认。
这次只对自己的服务器进行设置更改,因此将简化SSH密钥认证的设置。

# パスフレーズ無しで鍵作成
$ ssh-keygen -t rsa -b 4096
・・・
Enter file in which to save the key (/root/.ssh/id_rsa): ★ Enter key
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): ★ Enter key
Enter same passphrase again: ★ Enter key

# 鍵ファイルを所定の位置に移動
$ mv .ssh/{id_rsa.pub,authorized_keys}

# 接続用設定ファイルの修正
$ vi .ssh/config
↓
Host localhost
  HostName 127.0.0.1
  User root
  IdentityFile ~/.ssh/id_rsa

# 疎通確認
$ ssh localhost
・・・
Are you sure you want to continue connecting (yes/no)?  ★ yes を入力

$ w
※二人ログインしていれば OK
$ exit

创建一个 inventory 文件,用于确认 ansible 的通信。

$ vi inventory.dev
↓
[web]
localhost ansible_host=127.0.0.1

# ping モジュールで疎通確認
$ ansible -i inventory.dev web -m ping
localhost | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
上述の facts を見ると管理対象サーバの python のバージョンを取得しています。
※今回は python3 を追加でインストールしたのですが、ansible が対象サーバから取得したバージョンは python2 でした。

ansible はエージェントレスなアプリケーションですが、内部では python のコードを scp でファイル転送し、
python コードを対象サーバで実行しています。
このため、モジュールによっては対象サーバ内にpythonモジュールが必要な場合もあります。

角色创建

我們立即創建角色。
這次我們將創建 common(服務器共享配置)和 webtier(web服務器(nginx))。

# role 用のディレクトリ作成
$ mkdir roles

# role のテンプレート作成
$ ansible-galaxy init --init-path roles/ common
$ ansible-galaxy init --init-path roles/ webtier

# role 設定
$ vi web.yml
↓
- hosts: web
  gather_facts: no
  become: yes
  roles:
    - common
    - webtier

# 空実行
$ ansible-playbook -i inventory.dev web.yml
PLAY [web] ***************************************************************

PLAY RECAP ***************************************************************

# 共通設定
$ vi roles/common/tasks/main.yml

---
# tasks file for common
- include: packages.yml
- include: users.yml

$ vi roles/common/tasks/packages.yml

---
# tasks file for common packages
- name: install common packages
  yum:
    name: "{{ packages }}"
  vars:
    packages:
      - bind-utils
      - vim
      - wget

$ vi roles/common/tasks/users.yml

---
# tasks file for common users
- name: add users
  user:
    name: james
    group: wheel
    shell: /bin/bash

# Playbook 実行
$ ansible-playbook -i inventory.dev web.yml
・・・
PLAY RECAP *************************************************************************************************
localhost            : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

# 実装確認
$ nslookup www.google.co.jp
・・・
Name:   www.google.co.jp
Address: xxx.xxx.xxx.xxx

$ id james
uid=1000(james) gid=10(wheel) groups=10(wheel)

# web設定
$ vi roles/webtier/tasks/main.yml

---
# tasks file for webtier
- name: install nginx
  yum:
    name: nginx

- name: start/enabled nginx
  systemd:
    name: nginx
    state: started
    enabled: yes

$ ansible-playbook -i inventory.dev web.yml
PLAY RECAP *************************************************************************************************
localhost            : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

# 実装確認
$ curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.16.1
・・・

ansible はコードの塊のため、git で管理するにはもってこいです。
注意点があるとすれば、ansible-galaxy で作成したディレクトリテンプレートの中に空のディレクトリがあります。
※common/files や common/templates

これらのディレクトリはファイルが配置されていないため、明示的に指定しない限りは git の管理外になってしまう場合があります。
git clone 等をした際にいつの間にかなくなっている場合があるので気を付けてください。

結論

我在这次中简单地解释了一下Ansible角色。
通过规定规则, 可以使文件的结构更易于阅读, 管理也更加容易。
在Ansible中还有其他官方的最佳实践,您可以参考以下网址。
※本次的目录结构也是参考以下网址的目录结构。

最佳实践
https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html

广告
将在 10 秒后关闭
bannerAds