Teng's blog Teng's blog
首页
Java
H5前端
GitHub (opens new window)
首页
Java
H5前端
GitHub (opens new window)
  • 背景介绍
  • 安装
  • 配置说明
  • 基础命令
  • 常用模块
  • Playbook

    • 简单介绍
    • yaml语法
    • hosts
    • task
    • 运行playbook
    • handlers
    • tags
    • variables
      • 变量命名
      • 变量定义
      • 变量调用
      • 变量来源
        • 通过setup模块获取
        • 在主机清单中定义
        • 通过执行命令指定
        • 在playbook中定义
        • 在独立的变量文件中定义
        • 在role中定义
    • template
    • when条件判断
    • with_items迭代
    • roles
    • 附:jinja2语法
  • Tool-Ansible
  • Playbook
Shetengteng
2022-05-15

variables

用于内置变量或自定义变量在playbook中调用,也可使用ansible命令获取到系统变量值 在执行ansible命令后的返回值中,ansible_facts中会显示出修改的变量值信息 系统的变量可以作为判断条件

# 变量命名

仅能由字母、数字和下划线组成,且只能以字母开头

# 变量定义

key=value

http_port=80
1

# 变量调用

方式1

  • 通过 调用变量,且变量名前后必须有空格,有时用 ""才生效

方式2

  • ansible-playbook –e 选项指定
ansible-playbook test.yml -e "hosts=www user=magedu"
1

# 变量来源

优先级:命令指定>playbook定义>主机清单主机变量>主机清单分组变量

# 通过setup模块获取

setup模块实现系统中很多系统信息的显示,可返回每个主机的系统信息包括:版本、主机名、cpu、内存

ansible setup facts # 远程主机的所有变量都可直接调用 (系统自带变量)
1

查看所有系统变量值

ansible all -m setup | less
1

查询示例1:查询不够精确

[root@linux101 opt]# ansible all -m setup | grep ansible_memtotal_mb
        "ansible_memtotal_mb": 3934, 
        "ansible_memtotal_mb": 3934, 
        "ansible_memtotal_mb": 3934, 
1
2
3
4

查询示例2

ansible all -m setup -a 'filter="ansible_nodename"'        # 查询主机名
ansible all -m setup -a 'filter="ansible_memtotal_mb"'     # 查询主机内存大小
ansible all -m setup -a 'filter="ansible_distribution_major_version"'  # 查询系统版本
ansible all -m setup -a 'filter="ansible_processor_vcpus"'  # 查询主机cpu个数
ansible all -m setup -a 'filter=*address*' # 支持通配符
1
2
3
4
5

示例:创建文件夹,通过setup中读取的ansible_fqdn变量值创建

先查询

ansible app -m setup -a 'filter="ansible_fqdn"'

