15. Ansible Jinja2 템플릿 15.1
jinja2 템플릿 개요 15.1.1 jinja2 템플릿
이란 15.1.2 jinja2
와 Ansible 의 관계 15.2.1 변수 사용 구문 15.2.2 Jinja2 템플릿 논리 판단 구문 15.2. 3. Jinja2 템플릿 루프 구문 15.2.4. 주석 15.3. Jinja2 템플릿 테스트 15.3.2. 예제 2
15. Ansible Jinja2 템플릿
출처: https://blog.csdn.net/weixin_48981270/article/details/117756914
15.1 jinja2 템플릿 개요
15.1.1 jinja2 템플릿이란?
jinja2는 완전한 기능을 갖춘 Python용 템플릿 엔진입니다.
15.1.2 jinja2와 Ansible의 관계
Ansible은 주로 jinja2 템플릿을 사용하여 관리되는 호스트 등의 구성 파일을 수정합니다.jinja2는 saltstack에서도 사용됩니다.redis가
100개의 호스트에 설치되면 각 redis의 수신 주소가 다릅니다.해결 방법은?
15.1.3 앤서블이 Jinja2를 사용하는 방법
Ansible의 jinja2 템플릿을 사용하는 것은 파일을 원격 호스트로 복사하는 copy 모듈과 동일한 템플릿 모듈을 사용하는 것이지만 템플릿 모듈은 파일에 있는 변수를 가져올 수 있는 반면 복사본은 그대로 유지한다는 차이점이 있습니다. 과거의 파일 내용을 복사합니다. 예전에 rsync의 백업 스크립트를 푸시할 때 스크립트에 있는 변수 이름을 호스트 이름으로 변경하고 싶었는데 복사 모듈을 사용했다면 { { ansible_fqdn }}을 변경하지 않고 푸시했습니다. 템플릿을 사용 했다면 해당 CPU 이름이 됩니다.
15.1.4 Ansible에서 Jinja2 사용시 주의사항
Ansible은 jinja2 템플릿에서 조건부 판단 및 루프를 사용할 수 있지만 플레이북에서는 사용할 수 없습니다.
참고: 모든 관리자에게 이 기능이 필요한 것은 아니지만 때로는 jinja2 모듈이 효율성을 크게 향상시킬 수 있습니다.
15.2 Ansible jinja2 템플릿 사용
15.2.1 변수 사용 구문
{
{ EXPR }} 출력 변수 값, 사용자 정의 변수 값 또는 사실을 출력합니다. 1.
플레이북 파일은 템플릿 템플릿을 사용합니다
. 2. 템플릿 파일의 변수는 { { PORT
}}와 같은 { { 이름 }}을 사용
하거나 사실을 사용합니다.
15.2.2.Jinja2 템플릿 논리 판단 구문
#shell中的判断语法
[root@m01 project]# vim pd.sh
#!/bin/bash
age=$1
if [ $age -lt 18 ];then
echo "小姐姐"
else
echo "大妈"
fi
#Jinja2模板判断语法
#条件判断
{
% if EXPR %}
{
% elif EXPR %}
{
% else %}
{
% endif %}
15.2.3 Jinja2 템플릿 루프 구문
#shell中的循环
[root@m01 project]# vim xh.sh
#!/bin/bash
for i in `seq 10`
do
echo $i
done
#Jinja2模板循环语法
#循环表达式
{
% for i in EXPR %}
{
% endfor %}
15.2.4 참고 사항
# shell中的注释
使用#写在注释内容最前面
#Jinja2模板注释语法
{
# COMMENT #}
15.3 Jinja2 템플릿 테스트
15.3.1 예제 1
1) 로그인 파일용 jinja2 템플릿 구성
[root@node2 workspace]# cat motd.j2
Welcome to {
{
ansible_fqdn }}
This system total mem is : {
{
ansible_memtotal_mb }} MB
This system free mem is: {
{
ansible_memfree_mb }} MB
2) 플레이북 쓰기
[root@node2 workspace]# cat motd.yml
- hosts: all
tasks:
- name: Config motd
template:
src: ./motd.j2
dest: /etc/motd
3) 실행 및 보기
[root@node2 workspace]# ansible-playbook motd.yml
PLAY [all] *******************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [172.17.0.5]
ok: [172.17.03]
ok: [172.17.0.6]
ok: [172.17.0.4]
ok: [172.17.0.3]
ok: [172.17.06]
ok: [172.17.04]
ok: [172.17.05]
TASK [Config motd] ***********************************************************************************************
changed: [172.17.0.5]
changed: [172.17.0.4]
changed: [172.17.0.3]
changed: [172.17.0.6]
changed: [172.17.03]
changed: [172.17.04]
changed: [172.17.05]
changed: [172.17.06]
PLAY RECAP *******************************************************************************************************
172.17.0.3 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.0.4 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.0.5 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.0.6 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.04 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.05 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.06 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@node2 workspace]# cat /etc/motd
Welcome to node2
This system total mem is : 12560 MB
This system free mem is: 10638 MB
[root@node2 workspace]#
15.3.2 예제 2
1) 데이터베이스 구성 파일 구성
#正常的配置文件
[root@m01 project]# vim conf/upstream.conf
upstream web {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name linux.wp.com;
location / {
proxy_pass http://web;
proxy_set_header Host $http_host;
}
}
#不正经的配置文件
[root@m01 project]# vim conf/upstream.j2
upstream {
{
server_name }} {
{
% for i in range(7,20) %}
server {
{
net_ip }}.{
{
i }};
{
% endfor %}
}
server {
listen {
{
web_port }};
server_name {
{
server_name }};
location / {
proxy_pass http://{
{
server_name }};
proxy_set_header Host $http_host;
}
}
2) 구성 변수 파일
[root@m01 project]# vim upstream_vars.yml
server_name: linux.wp.com
web_port: 80
net_ip: 172.16.1
3) 스크립트 작성
[root@m01 project]# vim lb.yml
- hosts: lb_server
vars_files: ./upstream_vars.yml
tasks:
- name: Config Nginx Upstream
template:
src: conf/upstream.j2
dest: /etc/nginx/conf.d/upstream.conf
notify: restert_upstream
- name: Start Nginx Server
systemd:
name: nginx
state: started
handlers:
- name: restert_upstream
systemd:
name: nginx
state: restarted
4) 실행 및 테스트
[root@m01 project]# ansible-playbook lb.yml