Brc's blog
首页
前端
后端
运维
  • 工作笔记
  • 分类
  • 标签
  • 归档
关于

Brc

努力中
首页
前端
后端
运维
  • 工作笔记
  • 分类
  • 标签
  • 归档
关于
  • Linux基础

  • Linux进阶

    • shell

    • nginx

    • keepalived

    • LVS

    • ansible

      • Ansible基础快速入门
      • Ansible Playbook
      • Ansible Variables
        • 什么是变量
        • 变量定义的方式
        • 在Playbook中定义变量
          • vars方式定义变量
          • vars_files方式定义变量
        • 在Inventory中定义变量
          • Inventory文件中定义变量
          • 使用host_vars定义变量
          • 使用group_vars定义变量
        • 通过执行Playbook传递变量
        • 变量优先级测试
        • 变量注册Register
          • 什么是Register
          • Register示例1
          • Register示例2
      • Ansible Facts Variables
      • Ansible Task Control
      • Ansible Advanced
      • python调用ansible模块
    • docker

    • mysql

  • 其他

  • 运维
  • Linux进阶
  • ansible
Brc
2021-12-25
目录

Ansible Variables

# 什么是变量

变量提供了便捷的方式来管理Ansible项目中的动态值。 比如nginx-1.12,可能后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都将变得非常方便,这样可以简化项目的创建和维护。

# 变量定义的方式

在Ansible中定义变量分为如下三种方式:

  • 在play文件中进行定义变量
    • 通过vars定义变量
    • 通过vars_files定义变量
  • 通过inventory在主机组或单个主机中设置变量
    • 通过host_vars对主机进行定义
    • 通过group_vars对主机组进行定义
  • 通过命令行传递参数定义变量

# 在Playbook中定义变量

# vars方式定义变量

在playbook的文件中开头通过vars关键字进行变量定义

[root@manager ansible_var]# cat f1.yml
- hosts: webservers
  vars:
    - web_packages: httpd
    - ftp_packages: vsftpd
  tasks:
    - name: Output Vaiables
      debug:
        msg:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
1
2
3
4
5
6
7
8
9
10
11

# vars_files方式定义变量

在playbook中使用vars_files指定文件作为变量文件,好处就是其他的playbook也可以调用;

  1. 准备一个用于存储变量的文件,后缀为.yml文件内容:vars_name: value

    [root@manager ansible_var]# cat vars.yml
    web_packages: httpd
    ftp_packages: vsftpd
    
    1
    2
    3
  2. 使用Playbook调用变量文件

    [root@manager ansible_var]# cat f2.yml
    - hosts: webservers
      vars_files: ./vars.yml
      tasks:
        - name: Output Vaiables
          debug:
            msg:
              - "{{ web_packages }}"
              - "{{ ftp_packages }}"
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

# 在Inventory中定义变量

# Inventory文件中定义变量

在inventory主机清单中定义变量,但是要注意:主机变量优先级高于主机组变量。(了解即可)

  1. 设定主机变量的方式

    [root@manager ansible_var]# vim /etc/ansible/hosts
    [webservers]
    172.16.1.3 myid=1 state=master
    172.16.1.4 myid=2 state=backup
    
    [webservers:vars]
    port=80               # groups
    
    1
    2
    3
    4
    5
    6
    7
  2. playbook调用变量

    [root@manager ansible_var]# cat p3.yml
    - hosts: webservers
      tasks:
        - name: Output Vaiables
          debug:
            msg:
              - "{{ myid }} {{ state }} {{ port }}"
    
    1
    2
    3
    4
    5
    6
    7

# 使用host_vars定义变量

  1. 在项目目录中创建host_vars目录,然后在创建一个文件,文件的文件名称要与inventory清单中的主机名称要保持完全一致,如果是ip地址,则创建相同ip地址的文件即可

    [root@manager ansible_var]# cat hosts
    [webserver]
    10.0.0.12
    10.0.0.13
    [root@manager ansible_var]# mkdir host_vars
    
    1
    2
    3
    4
    5
  2. 在host_vars目录中创建文件,给10.0.0.12主机定义变量

    [root@manager ansible_var]# cat host_vars/10.0.0.12
    web_packages: zlib-static
    ftp_packages: zmap
    
    1
    2
    3
  3. 准备一个playbook文件调用host_vars目录中定义的主机变量

    [root@manager ansible_var]# cat f4.yml
    - hosts: 10.0.0.12
      tasks:
        - name: Output Vaiables
          debug:
            msg:
              - "{{ web_packages }}"
              - "{{ ftp_packages }}"
    
    - hosts: 10.0.0.13
      tasks:
        - name: Output Vaiables
          debug:
            msg:
              - "{{ web_packages }}"
              - "{{ ftp_packages }}"
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

