0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ansible入門② プレイブックの基礎

Last updated at Posted at 2020-08-29

前回はインストールからansibleコマンドとansible-playbookコマンドの実行まで書きました。
Ansible入門① インストールからansible-playbookコマンドの実行

#プレイブックの構成
プレイブックは、管理対象サーバーに対して実行したい処理の流れを記述します。
厳密にはプレイ(play)と呼ばれる処理の塊を、複数並べたものと言えます。
プレイには、ターゲットノードの特定(hosts)とタスクの定義(tasks)が必須です。
複雑な処理を実行するために、補助的要素として、
実行制御(handlers)と動的な値(vars)があります。
プレイは、「Targets」「Tasks」「Handlers」「Vars」の4つのセクションからなります。

- hosts: all
  vars:
     ntp_conf: /tmp/ntp.conf
  tasks:
     - name: Install NTP
        yum: name=ntp state=installed
     - name: Config NTP
       template: src=ntp.conf.j2 dest=/etc/ntp.conf
       notify:
         - Restart NTP
     - name: Enable NTP
        service: name=ntp state=running enabled=yes
  handlers:
     - name: Restart NTP
       service: name=ntp state=restarted
- hosts: webservers
  tasks:
     - name: Install HTTP
       yum: name=httpd state=installed

#Targets セクション

- hosts: all
  become: yes
  become_user: ansible

Targetsセクションでは管理対象サーバーへの接続に関する設定を行います。
「hosts」キーの値としては、特定のサーバーやグループ等の指定が可能です。
「hosts」キーの他に下記のような設定等も可能です。

キー 説明
gather_facts true/false ターゲットノードの情報取得を行う
connection Connectionプラグイン 接続方法の変更を行う
remote_user ユーザー名 接続ユーザーの指定
port ポート番号 接続ポートの指定
become true/false 接続ユーザー以外で処理を行う。
become_user ユーザー名 ターゲットノードで処理を行うユーザー
become_method sudo/su/pbrun etc ターゲットノードで処理を行うコマンドの指定

#Tasks セクション

tasks:
   - name: Install NTP
      yum: name=ntp state=installed
   - name: Config NTP
     template: src=vhost.conf.j2 dest=/etc/httpd/con
     notify:
       - Restart NTP
   - name: Enable NTP
      service: name=ntp state=running enabled=yes

実行した処理の内容をシーケンスリストで定義します。
シーケンスリストの中にはマッピング形式で、Keyにモジュール名、
値に各モジュールのオプションを定義できます。
この例では、yumモジュール、templateモジュール、serviceモジュールを
上から順番に実行するようになっています。
上から記述した順番に実行していることが非常に重要です。
モジュールによって与えるオプションは異なります。
モジュールの利用方法について記述しているサイトやansible-docコマンドで確認します。
##ansible-doc