192.168.10.102 | SUCCESS => {
    "ansible_facts": {
        "ansible_fqdn": "linux102", 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}
...
1
2
3
4
5
6
7
8
9
10

编写app.yml

- hosts: app
  remote_user: root
  
  tasks:
    - name: create log file
      file: name=/opt/{{ ansible_fqdn }}.log state=touch mode=500 owner=stt
1
2
3
4
5
6

检查playbook执行文件,再执行

ansible-playbook -C app.yml
ansible-playbook app.yml
1
2

检查执行的结果

ansible app -a 'ls /opt/ -l'
1

# 在主机清单中定义

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

# 普通变量

主机组中主机单独定义,优先级高于公共变量(单个主机 )

示例:修改/etc/ansible/hosts,添加app组,每个主机有自己的http_port端口

[app]
192.168.10.102 http_port=81 # 单个主机变量
192.168.10.103 http_port=82
192.168.10.104 http_port=83
1
2
3
4

创建app.yml,对主机清单中的变量进行调用

- hosts: app
  remote_user: root
 
  tasks:
    - name: set hostname
      hostname: name=www{{ http_port }}.stt.com
1
2
3
4
5
6

执行:先检测,在执行

ansible-playbook -C app.yml
ansible-playbook app.yml
1
2

检查是否修改成功

ansible-playbook app -a 'hostname'
1

# 公共(组)变量

针对主机组中所有主机定义统一变量(一组主机的同一类别)

示例:修改hosts,添加组公共变量

[app]
192.168.10.102 http_port=81 # 单个主机变量
192.168.10.103 http_port=82
192.168.10.104 http_port=83

[app:vars] # 组变量
nodename=www
domainname=stt.com
1
2
3
4
5
6
7
8

修改app.yml文件

- hosts: app
  remote_user: root
 
  tasks:
    - name: set hostname
      hostname: name={{ nodename }}{{ http_port }}.{{ domainname }}
1
2
3
4
5
6

# 组嵌套变量

组还可以包含其它的组,也可向组中的主机指定变量

示例

[apache]
httpd1.stt.com
httpd2.stt.com

[nginx]
ngx1.stt.com
ngx2.stt.com

[websrvs:children] # 将上面2个组进行组合
apache
nginx

[webservers:vars] # 定义嵌套组队的变量
ntp_server=ntp.stt.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
组嵌套
inventory中,组还可以包含其它的组,并且也可以向组中的主机指定变量。
这些变量只能在ansible-playbook中使用,而ansible命令不支持

示例:
    [apache]
    httpd1.magedu.com
    httpd2.magedu.com
    
    [nginx]
    ngx1.magedu.com
    ngx2.magedu.com
    
    [websrvs:children]
    apache
    nginx
    
    [webservers:vars]
    ntp_server=ntp.magedu.com
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 通过执行命令指定

通过命令行指定变量,优先级最高

ansible-playbook –e 'varname=value' xx.yml
# 多个变量
ansible-playbook –e 'varname=value varname2=value2' xx.yml
1
2
3

示例:编写app.yml

- hosts: websrvs
  remote_user: root
 
  tasks:
    - name: install package
      yum: name={{ pkName }}
    - name: start service
      service : name={{ pkName }} state=started enabled=yes
1
2
3
4
5
6
7
8

执行:使用 -e 表示传递的变量

ansible-playbook -e 'pkName=vsftpd' app.yml
1

检查ftp服务是否安装成功:通过检查21端口是否开始监听

ansible websrvs -m shell -a 'ss -ntl | grep 21'
1

卸载刚才安装的服务

ansible websrvs -m shell -a 'yum -y remove vsftpd'
1

# 在playbook中定义

在playbook中使用vars关键字,定义变量

vars:
  - var1: value1
  - var2: value2
1
2
3

示例:创建app.yml,声明2个变量并执行

- hosts: websrvs
  remote_user: root
  vars:
    - pkname1: httpd
    - pkname2: vsftpd
 
  tasks:
    - name: install package1
      yum: name={{ pkname1 }}
    - name: install package2
      yum: name={{ pkname2 }}
1
2
3
4
5
6
7
8
9
10
11

执行命令

ansible-playbook app.yml
1

检查是否安装成功:查询安装的版本信息

ansible websrvs -m shell -a 'rpm -q httpd vsftpd'
1

卸载刚才的安装

ansible websrvs -m shell -a 'yum -y remove httpd vsftpd'
1

# 在独立的变量文件中定义

在自定义的yml文件中定义变量,在playbook中使用vars_files关键字引用

示例:安装httpd,创建log文件夹 创建变量文件,my_vars.yml

var1: httpd
var2: vsftpd
1
2

创建playbood的执行文件app.yml

- hosts: app
  remote_user: root
  vars_files:
    - my_vars.yml

  tasks:
    - name: install package httpd
      yum: name={{ var1 }}
    - name: create log file vsftpd
      file: name=/opt/{{ var2 }}.log state=touch
1
2
3
4
5
6
7
8
9
10

执行

ansible-playbook -C app.yml
ansible-playbook app.yml
1
2

检查安装情况

ansible app -m shell -a 'rpm -q httpd' # 查询httpd的安装版本情况
ansible app -m shell -a 'ls -l /opt' # 查看目录创建情况
1
2

卸载&删除文件夹

ansible websrvs -m shell -a 'yum -y remove httpd'
ansible websrvs -m shell -a 'rm -rf /opt/vsftpd.log'
1
2

# 在role中定义

参看role章节

Last Updated: 2022/05/22, 12:42:00
tags
template

← tags template→

Theme by Vdoing | Copyright © 2021-2022 Shetengteng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式