# 使用group_vars定义变量

  1. 在项目目录中创建group_vars目录,然后在创建一个文件,文件的文件名称要与inventory清单中的组名称保持完全一致;

    [root@manager ansible_var]# cat hosts
    [webservers]
    10.0.0.12
    10.0.0.13
    [root@manager ansible_var]# mkdir group_vars
    
    1
    2
    3
    4
    5
  2. 在group_vars目录中创建webservers文件,为webservers主机组设定变量;

    [root@manager ansible_var]# cat group_vars/webservers
    web_packages: wget
    ftp_packages: tree
    
    1
    2
    3
  3. 编写playbook,只需在playbook文件中使用变量即可;

    [root@manager ansible_var]# cat f5.yml
    - hosts: webservers
      tasks:
        - name: Output Vaiables
          debug:
            msg:
              - "{{ web_packages }}"
              - "{{ ftp_packages }}"
    
    1
    2
    3
    4
    5
    6
    7
    8
  4. 测试其他组能否使用webservers组中定义的变量;测试后会发现无法调用;

    [root@manager ansible_var]# cat f6.yml
    - hosts: lbservers    # 使用lbservers
      tasks:
        - name: Output Vaiables
          debug:
            msg:
              - "{{ web_packages }}"
              - "{{ ftp_packages }}"
    
    1
    2
    3
    4
    5
    6
    7
    8
  5. 但是系统提供了特殊的all组,也就说在group_vars目录下创建一个all文件,定义变量对所有的主机组都生效;

    [root@manager ansible_var]# cat group_vars/all
    web_packages: wget
    ftp_packages: tree
    
    [root@manager ansible_var]# cat f6.yml
    - hosts: lbservers    # 无论哪个组使用该变量,都没有任何的问题
      tasks:
        - name: Output Vaiables
          debug:
            msg:
              - "{{ web_packages }}"
              - "{{ ftp_packages }}"
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

# 通过执行Playbook传递变量

在执行Playbook时,可以通过命令行--extra-vars或-e外置传参设定变量;

  1. 准备playbook文件

    [root@manager ansible_var]# cat f5.yml
    - hosts: webserver
      tasks:
        - name: Output Vaiables
          debug:
            msg:
              - "{{ web_packages }}"
              - "{{ ftp_packages }}"
    
    1
    2
    3
    4
    5
    6
    7
    8
  2. 执行playbook时进行变量的传递

    [root@manager ansible_var]# ansible-playbook f5.yml -i hosts -e "web_packages=GeoIP"
    
    1
  3. 传递多个外置变量的方式

    [root@manager ansible_var]# ansible-playbook f5.yml -i hosts -e "web_packages=GeoIP" -e "ftp_packages=telnet"
    
    1

# 变量优先级测试

  • 定义相同的变量不同的值,来测试变量的优先级。操作步骤如下
    1. 在plabook中定义vars变量
    2. 在playbook中定义vars_files变量
    3. 在host_vars中定义变量
    4. 在group_vars中定义变量
    5. 通过执行命令传递变量
  • 结果报告:
    • 命令行变量-->play中的vars_files-->play中的vars-->inventory-hosts-->host_vars-->group_vars/group_name-->group_vars/all-->inventory-group

# 变量注册Register

# 什么是Register

register关键字可以将某个task任务结果存储至变量中,最后使用debug输出变量内容,可以用于后续排障;

# Register示例1

[root@manager ansible_var]# cat f7.yml
- hosts: all
  tasks:
    - name:
      shell: netstat -lntp | grep 22
      register: System_Status

    - name: Get System Status
      debug: msg={{System_Status.stdout_lines}}

#playbook执行结果
[root@manager ansible_var]# ansible-playbook f7.yml

PLAY [all] ***************************************************************************

TASK [Gathering Facts] ***************************************************************
ok: [10.0.0.12]
ok: [10.0.0.13]

TASK [shell] *************************************************************************
changed: [10.0.0.12]
changed: [10.0.0.13]

TASK [Get System Status] *************************************************************
ok: [10.0.0.12] => {
    "msg": [
        "tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      858/sshd            ",
        "tcp6       0      0 :::22                   :::*                    LISTEN      858/sshd            "
    ]
}
ok: [10.0.0.13] => {
    "msg": [
        "tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      859/sshd            ",
        "tcp6       0      0 :::22                   :::*                    LISTEN      859/sshd            "
    ]
}

PLAY RECAP ***************************************************************************
10.0.0.12                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
10.0.0.13                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

# Register示例2

使用register关键字完成jumpserver key的创建;

[root@mananger playbook]# cat f8.yaml
- hosts: webservers
  tasks:
    - name: Run Shell Command Random string
      shell:
        cmd: 'if ! grep "SECRET_KEY" ~/.bashrc; then
                SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`;
                echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc;
                echo $SECRET_KEY;
              else
                echo $SECRET_KEY;
              fi'
      register: SECRET_KEY

    - name: Run Shell Command BOOTSTRAP_TOKEN
      shell:
        cmd: 'if ! grep "BOOTSTRAP_TOKEN" ~/.bashrc; then
                BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`;
                echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc;
                echo $BOOTSTRAP_TOKEN;
              else
                echo $BOOTSTRAP_TOKEN;
              fi'
      register: BOOTSTRAP_TOKEN

    - name: Copy Jms Configure
      template:
        src: ./j-config.yml
        dest: /tmp/jms_config.yml

    - name: Copy Koko Configure
      template:
        src: ./k-config.yml
        dest: /tmp/koko_config.yml

# 配置文件中:
SECRET_KEY: {{ SECRET_KEY.stdout.split('=')[1] }}
BOOTSTRAP_TOKEN: {{ BOOTSTRAP_TOKEN.stdout.split('=')[1] }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ansible#playbook
Last Updated: 2022/04/01, 21:45:19
Ansible Playbook
Ansible Facts Variables

← Ansible Playbook Ansible Facts Variables→

最近更新
01
谷歌云创建GKE集群
07-26
02
ElastiCacheForRedis启用密码
07-26
03
upload-to-gcs
06-29
更多文章>
Theme by Vdoing | Copyright © 2021-2024 Brc | MIT License | 浙ICP备19031881号-4
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式