jinja2
注:使用在修改文件内容
jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。
for循环:
{% for item in list %}
list不空是执行
{% else %}
list为空时执行的默认语句块
{% endfor %}
或
{% for item in list %}
list不空是执行
{% endfor %}
if判断:
{% if 条件1 %}
语句块1
{% elif 条件2 %}
语句块2
{% else %}
不符合所有条件
{% endif %}
实践案例一
# 批量生成nginx虚拟主机配置
[root@ansible1 playbook]# cat jinja.yaml
- hosts: web1
vars:
- http_port: 80
- server_name: "www.baidu.com"
tasks:
- name: config vhosts
template:
src: baidu.conf
dest: /etc/nginx/conf.d/baidu.conf
[root@ansible1 playbook]# cat baidu.conf
upstream server {
{% for i in range(1,20) %}
server 192.168.188.{{ i }}:{{ http_port }};
{% endfor %}
}
server {
listen {{ http_port }};
server_name {{ server_name }};
location / {
proxy_pass http://server;
proxy_set_header Host $http_host;
}
}
[root@ansible1 playbook]# ansible-playbook /opt/playbook/jinja.yaml
# 验证
[root@ansible2 ~]# cd /etc/nginx/conf.d/
[root@ansible2 conf.d]# ls
baidu.conf default.conf
[root@ansible2 conf.d]# cat baidu.conf
upstream server {
server 192.168.188.1:80;
server 192.168.188.2:80;
server 192.168.188.3:80;
server 192.168.188.4:80;
server 192.168.188.5:80;
server 192.168.188.6:80;
server 192.168.188.7:80;
server 192.168.188.8:80;
server 192.168.188.9:80;
server 192.168.188.10:80;
server 192.168.188.11:80;
server 192.168.188.12:80;
server 192.168.188.13:80;
server 192.168.188.14:80;
server 192.168.188.15:80;
server 192.168.188.16:80;
server 192.168.188.17:80;
server 192.168.188.18:80;
server 192.168.188.19:80;
}
server {
listen 80;
server_name www.baidu.com;
location / {
proxy_pass http://server;
proxy_set_header Host $http_host;
}
}
实践案例二
# 生成远程机子keepalive配置文件
[root@ansible1 playbook]# cat jinja_keepalived.yml
- hosts: all
tasks:
- name: Copy Keepalived Configure
template:
src: ./kee.conf.j2
dest: /tmp/keepalived.conf
[root@ansible1 playbook]# cat kee.conf.j2
global_defs {
router_id {{ ansible_hostname }}
}
vrrp_instance VI_1 {
{%if ansible_hostname =="ansible1" %}
state MASTER
priority 150
{%elif ansible_hostname == "ansible2" %}
state BACKUP
priority 100
{%endif%}
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.188.3
}
}
[root@ansible1 playbook]# ansible-playbook --syntax-check /opt/playbook/jinja_keepalived.yml
playbook: /opt/playbook/jinja_keepalived.yml
[root@ansible1 playbook]# ansible-playbook /opt/playbook/jinja_keepalived.yml
# 验证
[root@ansible2 ~]# cat /tmp/keepalived.conf
global_defs {
router_id ansible2
}
vrrp_instance VI_1 {
state BACKUP
priority 100
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.188.3
}
}
实践案例三
# 使用Ansible jinja IF 生成不同的mysql配置文件 (自定义变量)
[root@ansible1 playbook]# cat jinja_mysql.yml
- hosts: all
gather_facts: no
vars:
PORT: 13306
# PORT: false #相当于开关
tasks:
- name: Copy MySQL Configure
template:
src: ./my.cnf
dest: /tmp/my.cnf
[root@ansible1 playbook]# cat my.cnf
{% if PORT %}
bind-address=0.0.0.0:{{ PORT }}
{% else %}
bind-address=0.0.0.0:3306
{%endif%}
[root@ansible1 playbook]# ansible-playbook --syntax-check /opt/playbook/jinja_mysql.yml
playbook: /opt/playbook/jinja_mysql.yml
[root@ansible1 playbook]# ansible-playbook /opt/playbook/jinja_mysql.yml
ansible加密模块
[root@m01 project2]# ansible-vault --help
Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
# 加密一个文件
ansible-vault encrypt include.yml
# 查看一个文件
[root@m01 project2]# ansible-vault view include.yml
Vault password:
- import_playbook: han.yml
- import_playbook: when2.yml
# 修改加密的文件内容
[root@m01 project2]# ansible-vault edit include.yml
# rekey 修改密码
[root@m01 project2]# ansible-vault rekey include.yml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful
# 执行加密的playbook
echo "1" >pass
chmod 600 pass
ansible-playbook include.yml --vault-password-file=pass # 非交互式输入密码
ansible-playbook include.yml --ask-vault-pass # 交互式输入密码
Ansible之Roles
Roles介绍
ansible
自1.2
版本引入的新特性,用于层次性、结构化地组织playbook
。roles
能够根据层次型结构自动装载变量文件、tasks
以及handlers
等。要使用roles
只需要在playbook
中使用include
指令引入即可。简单来讲,roles
就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include
它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。主要使用场景代码复用度较高的情况下。
Roles目录结构
各目录含义解释
roles: <--所有的角色必须放在roles目录下,这个目录可以自定义位置,默认的位置在/etc/ansible/roles
project: <---具体的角色项目名称,比如nginx、tomcat、php
files: <--用来存放由copy模块或script模块调用的文件。
templates: <--用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
tasks: <--此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
main.yml
handlers: <--此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
main.yml
vars: <--此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
main.yml
defaults: <--此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
main.yml
meta: <--此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。
main.yml
实践案例一
[root@ansible1 playbook]# yum -y install tree
[root@ansible1 playbook]# ansible-galaxy init test
- Role test was created successfully
[root@ansible1 playbook]# tree /opt/playbook/test/
/opt/playbook/test/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
# 可以看出来使用roles需要有固定目录和文件,上面就是一个例子,每个目录下面都是用main.yaml(必须是这个)
实践案例二(memcached)
[root@ansible1 roles]# mkdir -pv memcached/{tasks,templates,handlers,vars}
mkdir: 已创建目录 "memcached"
mkdir: 已创建目录 "memcached/tasks"
mkdir: 已创建目录 "memcached/templates"
mkdir: 已创建目录 "memcached/handlers"
mkdir: 已创建目录 "memcached/vars"
[root@ansible1 roles]# tree memcached/
memcached/
├── handlers
├── tasks
├── templates
└── vars
4 directories, 0 files
[root@ansible1 roles]# cd memcached/
[root@ansible1 tasks]# cat /etc/ansible/roles/memcached/tasks/main.yaml
- include_tasks: install.yaml
- include_tasks: config.yaml
- include_tasks: start.yaml
[root@ansible1 tasks]# cat /etc/ansible/roles/memcached/tasks/install.yaml
- name: install memcached
yum:
name: memcached
state: present
[root@ansible1 tasks]# cat /etc/ansible/roles/memcached/tasks/config.yaml
- name: Configure Memcached
template:
src: memcached.j2 # 会自动到roles下面的模板文件夹里面找
dest: /etc/sysconfig/memcached
notify:
- restart memcached
[root@ansible1 tasks]# cat /etc/ansible/roles/memcached/tasks/start.yaml
- name: start Memcached
service:
name: memcached
state: started
[root@ansible1 tasks]# cat /etc/ansible/roles/memcached/templates/memcached.j2
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ mem //2 }}"
OPTIONS=""
[root@ansible1 tasks]# cat /etc/ansible/roles/memcached/vars/main.yaml
mem: 1024
[root@ansible1 tasks]# cat /etc/ansible/roles/memcached/handlers/main.yaml
- name: restart memcached
systemd:
name: memcached
state: restarted
[root@ansible1 tasks]# cat /etc/ansible/roles/memcached.yaml
- hosts: all
roles:
- memcached
[root@ansible1 tasks]# tree /etc/ansible/roles/
/etc/ansible/roles/
├── memcached
│ ├── handlers
│ │ └── main.yaml
│ ├── tasks
│ │ ├── config.yaml
│ │ ├── install.yaml
│ │ ├── main.yaml
│ │ └── start.yaml
│ ├── templates
│ │ └── memcached.j2
│ └── vars
│ └── main.yaml
└── memcached.yaml
5 directories, 8 files
[root@ansible1 tasks]# ansible-playbook /etc/ansible/roles/memcached.yaml
实践案例三(lamp)
[root@ansible1 roles]# mkdir -pv lamp/{tasks,templates,handlers,vars}
[root@ansible1 roles]# cat /etc/ansible/roles/lamp.yaml
- hosts: all
roles:
- lamp
[root@ansible1 roles]# cat /etc/ansible/roles/lamp/tasks/main.yaml
- include_tasks: install.yaml
- include_tasks: config.yaml
- include_tasks: start.yaml
[root@ansible1 roles]# cat /etc/ansible/roles/lamp/tasks/install.yaml
- name: install lamp
yum:
name: "{{ packages }}"
state: present
[root@ansible1 roles]# cat /etc/ansible/roles/lamp/tasks/config.yaml
- name: Configure httpd
template:
src: httpd.j2
dest: /etc/httpd/conf/httpd.conf
notify:
- restart httpd
[root@ansible1 roles]# cat /etc/ansible/roles/lamp/tasks/start.yaml
- name: Start server
service:
name: "{{ item }}"
state: started
with_items:
- httpd
- mariadb
- php-fpm
[root@ansible1 roles]# vim /etc/ansible/roles/lamp/templates/httpd.j2
改: Listen 80
为: Listen {{ httpd_port }}
[root@ansible1 roles]# cat /etc/ansible/roles/lamp/handlers/main.yaml
- name: restart httpd
systemd:
name: httpd
state: restarted
[root@ansible1 roles]# cat /etc/ansible/roles/lamp/vars/main.yaml
httpd_port: 8088
packages:
- httpd
- mariadb-server
- php
- php-fpm
- php-mysql
- php-pdo
[root@ansible1 roles]# cat /etc/ansible/roles/lamp.yaml
- hosts: all
roles:
- lamp
ansible roles总结
1、编写任务(task)的时候,里面不需要写需要执行的主机,单纯的写某个任务是干什么的即可,装软件的就是装软件的,启动的就是启动的。单独做某一件事即可,最后通过main.yml将这些单独的任务安装执行顺序include进来即可,这样方便维护且一目了然。
2、定义变量时候直接安装key:value格式将变量写在vars/main.yml文件即可,然后task或者template直接调用即可,会自动去vars/main.yml文件里面去找。
3、定义handlers时候,直接在handlers/main.yml文件中写需要做什么事情即可,多可的话可以全部写在该文件里面,也可以像task那样分开来写,通过include引入一样的可以。在task调用notify时直接写与handlers名字对应即可(二者必须高度一直)。
oles/lamp.yaml
- hosts: all
roles:- lamp
#### ansible roles总结
**1、编写任务(task)的时候,里面不需要写需要执行的主机,单纯的写某个任务是干什么的即可,装软件的就是装软件的,启动的就是启动的。单独做某一件事即可,最后通过main.yml将这些单独的任务安装执行顺序include进来即可,这样方便维护且一目了然。**
**2、定义变量时候直接安装key:value格式将变量写在vars/main.yml文件即可,然后task或者template直接调用即可,会自动去vars/main.yml文件里面去找。**
**3、定义handlers时候,直接在handlers/main.yml文件中写需要做什么事情即可,多可的话可以全部写在该文件里面,也可以像task那样分开来写,通过include引入一样的可以。在task调用notify时直接写与handlers名字对应即可(二者必须高度一直)。**
**4、模板文件一样放在templates目录下即可,task调用的时后直接写文件名字即可,会自动去到templates里面找。注意:如果是一个角色调用另外一个角色的单个task时后,那么task中如果有些模板或者文件,就得写绝对路径了。**