Linux架构 Ansible变量

Ansible变量

Ansible 中定义变量的方式

优先级:作用域越小,优先级越高

主机清单(inventory)

# 主机清单展示
[db_group]
db01 ansible_ssh_host='10.0.0.51'

[wd:children]
web_group
nfs

[nfs]
nfs01 ansible_ssh_host='10.0.0.31'

[backup]
backup01 ansible_ssh_host='10.0.0.41' 

[all:vars]
user='ylsb1'
id='438'

[web_group:vars]
user='yldsb2'
id='1438'

# 剧本展示
- hosts: all
  # vars_files:
  #   - ./bl.yml
  tasks:
  - name: 创建"{{ user }}"组
    group:
      name: "{{ user }}"
      gid: "{{ id }}"
      state: present
  - name: 创建"{{ user }}"用户
    user:
      name: "{{ user }}"
      uid: "{{ id }}"
      group: "{{ id }}"
      shell: /sbin/nologin
      create_home: false

官方推荐定义变量方式

1.根据主机清单中的标签名或者主机名,来创建对应的yaml文件
2.如果是标签名,就将yaml文件创建在group_vars目录下
3.如果是主机名,就将yaml文件创建在host_vars目录下
4.host_vars和group_vars两个目录,必须和playbook在同一级目录下

# 例:主机清单如下
[db_group]
db01 ansible_ssh_host='10.0.0.51'

[wd:children]
web_group
nfs

[nfs]
nfs01 ansible_ssh_host='10.0.0.31'

[backup]
backup01 ansible_ssh_host='10.0.0.41' 
  • host_vars
    • web01.yaml
    • web02.yaml
    • nfs01.yaml
  • group_vars
    • web_group.yaml
    • db_group.yaml

剧本playbook

  • vars
# 变量值写法
- hosts: all
  vars:
    user: "web"
    id: "1234"
  tasks:
  - name: 创建"{{ user }}"组
    group:
      name: "{{ user }}"
      gid: "{{ id }}"
      state: present
  - name: 创建"{{ user }}"用户
    user:
      name: "{{ user }}"
      uid: "{{ id }}"
      group: "{{ id }}"
      shell: /sbin/nologin
      create_home: false
  • vars_files
# 变量分组
vim bl.yml
user: "sss"
id: "432"

# 变量文件写法
- hosts: all
  vars_files:
    - ./bl.yml
  tasks:
  - name: 创建"{{ user }}"组
    group:
      name: "{{ user }}"
      gid: "{{ id }}"
      state: present
  - name: 创建"{{ user }}"用户
    user:
      name: "{{ user }}"
      uid: "{{ id }}"
      group: "{{ id }}"
      shell: /sbin/nologin
      create_home: false

命令行

通过命令行覆盖变量,Inventory(主机清单)的变量会被playbook(剧本)文件中覆盖,这两种方式的变量都会被命令行直接指定变量所覆盖,使用--extra-vars或者-e设置变量

#例:
ansible-playbook wordpress.yaml -i hosts -e 'user=tls555 id=55555'

ansible变量的优先级

#例:把其他所有变量方式都设置好,并使用命令行变量进行操作
ansible-playbook test.yaml -i hosts -e 'test=command'

#得出结论:
命令行 > 剧本 playbook > 主机清单 inventory
命令行 > vars_files > vars > host_vars > group_vars > inventory

# 官方推荐:
    - host_vars
    - group_vars

# linux中优先级规律:作用域越小,优先级越高

ansible变量的注册

为什么要用变量注册?

有些时候,我们需要查看playbook执行后返回的结果
ls -l /root
free -m
df -h
但是ansible剧本只返回,运行后的状态,绿色 黄色 红色
所以需要使用注册变量,将执行的结果,保存到一个变量名中

register:注册,将命令结果保存在指定的变量名中

#例:
- hosts: web_group
  tasks:
  - name: 查看所有web的/root目录下都有哪些文件
      shell: 'ls -l /root'
      register: dsb_yl
  - name: 查看 dsb_yl 变量的值
      debug:
      msg: "{{ dsb_yl['stdout_lines'] }}"

# 变量注册判断举例
- hosts: web02
  tasks:
  - name: 检测是否安装nginx
      shell: 'rpm -qa|grep nginx'
      register: check_nginx

  - name: 安装nginx和php
      shell: 'rpm -ivh /opt/nginx_php/*.rpm'
      when: check_nginx.rc != 0

  - name: 创建zls目录
      file:
        path: /tmp/zls
        state: directory

层级定义变量

# 例子展示
lnmp:
  framerwork:
    package:
      web_pkg:nginx
      db_pkg:mysql
      code_pkg:php-fpm
lamp:
  framerwork:
    package:
      web_pkg:httpd
      db_pkg:mysql
      code_pkg:php-fpm
lamt:
  framerwork:
    package:
      web_pkg:httpd
      db_pkg:mysql
      code_pkg:tomcat

# 引用方法
{{ lnmp.framerwork.package.web_pkg }}     

## 变量定义展示
framework:
  package:
    web_pkg: nginx-1.19.2
    db_pkg: oracle
    code_pkg: php-fpm

## 剧本中调用变量
- hosts: web_group
  tasks:
  - name: 创建目录
    file:
      path: /opt/{{ lnmp.framework.package.db_pkg }}
      state: directory
  - name: 安装lnmp
    yum:
      name:
        - {{ framework.package.web_pkg }}
        - {{ framework.package.db_pkg }}
        - {{ framework.package.code_pkg }}

## 所有变量展示
framework:
  lnmp:
    web_pkg: nginx-1.19.2
    db_pkg: mariadb-server
    code_pkg: php-fpm
  lamt:
    web_pkg: httpd
    db_pkg: mariadb-server
    code_pkg: tomcat
  lamp:
    web_pkg: httpd
    db_pkg: mariadb-server
    code_pkg: php-fpm

## 调用变量
- hosts: web_group
  tasks:
  - name: 安装lnmp
    yum:
      name:
        - "{{ framework.lnmp.web_pkg }}"
        - "{{ framework.lnmp.db_pkg }}"
        - "{{ framework.lnmp.code_pkg }}"

ansible的facts缓存

playbook在执行之前,使用setup模块获取所有主机信息,获取所有变量(内置变量)

# 使用setup模块
ansible web01 -m setup

# facts缓存
TASK [Gathering Facts]
ok: [web02]
ok: [web01]

# /etc/motd
欢迎登录 {{ ansible_hostname }}
内网IP:{{ ansible_eth1.ipv4.address }}
外网IP:{{ ansible_eth0.ipv4.address }}
总内存:{{ ansible_memtotal_mb }}
可用内存:{{ ansible_memfree_mb }}

# /opt/
- hosts: web_group
  tasks:
  - name: 创建{{ ansible_hostname }}目录
    file:
      path: /opt/{{ ansible_hostname }}
      state: directory

  - name: 创建{{ ansible_eth1.ipv4.address }}目录
    file:
      path: /opt/{{ ansible_eth1.ipv4.address }}
      state: directory

  - name: 创建{{ ansible_eth0.ipv4.address }}目录
    file:
      path: /opt/{{ ansible_eth0.ipv4.address }}
      state: directory

  - name: 创建{{ ansible_memtotal_mb }}目录
    file:
      path: /opt/{{ ansible_memtotal_mb }}
      state: directory
  - name: 创建{{ ansible_memfree_mb }}目录
    file:
      path: /opt/{{ ansible_memfree_mb }}
      state: directory

## 关闭facts缓存
gather_facts: no

img

在数据库配置文件中设置内存(主机的物理内存的80%)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