zoukankan      html  css  js  c++  java
  • ansible之变量

    一、常用系统变量

      1. loop   #表示循环,去读循环体里的变量固定使用{{item}},item是个字典对象item.key=value,例如如下playbook内容:

    ---
    - name: test loop
      hosts: localhost
      connection: local
      gather_facts: no
    
      tasks:
        - name: debug loop
          debug:
            msg: "{{item.A1}}"
          loop:
            - A: a
              A1: a1
              A2: a2
            - B: b
              A1: b1
              A2: b2
            - C: c
              A1: c1
              A2: c2
            - D: d
              A1: d1
              A2: d2
    A: a
    A1: a1
    A2: a2
    以上成为一块,即一个item,符号"-"为循环体块的标志,{{item.A1}}的值,即分别为a1,b1,c1,d1

       结果输出:

      

    playbook文件print_info2.yaml信息如下:
    ---
    - name: test loop
      hosts: localhost
      connection: local
      gather_facts: no
      vars:
        my_list:
          - a
          - b
          - c
          - 1
    
      tasks:
        - name: debug loop output
          debug:
            msg: "The {{index}} one is {{item}}"
          loop: "{{my_list}}"
          loop_control:
            index_var: index
    循环列表,打印元素索引号

      2. when   当条件满足时,执行

      官方文档说明:https://docs.ansible.com/ansible/2.7/user_guide/playbooks_conditionals.html#playbooks-conditionals

    二、在主机列表文件里定义变量

      默认主机列表文件位置/etc/ansible/hosts,可自定义局部主机配置文件位置

      如上图,展示了两种变量表现形式:

      1.基于组的变量:组内部的所有成员主机都获得此变量

    [ios:vars]    #代表基于ios组的变量集
    passwd=123456   #变量名passwd,值123456,由组内成员共享
    ansible_connection=network_cli    #2.5版本后推出新的连接方式,代替provider
    ansible_network_os=ios    #告知ansible是基于ios的系统
    ansible_use=cisco   #ssh用户名cisco
    ansible_ssh_pass=cisco  #ssh登录密码cisco
    ansible_become=yes    #是否进入特权模式,yes是
    ansible_become_method=enable  #进入方法:enable
    ansible_become_pass=cisco    #enable密码cisco
    
    
    
    #注意:ansible_开头一般都是众所周知的变量名

      2.基于单个主机的变量

      每一台主机设备所在行,直接变量=值的方式表示

    r5a ansible_host=192.168.62.45 user=r5  #主机名r5a,变量ansible_host=192.168.62.45 ,变量user=r5

     

        

    三、在playbook里定义变量

     

    四、 在host_vars,group_vars文件中定义变量

      4.1 此方法可定义较复杂变量,定义方法如下:

    #1.创建host_vars和group_vars两个文件夹
    (ps:上述两个文件夹要么创建于playbook下,要么创建于my_inventory此类文件设备同目录下。一般情况,playbook和inventory主机配置文件都是在同一目录下,所以无需太在意)
    [root@localhost test_ansible]# pwd
    /root/test_ansible
    [root@localhost test_ansible]# 
    [root@localhost test_ansible]# mkdir group_vars
    [root@localhost test_ansible]# 
    [root@localhost test_ansible]# mkdir host_vars
    
    #2.文件夹内创建对应文件
    ##2.1 group_vars存放基于组名的文件
    例如:在我们的inventory主机配置清单里,定义了ios组,则关于这个组的变量定义,创建一个ios.yaml的YAML文件,文件定义的变量就会应用到整个ios组,以及组下的所有成员
    
    ##2.2 host_vars存放基于设备主机的文件
    例如:在inventory主机配置清单里,有一台主机r1,创建一个r1.yaml的YAML文件,文件定义的变量就会自动与r1关联

      4.2 示例说明

      在host_vars/localhost.yaml文件里

    ---
    content: hello world!
    physical_port:
    - int_name: GE1/0/1 int_ip: 192.168.12.2/24 neighbor_name: r3 - int_name: GE1/0/2 int_ip: 192.168.23.2/24 neighbor_name: r1

      编辑playbook文件loop2.yaml

    ---
    - name: test loop
      hosts: localhost
      connection: local
      gather_facts: no
      
      tasks:
        - name: debug loop
          debug:
            msg: "{{content}}"

      结果截图:

    五、不同位置变量优先执行顺序

    playbook里的定义的vars > host_vars目录下的主机文件  > inventory清单主机文件里的主机行变量 > group_vars目录下的组文件 > inventory清单主机文件里的组[xx:vars]组变量

    六、变量注意事项

    #1.ansible_xx一般为内部变量,有些可被自动调用,例如ansible_user和ansible_ssh_pass会自动被ansible_connection:network_cli调用
    
    #2.在playbook里定义host:为主机名a而非组名A时,如果该主机a归属在组名A里,则组A的组变量也能被a调用
    
    #3.自定义ansible.cfg为b,存放在要运行playbook的目录下,配置文件b里的变量只需定义与主配置文件ansible.cfg不一样的即可,因为ansible在运行时,在配置文件b找不到会去ansible.cfg里找
  • 相关阅读:
    java四种线程池的使用
    @Autowired@Resource@Qualifier的区别
    Unsupported major.minor version 52.0解决办法
    CentOS7配置防火墙
    redis 集群搭建
    excludepathpatterns 无效
    解决 SpringBoot 没有主清单属性
    Java Web应用中调优线程池的重要性
    spring boot application properties配置详解
    Class path contains multiple SLF4J bindings.
  • 原文地址:https://www.cnblogs.com/lisenlin/p/10876971.html
Copyright © 2011-2022 走看看