Is it possible to define playbook-global variables in Ansible?

前端 未结 4 1994
独厮守ぢ
独厮守ぢ 2021-02-01 12:44

I have a large Ansible playbook where Docker images are built when running it. I am using an increasing number as the tag to version them. Currently, I have to specify this in e

相关标签:
4条回答
  • 2021-02-01 13:18

    If the tag/version you are using is applicable to all hosts, then using group_vars/all is a viable option.

    If the revision numbers are specific to each host entries in a host_vars/host_name file might be better.

    If you want to read and initial var and then increment it after each play that becomes a bit more difficult to persist that information across plays (or each -hosts as you say) in the playbook. For example if you were looking to deploy N docker instances you might do some dynamic inventory magic like this:

    - hosts: localhost
      tasks:
      - add_host: name=docker_{{item}} groups="dockers,other" tag={{item}}
        with_sequence: start={{ext_def_start}} count={{ext_def_num}}
    
    
    - hosts: docker_*
      tasks:
      - debug: var=tag
    
    0 讨论(0)
  • 2021-02-01 13:18

    Yes, global vars are possible like this,

    sample splunk setup playbook

    splunk/
       setup_splunk_playbook.yaml
       roles/base
               /tasks/main.yaml
               /tasks/install.yaml
             search_head
               /tasks/configure.yaml
             indexer
               /tasks/configure.yaml
             some_other_role
               /tasks/some_task.yaml
       hosts
       config.yaml
    

    Place your vars into config.yaml

    cat splunk/config.yaml

    --- 
    # global Splunk variables
    splunk_version: 7.0.0
    

    in your playbook, include the Roles

    cat setup_splunk_playbook.yaml

    - hosts: "search_heads"  
      become_user: root
      become: true
      gather_facts: true
    
      roles:
        - base
        - search_head
    

    in your Role, include the Global Vars inside a Task

    cat roles/base/tasks/main.yaml

    ---
    # install Splunk Base
    
    - name: include vars
      include_vars: "{{ playbook_dir }}/config.yaml"
    
    - include: install.yaml
    

    vars are accessible in tasks now,

    cat roles/base/tasks/install.yaml

    - name: echo version
      debug: splunk version is {{ splunk_version }}
    
    0 讨论(0)
  • 2021-02-01 13:26

    Ansible has a default all group that, funnily enough, contains all the hosts in the inventory file.

    As such you can do like with any host groups and provide group_vars for the host group.

    As shown in the previous link these can be defined directly in the inventory file or they can be contained in a separate file named after the group in a group_vars directory at the same directory level as the inventory file.

    An example directory structure might then look something like:

    -ansible
     |--inventory
     |  |--group_vars
     |  |  |--all
     |  |  |--dev
     |  |  |--test
     |  |  |--prod
     |  |  |--webservers
     |  |  |--databases
     |  |--dev
     |  |--test
     |  |--prod
     |--roles
      ...
    

    Your dev inventory file might then look something like:

    [dev:children]
    webservers
    databases
    
    [webservers]
    web1.dev
    web2.dev
    
    [databases]
    database-master.dev
    database-slave.dev
    

    All of these hosts will now pick up any host specific config (that could be defined either in line or, just like with group_vars can be put into a host_vars folder) and also config for the specific groups they are in such as webservers and then the groups they also inherit from such as dev but also, by default, all.

    This can then be used to configure things in a coarser way than per host.

    Things such as NTP servers may want to be defined in all, while DNS servers may want to be defined at the environment level (if your network is segmented into dev, test and production they may need different DNS servers setting in /etc/resolv.conf) while different types of servers may have different configurations around things such as lists of packages to be installed. Finally, some things may need to be host specific such as setting the MySQL server id in a replication group.

    If, instead, you only want to define playbook global settings rather than across the inventory (and so could be accessed by other playbooks) then you simply need a vars block in your play definition like so:

    - hosts: webservers
      vars:
        http_port: 80
      tasks:
        - name: Task1 to be ran against all the webservers
          ...
    

    As mentioned before, you can always use the all group here too:

    - hosts: all
      vars:
        ntp_pool:
          - ntp1.domain
          - ntp2.domain
      tasks:
        - name: Task1 to be ran against all the servers
          ...
    

    In general though, I would strongly recommend using roles to structure what things are ran against certain hosts and then using the inventory to explain what servers are what type and then use a group_vars dir at the inventory level to contain all the variables for those groups of hosts. Doing things this way will help you keep things in sensible places and allow you to easily reuse your code base.

    0 讨论(0)
  • 2021-02-01 13:30

    I know this might not answer OP's query exactly, but for people googling to set global variables(lists/arrays) so that they don't have to set them in each task this might be pretty handy.

    Its surprisingly simple, Say you have a list of domains that you need to pass, I named the variable goofy just to signify that it could be anything.

    - hosts: [yourhostlistgoeshere]
      remote_user: root
      vars:
        domainslisto:
           - site1.com
           - website2.xyz
    
    ....
    
    
    
      tasks:
        - name: copy vhosts
          template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ item }}.conf
          with_items: "{{ domainslisto }}"
    
        - name: a2ensite {{ item }}
          command: a2ensite {{ item }}
          with_items: "{{ domainslisto }}"
    
    0 讨论(0)
提交回复
热议问题