美文网首页
52笔记---变量

52笔记---变量

作者: 口口帅日日 | 来源:发表于2019-10-11 20:10 被阅读0次

    1.什么是变量?
     以一个固定的字符串,表示一个不固定的值 
    
    2.定义变量
      vars 关键字
      vars_file 
    
    3.在Inventory主机清单中定义变量
      1)清单文件中直接定义
      2)准备hosts_vars group_vars目录
    
    4.通过外置参数传递(传递)-e
    5.变量冲突,优先级
    6.变量注册
    

    定义变量

    1.(关键字)配置文件内定义变量,但只能是该变量所在的hosts内能调用使用
    [root@manager project1]# cat f2.yml 
    - hosts: webservers
      vars:
      - file_name: playbook_vars
    
      tasks:
        - name: Create New File
          file:
            path: /tmp/{{ file_name }}
            state: touch
    
    2.(vars_file)共享,任何 *.yml文件都可以使用
    
    1570755668515.png
    [root@manager project1]# cat vars_file.yml 
    web_packages: httpd
    ftp_packages: vsftpd
    
      [root@manager project1]# cat f2.yml 
      - hosts: webservers
        vars:
          - file_name: playbook_vars
    
    #调用共享vars_file文件,只不过刚好文件名叫vars_file
    vars_files: ./vars_file.yml
    
    tasks:
      - name: Create New File
        file:
          path: /tmp/{{ file_name }}
          state: touch
    
      - name: Installed Packages {{ web_packages }}
        yum:
          name: "{{ web_packages }}"
          state: present
    

    在主机清单中定义变量(hosts)

    1.清单文件中直接定义  hosts文件定义
    [webservers]
    172.16.1.7
    172.16.1.8 
    [webservers:vars]
    file_name=hostsfile_group_vars
    
    2.创建hosts_vars  group_vars 目录
    [root@manager project1]# mkdir hosts_vars   #单个主机
    [root@manager project1]# mkdir group_vars   #主机组
    
     1)单个主机定义和使用方式 (host_vars能分别对不同的主机定义变量)
        [root@manager project1]# cat host_vars/172.16.1.7 
        host_vars_name: 172.16.1.7
    
        [root@manager project1]# cat host_vars/172.16.1.8 
        host_vars_name: 172.16.1.8
    
        [root@manager project1]# cat f4.yml 
        - hosts: webservers
    
        tasks:
          - name: Create New File
            file:
              path: /opt/{{ host_vars_name }}
              state: touch
    
     2)针对主机组定义的方式 
        #给指定的webserver组设定变量.其他组主机无法使用该变量
       [root@manager project1]# cat group_vars/webservers 
       group_host_vars: webservers
    
      [root@manager project1]# cat f5.yml 
      - hosts: webservers
        tasks:
          - name: Create New File {{ group_host_vars }}
            file:
              path:  /opt/{{ group_host_vars }}
              state: touch
    
      3)针对主机组定义的方式  (给所有的主机和主机组设定变量)
        [root@manager project1]# cat group_vars/all 
        group_host_vars: all
    
          [root@manager project1]# cat f5.yml 
          - hosts: webservers
        tasks:
         - name: Create New File {{ group_host_vars }}
            file:
              path:  /opt/{{ group_host_vars }}
              state: touch
    
    3)通过外置传参定义变量? -e
    [root@manager project1]# ansible-playbook -i hosts f6.yml  -e "web_vars=123"
    

    变量冲突,测试优先级

    1)在plabook中定义vars变量
    2)在playbook中定义vars_files变量
    3)在inventory主机定义变量
    4)在inventory主机组定义变量
    5)在host_vars中定义变量
    6)在group_vars中定义变量   单个组  all组
    7)通过执行命令传递变量
    
    
    --->
    优先级等级(由高到低):
    外置传入参数-->playbook(vars_files(共享)--->Vars(私有))--->host_Vars -->group_vars/group_name-->group_vars/all
    

    变量注册

    register关键字,可以将某个task任务结果存储到变量中,最后使用debug输出变量内容,可用于后续排障
    [root@manager project1]# cat f8.yml 
    - hosts: webservers
      tasks:
        # System_Status=$(netstat -lntp)
    - name: Get Network Status
        shell: netstat -lntp | grep "nginx"
        register: System_Status      #shell执行的命令赋值于此 
    
        # echo "$System_Status"
    - name: Debug output Variables
        debug:
          msg: "{{ System_Status.stdout_lines }}"  #将赋值的结果输出出来
    

    facts变量

    image.png
    Ansible facts是在被管理主机上通过ansible自动采集发现的变量,facts包含每台特定的主机信息,比如:主机名 IP地址 系统版本 CPU数量 内存状态等等
    使用场景
      1)检查cpu信息,生成不同的nginx配置文件
            A: 1核心    work_process 1;
            B: 2核心    work_process 2;
      2)检查名称信息,生成不同的zabbix配置文件
                zabbix_agent
        Server:   ===> 指向172.16.1.61
        Hostname:      web01   web02
    
    [root@manager project1]# cat ./file/zabbix_agent.conf.j2 
    Server={{ zabbix_server_ip }}
    ServerActive={{ zabbix_server_ip }}
    Hostname={{ ansible_hostname }}
    
    [root@manager project1]# cat f11.yml 
    - hosts: webservers
      vars:
      - zabbix_server_ip: 172.16.1.61
      tasks:
    - name: Configure zabbix-agent.conf
      template:
        src: ./file/zabbix_agent.conf.j2
        dest: /tmp/zabbix-agent.conf
        
    3)检查内存状态,生成不同的memcached的配置文件
      [root@manager project1]# cat f12.yml 
      - hosts: webservers
      tasks:
        - name: Installed Memcached Server
          yum:
            name: memcached
            state: present
    
        - name: Configure Memcached Server
          template:
            src: ./file/memcached.j2
            dest: /etc/sysconfig/memcached
          notify: Restart Memcached Server
    
        - name: System Memcached Server
          systemd:
            name: memcached
            state: started
            enabled: yes
    
      handlers:
        - name: Restart Memcached Server
          systemd:
            name: memcached
            state: restarted
     
    [root@manager project1]# cat file/memcached.j2 
    PORT="11211"
    USER="memcached"
    MAXCONN="1024"
    CACHESIZE="{{ ansible_memtotal_mb //2 }}"
    OPTIONS=""
    

    判断语句

    * 1.centos和ubuntu系统都需要安装httpd,  判断系统.
    * 2.安装软件仓库,只有web组的安装webtatic其他的主机全部跳过.
    * 3.TASK任务, TASK1任务执行成功,才会执行TASK2  
    
    #根据不同的系统,安装不同的服务
      - hosts: webservers
      tasks:
    - name: CentOS Installed Httpd Server
      yum:
        name: httpd
        state: present
      when: ( ansible_distribution == "CentOS" )
    
    - name: Ubuntu Installed Httpd Server
      yum:
        name: httpd2
        state: present
      when: ( ansible_distribution == "Ubuntu" )
    
    #安装软件仓库,只有web组的安装webtatic其他的主机全部跳过.
    [root@manager project1]# cat f16.yml 
    - hosts: all
      tasks:
      - name: Add Nginx Yum Repository
        yum_repository:
          name: nginx
          description: Nginx Repository
          baseurl: http://nginx.org/packages/centos/7/$basearch/
        when: ( ansible_hostname is match ("web*"))
    
    #TASK任务, TASK1任务执行成功,才会执行TASK2  
    [root@manager project1]# cat f17.yml 
    - hosts: webservers
      tasks:
    
        - name: Check Httpd Server
          command: systemctl is-active httpd
          register: Check_Httpd
          ignore_errors: yes
    
    #判断Check_Httpd.rc是否等于0,如果为0则执行任务,否则不执行
        - name: Restart Httpd Server
          systemd:
            name: httpd
            state: restarted
          when: ( Check_Httpd.rc == 0 )
    

    循环语句

    #一次启动多个服务
    [root@manager project1]# cat f18.yml 
    - hosts: webservers
      tasks:
        - name: Systemd Nginx Status
          systemd:
            name: "{{ item }}"    #调用的变量也不变,也是固定
            state: started
    
    #固定的语法格式
          with_items:
            - nginx
            - php-fpm
    
    
    #一次拷贝多个文件
    [root@manager project1]# cat f19.yml
    - hosts: webservers
      tasks:
        - name: Configure nginx.conf
          copy:
            src: '{{ item.src }}'
            dest: '{{ item.dest }}'
            mode: '{{ item.mode }}'
          with_items:
          - { src: ./file/nginx.conf.j2, dest: /etc/nginx/nginx.conf, mode: '0644' }
            - { src: ./file/kold.oldxu.com.conf.j2, dest: /etc/nginx/conf.d/kold.oldxu.com.conf, mode: '0600' }
    
    #创建多个用户(标准型)
    [root@manager project1]# cat f20.yml 
    - hosts: webservers
      tasks:
        - name: Create User
          user:
            name: "{{ item }}"
    
          with_items:
            - test1
            - test2
            - test3
            - test4
     
    #创建tt1 --> bin  tt2 -->root tt3 --->adm   附加组
    [root@manager project1]# cat  f20.yml 
    - hosts: webservers
      tasks:
        - name: Create User
          user:
            name: "{{ item.name }}"
            groups: "{{ item.groups }}"
    
          with_items:
            - { name: tt1, groups: bin }
            - { name: tt2, groups: root }
            - { name: tt3, groups: adm }
    

    1.标准循环                   --->居多
    item
    with_items:
       - test
    2.字典循环:                   --->居多
    itme.name
    with_items:
        - { name: test }
    
    
    3.变量循环
    - hosts: webservers
      tasks:
        - name: ensure a list of packages installed
          yum: name={{ packages }} state=present
          vars:
            packages:
              - httpd
              - httpd-tools
    

    handlers

    [root@manager project1]# cat f22.yml 
    - hosts: webservers
      tasks:
    
    - name: Installed Nginx and PHP Packages
      yum:
        name: nginx
        state: present
    
    - name: Configure nginx.conf 
      template:
        src: ./file/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      #监控-->changed状态-->通知-->handlers--->name-->Restart Nginx Server
      notify: Restart Nginx Server
      #notify:
      #  - Restart Nginx Server
      #  - Restart php Server
    
    - name: Systemd Nginx Server
      systemd:
        name: nginx
        state: started
        enabled: yes
    #当nginx或php配置文件发生变更才会触发此操作
      handlers:
    - name: Restart Nginx Server
      systemd:
        name: nginx
        state: restarted
    
    #3.handlers注意事项
    1)无论多少个task通知了相同的handlers,handlers仅会在所有tasks结束后运行一次。
    2)只有task发生改变了才会通知handlers,没有改变则不会触发handlers.
    3)不能使用handlers替代tasks、因为handlers是一个特殊的tasks。
    
    
    变量->facts-->判断-->循环
    
    * 1.安装Rsyncd服务  (循环)
    * 2.安装Redis   (bind  本地IP地址)    facts 
    * 3.安装NFS      (配置文件,创建目录,客户端挂载)    变量
    

    (reverse-i-search)`setup': ansible localhost -m setup -i hosts |less

    相关文章

      网友评论

          本文标题:52笔记---变量

          本文链接:https://www.haomeiwen.com/subject/oddxmctx.html