Ansible之迭代循环与role 角色详解

原创 浪子丶刘少  2019-08-22 09:10  阅读 596 次 评论 0 条 百度已收录

一、迭代:with_items

迭代:当有需要重复性执行的任务时,可以使用迭代机制
  • 对迭代的引用,固定变量名为“item”
  • 要在task中使用with_items给定要迭代的元素列表
  • 列表格式:字符串,字典
案例:
分别创建文件,并安装软件
---
- hosts: 172.16.10.12
  remote_user: root

  tasks:
    - name: touch file
      file: name=/data/{{ item }} state=touch
      with_items:
        - file1
        - file2
        - file3

    - name: install packages
      yum: name=/data/{{ item }}
      with_items:
        - httpd
        - vsftp
        - php

二、迭代嵌套子变量

案例一:建立用户user1,user2,user3,且分别对应用户组group1,group2,group3

---
- hosts: 172.16.10.12
  remote_user: root
  tasks:
      - name: add some groups
        group: name={{ item }} state=present
        with_items:
            - group1
            - group2
            - group3
      - name: add some users
        user: name={{ item.name }} group={{ item.group }} state=present
        with_items:
            - {name: 'user1',group: 'group1'}
            - {name: 'user2',group: 'group2'}
            - {name: 'user3',group: 'group3'}

三、Playbook 中 template for

1、在yml文件中定义变量列表

---
- hosts: 172.16.10.12
  remote_user: root
  vars:
    ports:
        - listen_port: 81
        - listen_port: 82
        - listen_port: 83

2、在templat中调用变量

{% for port in ports %}
server{
    listen {{ port.listen_port }}
}
{% endfor %}

四、Playbook 中 template if

可使用if判断,如果某项无值,执行某条命令
{% if port.listen_port is defined %}
    port.listen_port  {{ port.listen_port }}
{% endif %}
注:一般if在for中嵌套

五、Roles各个目录作用

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

六、Roles目录结构及调用方法

roles
    - files/
    - tasks/
        - main.yml
        - group.yml
        - user.yml
        - install.yml
        - server.yml
    - templates/

#main.yml调用其他模块写法
- inclued: group.yml
- inclued: user.yml
- inclued: install.yml
#或者可以调用其他角色的项目
- inclued: roles/httpd/tasks/项目名

#playbook文件必须放在与roles文件夹平级,写法如下:
- hosts: webs
  remote_user: root
  roles:
    - role: roles中的项目名
    - { role: roles中的项目名, tags: ['标签一','标签二'] }

本文地址:https://www.ezliushao.com/322.html
加入我们:请加入刘少技术博客交流群:扫描二维码刘少技术博客的QQ交流群 | 浪子丶刘少 QQ:1150110267(注:微信暂停添加好友)
版权声明:本文为原创文章,版权归 浪子丶刘少 所有,欢迎分享本文,转载请保留出处!

发表评论


表情