ansible-day06-20201120-template-for-if-roles基本用法-nginx简单安装剧本

本文介绍如何在Ansible中使用循环来简化批量任务的执行,并展示了如何利用Ansible的角色功能来实现代码的复用与模块化管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类似循环的写法 迭代循环 重复的事情

---
- hosts: all
  remote_user: root
  vars:
    nginx_packages:
      - htop
      - sl
      - hping3

  tasks:
    - name: create some file
      file: name=/data/{{ item }} state=touch
      with_items:
        - file1
        - file2
        - file3
    - name: install some packages
      yum: name="{{ nginx_packages }}"

创建多个文件 安装多个软件

---
- hosts: all
  remote_user: root
  tasks:
    - name: create some groups
      group: name={{item}}
      with_items:
        - g1
        - g2
        - g3
        - g4
    - name: create some user
      user: name={{item.name}} group={{item.group}}
      with_items:
        - { name: 'user1', group: 'g1' }
        - { name: 'user2', group: 'g2' }
        - { name: 'user3', group: 'g3' }
        - { name: 'user4', group: 'g4' }

迭代嵌套子变量

创建多个用户属于对应的组

playbook中template for if

for

cat testfor.yml
---
- hosts: all
  remote_user: root
  vars:
    ports:
      - 81
      - 82
      - 83
  tasks:
    - name: cp conf
      template: src=for1.conf.j2 dest=/data/for1.conf

cat templates/for1.conf.j2
{% for port in ports %}
server{
        listen {{ port }}
}
{% endfor %}


ansible-playbook testfor.yml
ansible all -m shell -a 'cat /data/for1.conf'
server{
        listen 81
}
server{
        listen 82
}
server{
        listen 83
}

cat testfor.yml
---
- hosts: all
  remote_user: root
  vars:
    ports:
      - web1:
        port: 81
        name: web1.com
        rootdir: /data/web1
      - web2:
        port: 82
        name: web2.com
        rootdir: /data/web2
      - web3:
        port: 83
        name: web3.com
        rootdir: /data/web3
  tasks:
    - name: cp conf
      template: src=for2.conf.j2 dest=/data/for2.conf

cat templates/for2.conf.j2
{% for p in ports %}
server{
        listen {{ p.port }}
        servername {{ p.name }}
        docroot: {{ p.rootdir }}
}
{% endfor %}

ansible-playbook testfor.yml
ansible all -m shell -a 'cat /data/for2.conf'

server{
        listen 81
        servername web1.com
        docroot: /data/web1
}
server{
        listen 82
        servername web2.com
        docroot: /data/web2
}
server{
        listen 83
        servername web3.com
        docroot: /data/web3
}

# 字典的感觉

if

---
- hosts: web
  remote_user: root
  vars:
    ports:
      - web1:
        port: 81
        name: web1.com
        rootdir: /data/web1
      - web2:
        port: 82
        #name: web2.com
        rootdir: /data/web2
      - web3:
        port: 83
        name: web3.com
        rootdir: /data/web3
  tasks:
    - name: cp conf
      template: src=for3.conf.j2 dest=/data/for3.conf

{% for p in ports %}
server{
        listen {{ p.port }}
{% if p.name is defined %}
        servername {{ p.name }}
{% endif %}
        docroot: {{ p.rootdir }}
}
{% endfor %}
# 如果name被定义 就赋值 没定义 就不赋值 if 

server{
        listen 81
        servername web1.com
        docroot: /data/web1
}
server{
        listen 82
        docroot: /data/web2
}
server{
        listen 83
        servername web3.com
        docroot: /data/web3
}

roles 角色

用于层次性,结构化的组织playbook.roles能够根据层次型结构自动装载变量文件,tasks,以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来说通过分别将变量,文件,任务,模板及处理器放置于单独的目录中,并可以便捷的include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
复杂场景:建议使用roles 代码复用度高
**变更指定主机或主机组
**如命名不规范维护和传承成本大
**某些功能需要多个playbook 通过includes即可实现
####把不同的配置文件放在不同的目录里  条理清晰 模块化 便于管理和调用

角色roles:角色集合

roles各目录作用

/roles/project/:项目名称,有下面子目录
files/:存放由copy或者script模块等调用的文件
templates/:template模块查找所需要的模板文件的目录
tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含
handlers/:至少应该包含一个名为main.pyl的文件;其他的文件需要在此文件中通过include进行包含
vars/:定义变量,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含
meta/:定义当前角色的特殊设定以及其依赖关系,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含
default/:设定默认变量时使用此目录的main.yml文件

nginx_roles

nginx
1group:nginx
2user:nginx
3yum:nginx
4template:nginx.conf.j2
5service:nginx

整理 nginx 安装的一个基本步骤 再去定义

roles/
├── httpd
├── memcache
├── mysql
└── nginx
    ├── tasks
    │   ├── group.yml
    │   ├── main.yml
    │   ├── restart.yml
    │   ├── start.yml
    │   ├── templ.yml
    │   ├── user.yml
    │   └── yum.yml
    └── template
        └── nginx.conf.j2

6 directories, 8 files

group.yml
- name: create group
  group: name=nginx
restart.yml
- name: restart service
  service: name=nginx state=restarted
start.yml
- name: start service
  service: name=nginx state=started enabled=yes
templ.yml
- name: copy conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
user.yml
- name: create user
  user: name=nginx group=nginx system=yes shell=/sbin/nologin
yum.yml
- name: install packge
  yum: name=nginx
main.yml
- include: group.yml
- include: user.yml
- include: yum.yml
- include: templ.yml
- include: start.yml

cp /etc/nginx/nginx.conf roles/nginx/template/nginx.conf.j2

nginx_role.yml (和roles在同一级目录下)
---
- hosts: web
  remote_user: root
  roles:
    - role: nginx

ansible-playbook -C nginx_role.yml
ansible-playbook nginx_role.yml
# 将playbook的需要的操作 模块化 方便调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值