palybook的变量&变量文件

变量设置方式

变量文件内容必须以YAML的格式编写
变量文件或配置文件内容如果是以---开头,表明是以yaml格式定义,则变量格式为:key:value
变量文件或配置文件内容如果是普通的变量文件,则变量格式为:key=value

1、变量文件:
@1、/etc/ansible/vars.yml 【变量文件后缀没有要求,可以是vars.cfg】
var1: httpd
var2: vsftpd
@2、也可以是如下格式:
sms:
  name: jerry
  uid: 4526
引用变量{{ sms.name }}
@3、也可以是再设置一层格式:
users:
  sms:
    name: Tom
    uid: 4521
引用变量name的值为:{{ users.sms.name }}
@4、也可以是变量列表格式:
var1: httpd
var2: 
  - vsftpd
  - appache

2、脚本引用:
---
- name: testvar
  hosts: webserver
  remote_user: root
  vars_files:
    - /etc/ansible/vars.yml

  tasks:
    - name: install pakge
      yum: name={{ var1 }} state=present
    
    - name: create file
      file: path=/home/software/{{ var2 }}.txt state=touch
引用变量文件固定格式:
  vars_files:
    - /etc/ansible/vars.yml

注:变量引用优先级:命令行定义>Playbook中定义>hosts主机文件定义

playbook中变量的使用

1、变量名:仅能由字母、数字和下划线组成,且只能以字母开头
2、变量来源1:
     @1、ansible hosts -m setup 远程主机的所有系统变量都可直接调用【setup是一个模块,里面内置了很多系统变量可调用】
     @2、在/etc/ansible/hosts中定义:
             普通变量:主机组中的主机单个定义,优先级高于公共变量
             公共变量:针对主机组中所有主机定义统一变量
3、变量来源2:通过命令行定义变量,优先级最高 -e 参数指定
      ansible-playbook -e varname=value
4、变量来源3:在playbook文件中定义:
      vars:
          - var1: value1
          - var2: value2
5、变量来源4:在roles目录里定义:

举例:
1、命令行定义变量
---
- name: install
  hosts: webserver
  remote_user: root

  tasks:
      - name: install httpd
        yum: name={{ pkname1 }}  【变量的引用:{{ varname }}用双花括号,中间带空格为了规范】
      - name: install vcfpd
        yum: name={{ pkname2 }}
命令行定义变量:ansible-playbook -e 'pkname1=httpd pkname2=vcfpd' file.yml

2、playbook中定义变量:
---
- name: install
  hosts: webserver
  remote_user: root
  vars:
    - pkname1: httpd
    - pkname2: vcfpd
  tasks:
      - name: install httpd
        yum: name={{ pkname1 }}
      - name: install vcfpd
        yum: name={{ pkname2 }}


3、hosts文件主机清单中定义变量:
【单个主机单独定义变量】
[webserver] 
192.168.1.18  portname=80
192.168.1.14  portname=81
---
- name: create user
  hosts: webserver
  remote_user: root

  tasks:
     -name: create
      user: name=www.{{ portname }}.node

【主机组定义变量】
[webserver]
192.168.1.18
192.168.1.14  portname=81 【当单个主机仍有变量定义时,该优先级高于主机组的变量定义】
[webserver:vars]   【主机组变量格式固定的: 组名:vars】
portname=80

playbook中变量的使用2

1、变量列表,列表项都最好用"-" 开头,为了规范化
-name: test
  hosts: webapp
  remote_user: root
  vars:
    - var1: value1  【变量的列表项,用"-" 开头】
    - var2: value2
  tasks:
    - name: **
      module: ** 
解释:
此时的vars:列表是设置在tasks的同级层,即说明该变量对tasks的所有任务都生效

2、变量列表设置在tasks里的单个name任务里,只对该任务生效
-name: **
  hosts: webapp
  remote_user: root
  
  tasks:
    - name: **
      module: **
      vars:
        - var1: value1
        - var2: value2

3、使用with_items引用变量
tasks:
  - name: **
    copy:
      src: /root/{{ item.sname }}
      dest: /root/{{ item.dname }}
    with_items:
      - {sname: '/hudechao/file.txt',dname: /data/task}
      - {sname: '/hudechao/file2.txt',dname: /data/task2}
解释:
同时copy两个文件的变量引用

tasks:
  - name: **
    file: path={{ item }} state=directory
    with_items:
      - /usr/jdk
      - /data/logs/sms/kafka
解释:
同时创建两个目录的变量引用

tempaltes模板文件

1、模板templates:
文本文件,嵌套有脚本(使用模板编程语言编写)
Jinja2语言,使用字面量,有如下形式:
  字符串:使用单引号或双引号
  数字: 整数,浮点数
  列表:[item1,item2,...]
  元组:(item1,item2,...)
  字典:{key1:value1,key2:value2...}
  布尔型:true/false
  算数运算:+, - ,*, / , //(整除),  % ,**(指数)
  比较操作:==, !=, > ,>=, <,<=
  逻辑运算:and,or,not
  流表达式:for, if ,when

2、templates功能:
根据模块文件动态生成对应的配置文件;即可以替换模块文件里的变量
templates文件必须存放于templates目录下,且命名后缀.j2
yml/yaml脚本文件需要和templates目录同级,目录结构如下:
./
|——temnginx.yml
|——templates
        |——ngnix.conf.j2

3、templates示例
利用templates同步ngnix配置文件【同步类似copy一样】
在本机上准备templates/ngnix.conf.j2文件
---
- hosts: webapp
  remote_user: root
  
  tasks:
    - name: template config file
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
    - name: start service
      service: name=nginx state=start

4、templates中修改,进行变量替换
如,修改文件nginx.conf.j2下面行为:
如下的变量名ansible_procerssor_vcpus是facts里的变量值
worker_process {{ ansible_procerssor_vcpus }}
---
- hosts: webapp
  remote_user: root
  
  tasks:
    - name: template config file
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart service
    - name: start service
      service: name=nginx state=start

  handlers: restart service
    - service: name=nginx state=restart
5、templates中修改,算术运算
示例:
worker_process {{ ansible_procerssor_vcpus*2 }}
worker_process {{ ansible_procerssor_vcpus+2 }}

playbook的when条件

条件测试:如果需要根据变量,或此前任务的执行结果来作为某task执行与否的前提,可用when来是实现。
when语句:
在task后添加when子句即可使用条件测试,when语句支持jinj2表达式语法:
举例:
  tasks:
    - name: shutdown system
      command: /sbin/shutdown -h now
      when: ansible_os_familt=="RedHat"
举例2:
---
- hosts: webapp
  remote_user: root
  
  tasks:
    - name: copy config file7
      template: src=nginx.conf7.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version=="7"
      notify: restart service

    - name: copy config file6
      template: src=nginx.conf6.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version=="6"
      notify: restart service

    - name: start service
      service: name=nginx state=start

  handlers: restart service
    - service: name=nginx state=restart

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。