zoukankan      html  css  js  c++  java
  • ansible 剧本角色

    实验:
    vim /etc/ansible/hosts
    [test01]
    192.168.200.112
    192.168.200.113
    保存退出
    vim /etc/ansible/test.yml    //创建test.yml文件
    ---                                      //开头格式(可忽略)
    - host: tes01                     //表示对test01(192.168.200.112)的操作
      remote_user: root       //远端执行用户身份root
      tasks:                          //任务列表
        - name: adduser        //任务名称
          user: name=user2 state=present   //执行user模块创建用户
          reglster: print_result #将之前命令的输出结果保存在变量print_result里
          tags:                        //创建tag标签
          - testaaa                  //tag标签为testaaa
        - debug: var=print_result   //将变量的值作为debug输出出来
        - name: addgroup      //任务名称
          group: name=root system=yes      //执行group模块创建组
          tags:                //创建tag标签
          - testbbb                //tag标签为testbbb
    - hosts: test02
      remote_user: root
      tasks:
        - name: copy file                //任务名称
          copy: src=/etc/passwd dest=/home    //执行copy模块复制文件
          tags:
          - testccc
    ...
    保存与退出
    语法检查:
    ansible-playbook --syntax-check /etc/ansible/test.yml
    预执行测试:
    ansible-playbook -C /etc/ansible/test.yml
    ansible-playbook --list-hosts  /etc/ansible/test.yml
    执行:
    ansible-playbook  /etc/ansible/test.yml
    ---------------------------------------------------------------------------
    触发器:
    ansible test01 -m shell -a 'netstat -aupt |grep 80'
    vim /etc/ansible/httpd.yml
    ---
    - hosts: laowang
      remote_user: root
      tasks:
        - name: chang port
          command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
          notify:       (完成任务后调用restart httpd触发器)
            - restart httpd      (调用触发器名字)
      handlers:       (配置触发器)
        - name: restart httpd     (指定触发器名字)
          service: name=httpd state=restarted (指定触发器条件为重启httpd)
    ...
    保存退出
    ansible-playbook -C /etc/ansible/httpd.yml   //检测
    ansible-playbook  /etc/ansible/httpd.yml     //执行
    ---------------------------------------------------------------------------------------------------------
    实验案例: 被管理主机安装mariadb 安装后上传提前准备好的配置文件,到远程主机,重启服务,并创建testdb 数据库 允许test用户对其拥有所有权限
    【1】被管理端配置yum源
    cd /etc/yum.repos.d/
    ls
    backup Centos-Media.repo
    yum clean all
    【2】配置数据库角色
    mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
    vim /etc/ansible/mariadb.yml (建立剧本)
    ---
    - hosts: laowang
      remote_user: root
      roles:    (角色)
        - mariadb
    ...
    cd /etc/ansible/roles/mariadb/
    vim tasks/main.yml      (创建任务)
    - name: install mariadb      (安装mariadb)
      yum: name=mariadb-server state=present
    - name: move config file     (备份主配置文件)
      shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
    - name: provide a new config file   (拷贝files的主配置文件到客户机/etc/my.cnf下)
      copy: src=my.cnf dest=/etc/my.cnf
    - name: reload mariadb     (重启mariadb)
      shell: systemctl restart mariadb
    - name: create database testdb    (建立库,并且授权账号)
      shell: mysql -uroot -e "create database testdb;grant all privileges on testdb.* to 'test'@'192.168.200.%' identified by 'test123';flush privileges;"
      notify:         (配置触发器)
      - restart mariadb
    保存退出
    vim handlers/main.yml (创建触发器)
    - name: restart mariadb
      service: name=mariadb state=restarted
    保存退出
    cp /etc/my.cnf /etc/ansible/roles/mariadb/files/ (准备配置文件)
    vim files/my.cnf 
    (编辑配置文件,在末尾标记下,在客户机上查看配置文件是否变化)
    保存退出
    ansible-playbook -C /etc/ansible/mariadb.yml (预执行)
    ansible-playbook  /etc/ansible/mariadb.yml (部署)

    --------------------------------------------------------------------------------------------------------
    1、执行配置文件
    Playbook配置文件使用YAML语法。Playbook配置文件类似于shell脚本,是一个YAML格式的文件。YAML文件的扩展名通常为.yaml或 .yml
    YAML语法和其他高级语言类似,其结构通过缩进来展示,通过“-”来代表选项,通过冒号“:”来分隔建和值。整个文件以“---”开始并以“...”结束,-和:后面必须有空格,而且要注意缩进和对齐
    执行结果输出
    在用playbook进行ansible模块操作的时候,并没有命令的执行结果输出,默认被隐藏了。可以通过register模块追加输出命令的执行结果8、执行输出
    在用playbook进行ansible模块操作的时候,并没有命令的执行结果输出,默认被隐藏了。可以通过register模块追加输出命令的执行结果
    ---         (开头,可忽略)
    - hosts:test01       (操作的主机,分组)
      remote_user: root     (在被操控的主机上以什么身份运行)
      tasks:        (任务)
        - name: adduser     (任务名)
          user: name=user2 state=present  (调用user模块,建立用户)
          register: print_result    (将之前命令的输出结果保存在变量print_result里)
          tags:        (任务标签)
            - testaaa       (任务标签名)
        - debug: var=print_result    (将变量的值作为debug输出出来) 
        - name: addgroup     (任务名)
          group: name=root system=yes  (调用group模块,建立系统组)
          tags:        (任务标签)
            - testbbb       (任务标签名)
    - hosts: test02      (操作的主机,分组)
      remote_user: root     (在被操控的主机上以root身份运行)
      tasks:        (任务)
        - name: copy file     (任务名)
          copy: src=/etc/passwd dest=/home (调用copy模块)
          tags:        (标签)
            - testccc       (标签名)
    ...         (结尾,可忽略)
    Playbook的核心元素:
    1、hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etc/ansible/hosts中的分组信息
    2、remote_user:远程主机上,运行此任务的什么默认为root
    3、tasks:任务,即定义的具体任务,有模块定义的操作列表
    4、handlers:触发器,类似tasks,只是在特定的条件下才会触发任务。某任务的状态在运行后为changed时,可以通过“notify”通知给相应的handlers进行触发执行。
    5、roles:角色,将hosts剥离出去,有tasks,handlers等组成的一种特定的结构集合
    用法:
    Playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行
    格式:ansible-playbook [option] /PTAH/TO/PLAYBOOK.yaml
    其中[option]部分的功能包括:
    【1】--syntax-check:检测yaml文件的语法
    【2】-C (--check) :测试,不会改变主机的任何配置
    【3】 --list-hosts:列出yaml 文件影响的主机列表
    【4】--list-tasks: 列出yaml文件的任务列表
    【5】--list-tags:列出yaml文件的标签
    【6】-t TAGS(--tags=TAGS): 表示只执行指定标签的任务
    【7】--skip-tags=SKIP_TAGSS:表示除了指定标签任务,执行其他任务
    【8】--start-art-task=START_AT:从指定任务开始往下运行
    2、触发器
    需要触发才能执行的任务,当之前定义在tasks的任务执行完成后,若希望在基础上触发其他的任务,这是需要定义handlers。例如,当通过ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,一边配置文件生效,handlers触发器具有以下优点
    1、handlers是Ansible提供的条件机制之一,handlers和task很类似,但是他在被task通知的时候才会触发执行
    2、handlers只会在所有任务执行完成后执行,而且即使被通知了多次,它也只会执行一次,handlers按照定义的顺序依次执行
    httpd端口更改与触发器启动服务
    ---
    - hosts: laowang
      remote_user: root
      tasks:
        - name: chang port
          command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
          notify:       (完成任务后调用restart httpd触发器)
            - restart httpd      (调用触发器名字)
      handlers:       (配置触发器)
        - name: restart httpd     (指定触发器名字)
          service: name=httpd state=restarted (指定触发器条件为重启httpd)
    ...
    3.角色
    将多种不同的tasks的文件集中存放在某个目录下,则该目录就是角色,角色一般存放在/etc/ansible/roles/目录中,可通过ansible的配置文件来调整默认的角色目录。/etc/ansible/roles目录下有很多子目录,其中每一个子目录对应一个角色。每个角色也有自己的目录结构。
    每个角色的定义,以特定的层级目录结构进行组织
    1、files:存放copy或script等模块调用的文件
    2、templates:存放template模块快查找所需要的模板文件的目录,如mysql配置文件等模板
    3、tasks:任务存放目录
    4、handlers:存放相关触发执行器的目录
    5、vars:变量存放的目录
    6、meta:用于存放此角色元数据
    7、default:默认变量存放目录,文件中定义了此角色使用的默认变量
    目录中tasks,handlers,vars,meta,default至少应该包含一个main.yml,该目录下也可以有其他的yum文件,但需要在main.yml文件中用include指定将其他的.yml文件包含进来。
    有了角色之后,可以直接在yaml文件中(playbook配置文件)
    可以只调用一个角色,也可以调用多个角色,当定义了角色后,用ansible-playbook PLAYBOOK文件执行即可,此时ansible会到角色集合的目录(/etc/ansible/roles)去找mysql和httpd目录,然后依次运行mysql目录和httpd目录下的所有代码
    被管理主机自动安装Mriadb,安装完成后上传提前准备好的配置文件到远端主机。重启服务,然后新建testdb数据库,并允许test用户对其拥有所有权限
    1。被管理主机要有yum仓库
    2、配置数据库角色
    mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
    vim /etc/ansible/mariadb.yml (建立剧本)
    ---
    - hosts: laowang
      remote_user: root
      roles:    (角色)
        - mariadb
    ...
    cd /etc/ansible/roles/mariadb/
    vim tasks/main.yml      (创建任务)
    - name: install mariadb      (安装mariadb)
      yum: name=mariadb-server state=present
    - name: move config file     (备份主配置文件)
      shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
    - name: provide a new config file   (拷贝files的主配置文件到客户机/etc/my.cnf下)
      copy: src=my.cnf dest=/etc/my.cnf
    - name: reload mariadb     (重启mariadb)
      shell: systemctl restart mariadb
    - name: create database testdb    (建立库,并且授权账号)
      shell: mysql -uroot -e "create database testdb;grant all privileges on testdb.* to 'test'@'192.168.200.%' identified by 'test123';flush privileges;"
      notify:         (配置触发器)
      - restart mariadb
    vim handlers/main.yml (创建触发器)
    - name: restart mariadb
      service: name=mariadb state=restarted
    cp /etc/my.cnf /etc/ansible/roles/mariadb/files/ (准备配置文件)
    vim files/my.cnf (编辑配置文件,在末尾标记下,在客户机上查看配置文件是否变化)
    ansible-playbook -C /etc/ansible/mariadb.yml (预执行)
    ansible-playbook  /etc/ansible/mariadb.yml (部署)
    4、变量
    4.1在playbook中使用自定义变量
    vim /etc/ansible/test_vars.yml
    - hosts: laowang  
      vars:         (定义变量)
      - nm: "cloud"       (第一个nm变量)
        age: "3"        (第二个age变量)
      tasks:
      - name: "{{ nm }}"      ({{}}两对大括号引用变量,变量名两头空格)
        shell: echo "myname {{ nm }},myage{{ age }}"
        register: var_result
      - debug: var=var_result
    4.2在playbook中使用ansible的内置变量
    使用ansible 组名或者all全部 -m setup | more 查看 ansible 内置变量
    vim /etc/ansible/test_setupvars.yml (建立内置变量测试)
    - hosts: laowang
      gather_facts: True  (使用ansible内置变量)
      tasks:
      - name: setup var
        shell: echo "ip {{ ansible_ens33['ipv4']['address'] }} cpu {{ ansible_processor_count }}"
        register: var_result
      - debug: var=var_result
    ansible-playbook  /etc/ansible/test_setupvars.yml
    5、Template模板
    配置文件如果使用copy模块去下发的话,那配置都是一样的;如果下发的配置文件里有可变的配置,需要用到template模块
    模板后缀一般为xxx.j2(因为它使用jinjia2)
    5.1、利用template模块下发可变的配置文件
    vim /tmp/test      (建立模板)
    my name is {{ myname }}
    my ip is  {{ ansible_ens33['ipv4']['address'] }} ({{ ansible_all_ipv4_addresses[1] }}这个方法不对,会匹配到virbr0的IP)
    vim /etc/ansible/filevars.yml  (编写模板下发脚本)
    - hosts: all
      gather_facts: True   //启用内置变量
      vars:
      - myname: "cloud"
      tasks:
      - name: template test
        template: src=/tmp/test dest=/root/test
    ansible-playbook  /etc/ansible/filevars.yml (测试)
    【但是IP会显示virbr0网卡的IP,不知道怎么回事】
    5.2、下发配置文件里面使用判断语法
    vim /tmp/if.j2   (建立判断测试文件)
    {% if PORT %}  (如果PORT端口存在)
    ip=0.0.0.0:{{ PORT }} (则为0.0.0.0端口)
    {% else %}   (否则)
    ip=0.0.0.0:80   (为0.0.0.0:80)
    {% endif %}   (结尾)
    vim /etc/ansible/test_ifvars.yml  (建立测试剧本)
    - hosts: laowang  
      vars:
      - PORT: 90   (PORT变量为90)
      tasks:
      - name: jinja2 if test
        template: src=/tmp/if.j2 dest=/root/test
    ansible-playbook  /etc/ansible/test_ifvars.yml  (运行剧本)
    在客户机上测试 
    cat /root/test
    ip=0.0.0.0:90   (查看客户机测试结果)
    修改test_ifvars.yml端口
    vim /etc/ansible/test_ifvars.yml
    - hosts: laowang
      vars:
      - PORT:
      tasks:
      - name: jinja2 if test
        template: src=/tmp/if.j2 dest=/root/test
    ansible-playbook  /etc/ansible/test_ifvars.yml
    在客户机上测试
    cat /root/test
    ip=0.0.0.0:80
    如果端口存在,则为0.0.0.0:变量端口号
    如果端口不存在,则为0.0.0.0:80
  • 相关阅读:
    开始制作国产的 scratch
    七个对我最重要的职业建议(译文)
    不要在功能上竞争
    来看看机智的前端童鞋怎么防盗
    悬疑塑成天才?
    Linux常用命令之重启关机命令
    Linux常用命令之网络命令
    Linux常用命令之文件搜索命令
    Linux常见命令之权限管理命令
    Linux常见命令之文件处理命令
  • 原文地址:https://www.cnblogs.com/elin989898/p/11988937.html
Copyright © 2011-2022 走看看