zoukankan      html  css  js  c++  java
  • ansible使用5-Variables

    变量命名

    支持数字、字母、下划线

    有效:foo_port, foo5
    无效:foo-port, foo port, foo.port, 12
    

    playbook定义

    - hosts: webservers
      vars:
        http_port: 80
    

    jinja2模板使用变量

    My amp goes to {{ max_amp_value }}
    template: src=foo.cfg.j2 dest={{ remote_install_path }}/foo.cfg
    

    Jinja2 Filters

    格式化数据

    {{ some_variable | to_nice_json }}
    {{ some_variable | to_nice_yaml }}
    

    使用条件表达式

    tasks:
    
      - shell: /usr/bin/foo
        register: result
        ignore_errors: True
    
      - debug: msg="it failed"
        when: result|failed
    
      # in most cases you'll want a handler, but if you want to do something right now, this is nice
      - debug: msg="it changed"
        when: result|changed
    
      - debug: msg="it succeeded"
        when: result|success
    
      - debug: msg="it was skipped"
        when: result|skipped
    

    强制变量定义

    {{ variable | mandatory }}
    

    变量默认值

    {{ some_variable | default(5) }}
    

    变量省略值

    - name: touch files with an optional mode
      file: dest={{item.path}} state=touch mode={{item.mode|default(omit)}}
      with_items:
        - path: /tmp/foo
        - path: /tmp/bar
        - path: /tmp/baz
          mode: "0444"
    

    列表

    # 最小值
    {{ list1 | min }}
    # 最大值
    {{ [3, 4, 2] | max }}
    # 唯一值
    {{ list1 | unique }}
    # 并集
    {{ list1 | union(list2) }}
    # 交集
    {{ list1 | intersect(list2) }}
    # 补集(存在list1,不存在list2)
    {{ list1 | difference(list2) }}
    # 对称差集 (不同时存在每个列表)
    {{ list1 | symmetric_difference(list2) }}
    

    版本比较

    {{ ansible_distribution_version | version_compare('12.04', '>=') }}
    
    # <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne
    # 版本分析strict=True,默认值false
    

    随机数

    {{ ['a','b','c']|random }} => 'c'
    {{ 59 |random}} * * * * root /script/from/cron
    {{ 100 |random(step=10) }}  => 70
    {{ 100 |random(1, 10) }}    => 31
    {{ 100 |random(start=1, step=10) }}    => 51
    

    洗牌(shuffle)

    {{ ['a','b','c']|shuffle }} => ['c','a','b']
    {{ ['a','b','c']|shuffle }} => ['b','c','a']
    

    其他

    # 列表转字符串
    {{ list | join(" ") }}
    
    # 文件全路径
    {{ path | basename }}
    
    # 目录全路径
    {{ path | dirname }}
    
    # 用户目录(~)全路径
    {{ path | expanduser }}
    
    # link的路径
    {{ path | readlink }}
    
    # Base64加解密
    {{ encoded | b64decode }}
    {{ decoded | b64encode }}
    
    # 文件的sha1sum
    {{ filename | sha1 }}
    

    bool

    - debug: msg=test
      when: some_string_value | bool
    

    正则

    vars:
      url: "http://example.com/users/foo/resources/bar"
    
    tasks:
        - shell: "msg='matched pattern 1'"
          when: url | match("http://example.com/users/.*/resources/.*")
    
        - debug: "msg='matched pattern 2'"
          when: url | search("/users/.*/resources/.*")
    
    # convert "ansible" to "able"
    {{ 'ansible' | regex_replace('^a.*i(.*)$', 'a\1') }}
    
    # convert "foobar" to "bar"
    {{ 'foobar' | regex_replace('^f.*o(.*)$', '\1') }}
    
    - hosts: app_servers
      vars:
           app_path: "{{ base_path }}/22"
    

    Facts

    '''bash
    ansible hostname -m setup

    {{ ansible_devices.sda.model }}
    {{ ansible_hostname }}
    '''

    Turning Off Facts

    - hosts: whatever
      gather_facts: no
    

    本地facts(自定义facts)

    # /etc/ansible/facts.d/preferences.fact
    [general]
    asdf=1
    bar=2
    
    # 命令
    ansible <hostname> -m setup -a "filter=ansible_local"
    
    # API
    "ansible_local": {
            "preferences": {
                "general": {
                    "asdf" : "1",
                    "bar"  : "2"
                }
            }
     }
    
    # 引用
    {{ ansible_local.preferences.general.asdf }}
    
    # 部署
    - hosts: webservers
      tasks:
        - name: create directory for ansible custom facts
          file: state=directory recurse=yes path=/etc/ansible/facts.d
        - name: install custom impi fact
          copy: src=ipmi.fact dest=/etc/ansible/facts.d
        - name: re-read facts after adding custom fact
          setup: filter=ansible_local
    

    Fact Caching

    {{ hostvars['asdf.example.com']['ansible_os_family'] }}
    
    # /etc/ansible/ansible.cfg
    [defaults]
    fact_caching = redis
    fact_caching_timeout = 86400
    # seconds
    
    yum install redis
    service redis start
    pip install redis
    

    Registered Variables

    - hosts: web_servers
    
      tasks:
    
         - shell: /usr/bin/foo
           register: foo_result
           ignore_errors: True
    
         - shell: /usr/bin/bar
           when: foo_result.rc == 5
    

    Accessing Complex Variable Data

    {{ ansible_eth0["ipv4"]["address"] }}
    {{ ansible_eth0.ipv4.address }}
    {{ foo[0] }}
    

    Magic Variables, and How To Access Information About Other Hosts

    {{ hostvars['test.example.com']['ansible_distribution'] }}
    
    {% if 'webserver' in group_names %}
       # some part of a configuration file that only applies to webservers
    {% endif %}
    
    {% for host in groups['app_servers'] %}
       # something that applies to all app servers.
    {% endfor %}
    
    # example
    {% for host in groups['app_servers'] %}
       {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
    {% endfor %}
    

    Variable File Separation

    ---
    
    - hosts: all
      remote_user: root
      vars:
        favcolor: blue
      vars_files:
        - /vars/external_vars.yml
    
      tasks:
    
      - name: this is just a placeholder
        command: /bin/echo foo
    
    ---
    # in the above example, this would be vars/external_vars.yml
    somevar: somevalue
    password: magic
    

    Passing Variables On The Command Line

    ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
    
    #example
    ---
    
    - hosts: '{{ hosts }}'
      remote_user: '{{ user }}'
    
      tasks:
         - ...
    
    ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"
    or
    --extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'
    or
    --extra-vars "@some_file.json"
    

    Variable Precedence: Where Should I Put A Variable?

    #组变量默认值在group_vars/all
    ---
    # file: /etc/ansible/group_vars/all
    # this is the site wide default
    ntp_server: default-time.example.com
    
    # 组变量,覆盖组默认变量
    ---
    # file: /etc/ansible/group_vars/boston
    ntp_server: boston-time.example.com
    
    # 主机变量,覆盖组变量
    ---
    # file: /etc/ansible/host_vars/xyz.boston.example.com
    ntp_server: override.example.com
    

    role variable precedence

    ---
    # file: roles/x/defaults/main.yml
    # if not overridden in inventory or as a parameter, this is the value that will be used
    http_port: 80
    
    # 不能覆盖默认值
    ---
    # file: roles/x/vars/main.yml
    # this will absolutely be used in this role
    http_port: 80
    
    # 使用这种方式覆盖默认值
    roles:
       - { name: apache, http_port: 8080 }
    
    roles:
       - { role: app_user, name: Ian    }
       - { role: app_user, name: Terry  }
       - { role: app_user, name: Graham }
       - { role: app_user, name: John   }
    
    # roles/common/vars/main.yml
    roles:
       - { role: common_settings }
       - { role: something, foo: 12 }
       - { role: something_else }
    
  • 相关阅读:
    Ensp模拟OSPF与ACL综合应用
    ENSP配置NAT
    Ensp配置RSTP
    EnspOSPF单区域配置
    Ensp配置静态路由和默认路由
    NotPron国外版
    MSF
    转换流
    梦之光芒1-14关通关秘籍
    php序列化与反序列化
  • 原文地址:https://www.cnblogs.com/liujitao79/p/4200646.html
Copyright © 2011-2022 走看看