• playbook role应用


    参考:  ansible中文权威指南

    1. 动态Include

    结合when等判断,在满足某个条件的时候加载。

    - include: test.yml

      when: ......

    handler 中也可以使用include

     

    2. ansible role 结构

    roles目录结构一般如下,可以根据实际情况减少:

    .
    ├── group_vars   #定义主机组的变量,虽然可以写在playbook和hosts中,但是提倡分离.文件用组名命名.
    │   ├── all.yml
    │   ├── seawar_server.yml
    │   ├── seawar.yml
    │   └── test1.yml
    ├── hosts
    ├── host_vars  #定义特定主机的变量,文件以主机命名,
    │   └── ios-cn-58.yml
    ├── main.yml       #整个playbook的入口文件,组织多个role的任务执行。任务总调度文件。主要指定远程主机,执行用户,调用的roles等。
    └── roles
        ├── base           #roles的名字
        │   ├── files       #存放要传输文件的目录,不用在tasks/main.yml中写绝对路径就可以用
        │   │   └── server.sh
        │   ├── handlers
        │   │   └── main.yml
        │   ├── meta
        │   ├── tasks
        │   │   ├── fileup.yml   #分离出来的任务,main.yml中include直接引用。
        │   │   ├── main.yml    #任务主函数,整个role的任务入口。
        │   │   └── sql.yml        #分离出来的任务,main.yml中include直接引用。
        │   ├── templates         # 模版文件,一般用于配置文件的变更
        │   └── vars                  # 变量
        │       └── main.yml     #一般定义templates中要用到的变量
        └── create_dir.sh

    roles说明:

    这个 playbook 为一个角色 ‘x’ 指定了如下的行为:

    • 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
    • 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
    • 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
    • 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 and later)
    • 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
    • 所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
    • 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。
    • 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。

    hosts定义如下:

    [ios_cn]
    iOS-CN-1-16 
    iOS-CN-17-32
    iOS-CN-33-52
    iOS-CN-53-54
    iOS-CN-55-56
    iOS-CN-57
    iOS-CN-58
    
    [ios_tw]
    121.40.20.132
    
    
    [an_360]
    360-1   
    360-2
    360-3
    
    
    [googleplay]
    android-TW-1-6
    
    [jp_ios]
    gNetop-iOS-JP-1-2   
    gNetop-iOS-JP-3-5   
    gNetop-iOS-JP-6-9   
    gNetop-iOS-JP-10-11 
    gNetop-iOS-JP-12-13 
    gNetop-iOS-JP-14-17 
    gNetop-iOS-JP-18-22 
    gNetop-iOS-JP-23-24 
    gNetop-iOS-JP-25    
    
    [jp_an]
    gNetop-android-JP-1-4   
    gNetop-android-JP-5-8   
    gNetop-android-JP-9-10  
    gNetop-android-JP-11    
    
    [na]
    gNetop-NA-S1    
    gNetop-NA-S2    
    gNetop-NA-S3    
    gNetop-NA-39    
    
    [eu]
    gNetop-EU-1 
    gNetop-EU-2 
    gNetop-EU-3 
    
    
    [sea]
    gNetop-SEA-M1   
    gNetop-SEA-M2   
    
    [seawar_server:children]
    ios_cn
    ios_tw
    jp_ios
    na
    eu
    sea
    
    [seawar:children]
    googleplay
    an_360
    jp_an
    
    [test]
    172.10.30.239
    
    [test1:children]
    test
    hosts

    变量定义如下:  group_vars/all.yml  .应用于所有主机的变量

    ---
    
    
    back_dir: "/mnt/back_2015/"

    playbook 入口文件main.yml 定义如下:

    ---
    
    
    - hosts:  jp_ios
      remote_user: root   #登录远程机器的用户,
    
      roles:
        - u_776

    roles/tasks中的文件如下:

    ---
    
    - name: 上传数据库文件
      copy:
        src: "{{item.src}}"
        dest: "{{item.dest}}"
        owner: root
        group: root
        mode: 0755
    
      with_items:
        - { src: server.sql, dest: "{{back_dir}}" } 
        - { src: server.sh, dest: "{{back_dir}}" } 
    
    
    - name: 执行数据库文件
      shell: sh "{{back_dir}}"server.sh>server.txt chdir = "{{back_dir}}"   #使用变量用引号。 sh命令去执行脚本。也可以在shell中直接执行命令。
    更新数据库的任务
    ---
    
    
    - name: 更新文件
      copy: 
        src: "{{item.src}}"
        dest: "{{item.dest}}" 
      with_items:
        - { src: init, dest: "{{remote_dir}}" }
        - { src: app, dest: "{{remote_dir}}" }  
    更新文件任务
    ---
    
    - include: fileup.yml
    #- include: sql.yml
    tasks入口文件,include的使用

     3. 跨平台roles,when判断实现

    比如 redhat和ubuntu都要安装httpd.

    首先定义两个roles httpd_ubuntu, httpd_redhat.  调用主文件如下:

    ---
    
    - name: cross-platform install httpd
    
      hosts: cross-platfoem
    
      roles:   #通过facts自动收集的信息结合when判断来执行
    
        - {role: httpd_ubuntu, when: ansible_os_family="Ubuntu"}
    
        - {role: httpd_redhat, when: ansible_os_family="RedHat"}

    4. jinja2 模版自定义

    https://www.jianshu.com/p/ae74f5f39828

    二、ansible的roles介绍:
    
    ansible的roles用于层次性、结构化地组织palybook。roles能够根据层次型结构自动装载变量文件、tasks及handlers等。要使用roles只需要playbook中使用include指令即可。
    
    rules的组成:
    
    root@node1 playbook]# tree  roles/
    roles/ \ansible所有的信息都放到此目录下面对应的目录中
    └── nginx  \角色名称
        ├── default  \为当前角色设定默认变量时使用此目录,应当包含一个main.yml文件;
        ├── files  \存放有copy或script等模块调用的文件
        ├── handlers \此目录总应当包含一个main.yml文件,用于定义各角色用到的各handler
        ├── meta \应当包含一个main.yml,用于定义角色的特殊设定及其依赖关系;1.3及以后版本支持
        ├── tasks \至少包含一个名为main.yml的文件,定义了此角色的任务列表,可使用include指令
        ├── templates \template模块会自动在此目录中寻找Jinja2模板文件
        └── vars  \应当包含一个main.yml文件,用于定义此角色用到的变量
    roles介绍完了,那么我们就利用ansible的roles来配置nginx
    
    1、首先按照上面的要求创建要用到的目录
    
    [root@node1 playbook]# mkdir -pv roles/nginx/{tasks,files,templates,handlers,vars,meta,default}
    2、准备nginx配置文件
    
    准备nginx.conf配置文件,使用模板文件配置
    [root@node1 playbook]# cd roles/nginx/templates/
    [root@node1 ~]# ansible all -m setup | grep ansible_processor_cores
            "ansible_processor_cores": 1,  \获取ansible的要调用的相关函数
    [root@node1 playbook]# cd roles/nginx/templates/   \模板文件一定要放到此目录     
    [root@node1 templates]# vim nginx.conf 
    worker_processes {{  ansible_processor_cores }};  \调用获取到的函数
    准备nginx的default.conf文件
    [root@node1 playbook]# ls -l roles/nginx/files/
    -rw-r--r--. 1 root root 1290 Nov 12  2014 default.conf
    3、准备nginx的rpm包
    
    [root@node1 playbook]# ls -l  roles/nginx/files/
    -rw-r--r--. 1 root root   1290 Nov 12  2014 default.conf
    -rw-r--r--. 1 root root 319456 Mar 29 20:44 nginx-1.4.7-1.el6.ngx.x86_64.rpm
    4、在tasks目录中配置任务列表
    
    [root@node1 playbook]# cd  roles/nginx/tasks/
    [root@node1 tasks]# vim  main.yml 
      - name: copy nginx.rpm
        copy: src=nginx-1.4.7-1.el6.ngx.x86_64.rpm  dest=/tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm
      - name: install nginx
        shell: yum -y  install /tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm
      - name: provides nginx.conf
        template: src=nginx.conf  dest=/etc/nginx/nginx.conf
        tags: nginxconf
        notify:
        - server restart
      - name: provides default.conf
        copy: src=default.conf dest=/etc/nginx/conf.d/default.conf 
        tags: nginxconf
      - name: server start
        service: name=nginx enabled=true state=started
    5、在handlers目录中配置定义handler信息
    
    [root@node1 playbook]# cd roles/nginx/handlers/
    [root@node1 handlers]# vim  main.yml 
    - name: server restart
      service: name=nginx  state=restarted
    6、在roles同一级目录中创建site.yml文件
    
    [root@node1 playbook]# cat site.yml 
    - hosts: nginx
      remote_user: root
      roles:
      - nginx
    7、应用配置:
    
    [root@node1 playbook]# ansible-playbook site.yml 
  • 相关阅读:
    cf B. Number Busters
    hdu 5072 Coprime
    HDOJ迷宫城堡(判断强连通 tarjan算法)
    Entropy (huffman) 优先队列)
    Number Sequence
    Code (组合数)
    Round Numbers (排列组合)
    Naive and Silly Muggles (计算几何)
    SDUT 最短路径(二维SPFA)
    Pearls DP
  • 原文地址:https://www.cnblogs.com/yitianyouyitian/p/9188481.html
Copyright © 2020-2023  润新知