[Ansible] 템플릿

728x90

템플릿

[vagrant@controller template]$ cat test.yml
- hosts: 192.168.100.11
  vars:
    message: korea
  tasks:
    - copy:
        src: origin.txt
        dest: /tmp/copy.txt
    - template:
        src: origin.txt
        dest: /tmp/template.txt

copy 와 template 모듈은 언뜻 보기엔 비슷한 모듈처럼 보이지만 다르다.

template 모듈은 동적인 컨텐츠들을 다룰 때 주로 사용한다 {{ 변수명 }} 에 입력한 변수값이 들어가기 때문이다.

예시를 보면서 더 살펴보자.

ansible 은 기본 템플릿으로 jinja2 를 사용한다.

wp-config.php.j2 템플릿을 생성하고 template 모듈로 관리 노드에 설치해보자.

wp-config.php.j2 템플릿은 아래와 같다. 유의깊게 볼 것은 {{ 변수명 }} 부분이다. 중괄호 안에 들어가는 변수들은 모두 플레이북에서 정의되는 변수들이다.

<?php

// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', {{ mysql["dbname"] }} );

/** Database username */
define( 'DB_USER', {{ mysql["dbuser"] }} );

/** Database password */
define( 'DB_PASSWORD', {{ mysql["dbpwd"] }} );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );

$table_prefix = 'wp_';

define( 'WP_DEBUG', false );

if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', __DIR__ . '/' );
}

require_once ABSPATH . 'wp-settings.php';

wordpress_vars.yml 에서 변수를 정의하고 해당 변수들을 아래 wordpress.yml 파일에서 사용한다.

아래는 wordpress.yml 파일이다.

[vagrant@controller ~]$ more wordpress.yml
- hosts: 192.168.100.11
  vars_files:
    - wordpress_vars.yml
  tasks:
  - yum:
      name: '{{ php["remi_repo"]["pkg"] }}'
      state: present
      validate_certs: no
  - yum_repository:
      name: remi-safe
      file: remi-safe
      mirrorlist: '{{ php["remi_repo"]["safe_mirror"] }}'
      description: remi-safe
      enabled: no
  - yum_repository:
      name: remi-php74
      file: remi-php74
      mirrorlist: '{{ php["remi_repo"]["php74_mirror"] }}'
      description: remi-php74
      enabled: yes
  - rpm_key:
      key: '{{ php["remi_repo"]["gpgkey_path"] }}'
      state: present
  - yum:
      name: '{{ wp_pkg }}'
      state: installed
  - service:
      name: httpd 
      state: started
      enabled: yes
  - service:
      name: mariadb
      state: started
      enabled: yes
  - get_url:
      url: '{{ wp_source_url }}'
      dest: /home/vagrant
  - unarchive:
      src: '/home/vagrant/{{ wp_file_name }}'
      remote_src: yes
      dest: /var/www/html
      owner: apache
      group: apache
  - mysql_db:
      name: '{{ mysql["dbname"] }}'
      state: present
      login_user: root
  - mysql_user:
      name: '{{ mysql["dbuser"] }}'
      password: '{{ mysql["dbpwd"] }}'
      state: present
      login_user: root
      priv: '{{ mysql["dbname"] }}.*:ALL'
  - template:
      src: /home/vagrant/wp-config.php.j2
      dest: /var/www/html/wordpress/wp-config.php
      owner: apache
      group: apache

다음은 wordpress.yml 에서 사용되는 변수들을 모아놓은 wordpress_vars.yml 파일이다.

[vagrant@controller ~]$ cat wordpress_vars.yml
php:
  remi_repo:
    pkg: <https://rpms.remirepo.net/enterprise/remi-release-7.rpm>
    safe_mirror: <http://cdn.remirepo.net/enterprise/7/safe/mirror>
    php74_mirror: <http://cdn.remirepo.net/enterprise/7/php74/mirror>
    gpgkey_path: /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
wp_pkg: httpd,php,php-mysql,mariadb,mariadb-server,python2-PyMySQL
wp_version: '5.9.3'
wp_file_name: 'wordpress-{{ wp_version }}.tar.gz'
wp_source_url: '<https://wordpress.org/>{{ wp_file_name }}.tar.gz'
mysql:
  dbname: wordpress
  dbuser: wpadm
  dbpwd: 1234

이제 ansible-playbook 명령어를 실행하면 template 모듈에서 현재 작업 중인 시스템의 wp-config.php.j2 템플릿에 변수들을 입력받고 그 파일을 관리 노드들로 붙여넣는다.

[vagrant@controller ~]$ ansible-playbook wordpress.yml -b

PLAY [192.168.100.11] *******************************************************************************************

TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.100.11]
.
.
.
TASK [mysql_user] ***********************************************************************************************
[WARNING]: Module did not set no_log for update_password
ok: [192.168.100.11]

TASK [template] *************************************************************************************************
changed: [192.168.100.11]

PLAY RECAP ******************************************************************************************************
192.168.100.11             : ok=13   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

실제로 관리 노드에 잘 적용이 됐는지 파일을 열어서 확인해보자.

wp-config.php.j2 에서 {{ 변수명 }} 으로 세팅한 부분에 실제 변수들의 값으로 잘 들어간 것을 확인할 수 있고, 실제로 워드프레스가 제대로 동작하는 것을 확인할 수 있다.

728x90