(一部抜粋)
[root@localhost ~]# ansible-doc yum
> YUM    (/usr/lib/python2.7/site-packages/ansible/modules/packaging/os/yum.py)

        Installs, upgrade, downgrades, removes, and lists packages and
        groups with the `yum' package manager. This module only works
        on Python 2. If you require Python 3 support see the [dnf]
        module.

  * This module is maintained by The Ansible Core Team
  * note: This module has a corresponding action plugin.

OPTIONS (= is mandatory):

- allow_downgrade
        Specify if the named package and version is allowed to
        downgrade a maybe already installed higher version of that
        package. Note that setting allow_downgrade=True can make this
        module behave in a non-idempotent way. The task could end up
        with a set of packages that does not match the complete list
        of specified packages to install (because dependencies between
        the downgraded package and others can cause changes to the
        packages which were in the earlier transaction).
        [Default: no]
        type: bool
        version_added: 2.4
:

Module Index

#Handlers セクション

tasks:
  - name: Config HTTP
    template:
      src: httpd.conf.j2
      dest: /etc/apache/httpd.conf
    notify:
      - Restart HTTP
 handlers:
  - name: Restart HTTP
    service:
      name: httpd
      state: restarted

Handlersセクションは、Tasksセクションと同様に、実行した処理の内容を
シーケンスリストで定義します。
タスクの定義で、「notify」を指定し、タスクの結果で「changed」となった場合にのみ、
処理を実行したい場合に利用します。
上記の例の場合、httpd(Apache)の設定ファイルとしテンプレートファイル(httpd.conf.j2)を利用し、httpd.confを作成します。
このタスクの結果が「changed」となり、「notify」で指定している「Restart HTTP」をもとに、
handlersセクションの「name」が「Restart HTTP」となっているものを実行します。
これは、httpd(Apache)の設定ファイルを変更した時、設定変更のために
httpd(Apache)を再起動するための定義になります。

##listenによる複数のhandlerタスクの利用

tasks:
  - name: Config HTTP
    template:
      src: httpd.conf.j2
      dest: /etc/apache/httpd.conf
    notify:
      - Restart HTTP
 handlers:
  - name: stop HTTP
    service:
      name: httpd
      state: stopped
    listen: Restart HTTP
  - name: start HTTP
    service:
      name: httpd
      state: started
    listen: Restart HTTP

Ansibleバージョン2.2以降では、listen機能が追加されました。
これは、「notify」で指定している「Restart HTTP」をもとに、
handlersセクションの「listen」が「Restart HTTP」となっているものを実行します。

#Vars セクション

vars:
   ntp_conf: /tmp/ntp.conf

タスクを効率化するための変数を定義するセクションです。
このセクションで定義する変数は、プレイ変数と呼ばれ、下記の3種類の利用方法があります。
・vars
・vars_files
・vars_prompt

##vars
vars内での変数を設定します。

vars:
  apache_log_dir: /var/log/httpd/logs
  user_id: 600
  group_id: 600

##vars_files
変数を定義した外部のYAMLファイルを複数読み込みます。
プレイブックとは別の外部のファイルに変数を定義して、処理によって定義読み込み利用します。
外部の変数を定義したファイルは、ansible-playbookコマンドを実行する時点で
存在している必要があります。

vars_files:
  - /vars/prod_vars.yml
/vars/prod_vars.yml
  apache_log_dir: /var/log/httpd/logs
  user_id: 600
  group_id: 600

##vars_prompt
変数を対話的にユーザーに問い合わせることができます。

vars_prompt
  - name: "Password"
    prompt: "Please enter your password."
    private: true
    confirm: true

###vars_promptで利用できる設定項目

項目 説明
name 文字列> 変数名として利用します
prompt 文字列> 入力時のプロンプトに表示する文字列
private true/false trueは入力値画面に表示されない
default 変数値> デフォルト値
encrypt 暗号化アルゴリズム(sha256_crpt等) 入力値をハッシュして奥暗号化アルゴリズム
confirm true/false trueの場合は入力値を再入力
salt_size 数値> 指定した文字数分の”SALTJwoランダムに生成する
unsafe true/false trueは入力値として{%のようなテンプレートエラーを引きおこす文字列MO許容する

#まとめで実行に必要な各種ファイル

/etc/ansible
├── ansible2-playbook.yml
├── ansible.cfg
├── template
│   └── conf
│       └── httpd
│           └── vhost.conf.j2
└── test_inventory
/etc/ansible/test_inventory
[test_servers]
192.168.11.21
/etc/ansible/template/conf/httpd/vhost.conf.j2
<VirtualHost *:80>
  ServerName {{ hostname }}
  DocumentRoot {{ document_root }}
</VirtualHost>
/etc/ansible/ansible2-playbook.yml
- hosts: test_servers
  vars:
    hostname: example.com
    document_root: /var/www/example.com/htdocs
  tasks:
  - name: Install httpd
    yum: name=httpd state=installed
    notify:
      - Enable service httpd
  - name: Config httpd
    template:
      src: template/conf/httpd/vhost.conf.j2
      dest: /etc/httpd/conf.d/virtualhost.conf
    notify:
      - Restart HTTP
  handlers:
  - name: Enable service httpd
    systemd:
      name: httpd
      enabled: yes
      masked: no
  - name: stop HTTP
    service:
      name: httpd
      state: stopped
    listen: Restart HTTP
  - name: start HTTP
    service:
      name: httpd
      state: started
    listen: Restart HTTP

#まとめの実行結果

[root@localhost ansible]# ansible-playbook -i ./test_inventory ./ansible2-playbook.yml

PLAY [test_servers] *************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************
ok: [192.168.11.21]

TASK [Install httpd] ************************************************************************************************************************
changed: [192.168.11.21]

TASK [Config httpd] *************************************************************************************************************************
changed: [192.168.11.21]

RUNNING HANDLER [Enable service httpd] ******************************************************************************************************
changed: [192.168.11.21]

RUNNING HANDLER [stop HTTP] *****************************************************************************************************************
ok: [192.168.11.21]

RUNNING HANDLER [start HTTP] ****************************************************************************************************************
changed: [192.168.11.21]

PLAY RECAP **********************************************************************************************************************************
192.168.11.21              : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?