Ansible 进阶版 《jinja2 & Roles》

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介绍

ansible1.2版本引入的新特性,用于层次性、结构化地组织playbookroles能够根据层次型结构自动装载变量文件、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中如果有些模板或者文件,就得写绝对路径了。**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值