Ansible常用变量【下】

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


前言

在上一篇文章《Ansible常用变量【上】》中,学习了Ansible常用变量的前半部分,放了个五一假,继续学习Ansible常用变量的后半部分:

1. 模版中使用变量——在模版文件中使用自定义变量和系统变量;

2. 注册变量——把任务的运行结果作为一个变量来使用;

3. 额外变量——为了使playbook更灵活,通用性更强,允许用户在执行playook时传入变量的值,这时候就需要用到“额外变量”。

1. 模版中使用变量

在template模版文件中使用变量可以使用Facts系统变量,也可以使用用户自定义的变量。

1.1 在模版文件中引用系统变量

1)创建一个jinja2文件:

[root@test101 ansible-test]# cat template.vars-test.j2
my ip is: {{ ansible_host }}
my hostname is: {{ ansible_nodename }}
[root@test101 ansible-test]# 

2)创建yaml文件:

[root@test101 ansible-test]# cat test.yaml
---
- name: Example Playbook with Template(Fcts)
  hosts: all
  gather_facts: yes  #使用的系统变量,这里需要设置为yes
  vars:
    ip: "ip"
    hostname: "hostname"

  tasks:
    - name: description of host
      template:
        src: template.vars-test.j2
        dest: /tmp/host.txt
[root@test101 ansible-test]#

3)执行playbook:

ansible-playbook test.yaml

执行效果:

1.2 在模板文件中使用自定义变量

在模版文件中也可以使用自定义变量,例如:

1)创建一个j2文件:

[root@test101 ansible-test]# cat template.vars-test.j2
name: "sre"
age: "18"
other:
  height: "155"
  hobby: "work"
[root@test101 ansible-test]#

2)创建一个yaml文件:

[root@test101 ansible-test]# cat test.yaml
---
- name: Example Playbook with Template
  hosts: all
  gather_facts: no
  vars:
    name: "name"
    age: "age"
    other:
      height: "height"
      hobby: "hobby"

  tasks:
    - name: description of sre
      template:
        src: template.vars-test.j2
        dest: /tmp/sre.txt
[root@test101 ansible-test]#

3)执行文件:

ansible-playbook test.yaml

执行效果:

2. 注册变量

有些场景下会需要把执行结果注册到变量中,然后在后面的任务中可调用,这时候就需使用关键字register。

例如,创建一个yaml:

[root@test101 ansible-test]# cat test.yaml 
---
- name: Ansible playbook with registered variable
  hosts: all
  gather_facts: no

  tasks:
    - name: my test
      shell: echo "This is SRE's test"
      register: my_test_output

    - name: echo the result of "my test"
      debug:
        msg: "The output of 'my test' was '{{ my_test_output.stdout }}.'"
[root@test101 ansible-test]#

执行命令:

ansible-playbook test.yaml

执行效果:

3. 额外变量

有时为了让playbook的使用更加灵活,更具有通用性,会允许用户在执行playbook的时候传入变量的值,这时候就需要用到“额外变量”。

3.1 无初始值自定义变量

有时候在yaml文件中只定义变量,没有默认值,等待用户执行yaml时传参。

例如,创建一个yaml文件:

[root@test101 ansible-test]# cat test.yaml 
---
- name: my custom_variable test
  hosts: "{{ hosts }}"  #设置第一个变量
  gather_facts: no
  vars:
    custom_variable: "{{ custom_command_variable }}"   #设置第二个变量

  tasks:
    - name: echo variable msg
      debug:
        msg: "{{ custom_variable }}"
[root@test101 ansible-test]#

传参执行yaml,有三种方式:

① 普通格式传参执行:

ansible-playbook test.yaml --extra-vars "hosts=all custom_command_variable='this is a test of custom variable'"

② 使用json格式传参执行:

ansible-playbook test.yaml --extra-vars "{'hosts':'all', 'custom_command_variable':'this is a test of custom variable'}"  

③ 将参数放在文件中引用传参执行:

[root@test101 ansible-test]# ll
total 8
-rw-r--r-- 1 root root 229 May 11 08:49 test.yaml
-rw-r--r-- 1 root root  85 May 11 08:57 vars-test.json   #创建参数json文件
[root@test101 ansible-test]# 
[root@test101 ansible-test]# cat vars-test.json    #文件内容
{
  "hosts":"all",
  "custom_command_variable":"this is a test of custom variable"
}
[root@test101 ansible-test]# 
[root@test101 ansible-test]# ansible-playbook test.yaml --extra-vars "@vars-test.json"   #执行命令引用文件传参

执行结果:

3.2 用传参覆盖变量原有值

有些场景下定义了变量之后,会给变量设置一个初始值,这时候如果再传参进去,就会将原有的初始值覆盖掉。

例如,创建一个yaml文件:

[root@test101 ansible-test]# cat test.yaml 
---
- name: Test playbook with custom variables
  hosts: all
  gather_facts: no
  vars:
    custom_message: "Hello, SRE"  #设置参数值
  tasks:
    - name: Display custom message
      debug:
        msg: "{{ custom_message }}"  #参数调用
[root@test101 ansible-test]#

传参执行yaml文件:

ansible-playbook test.yaml  --extra-vars "custom_message='This is a new message'

执行效果:

最后打印的不是变量的初始值,而是执行yaml时传进去的参数值。但如果在模板文件中,j2文件中的变量值优先级会高于执行命令时传的参数。

3.3 在模板文件中使用额外变量

1)创建一个jinja2文件:

[root@test101 ansible-test]# cat template.vars-test.j2 
name: {{ name }}
age: {{ age }}
other:
  height: {{ height }}
  hobby: {{ hobby }}
[root@test101 ansible-test]#

2)创建一个执行的yaml文件:

[root@test101 ansible-test]# cat test.yaml 
---
- name: Example Playbook with Template
  hosts: all
  gather_facts: no
  vars:
    name: "name"
    age: "age"
    other:
      height: "height"
      hobby: "hobby"

  tasks:
    - name: description of sre
      template:
        src: template.vars-test.j2
        dest: /tmp/sre.txt
[root@test101 ansible-test]#

3)执行yaml文件:

ansible-playbook test.yaml --extra-vars "name=sre age=18 height=155 hobby=work"

执行效果:

感谢您的喜爱与分享!

相关推荐

  1. ansible模块

    2024-05-14 08:44:04       26 阅读
  2. 三、05 ansible基础命令ansible 命令

    2024-05-14 08:44:04       52 阅读
  3. ansible 管理工具以及模块

    2024-05-14 08:44:04       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-14 08:44:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-14 08:44:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-14 08:44:04       82 阅读
  4. Python语言-面向对象

    2024-05-14 08:44:04       91 阅读

热门阅读

  1. Ubuntu20.04中的Pyqt4

    2024-05-14 08:44:04       35 阅读
  2. Jupyter集成AI环境搭建@miniconda@FreeBSD

    2024-05-14 08:44:04       30 阅读
  3. git之从整个版本中彻底删除文件)

    2024-05-14 08:44:04       31 阅读
  4. 十大排序算法

    2024-05-14 08:44:04       36 阅读
  5. 混合使用MFC与QT的深度技术分析

    2024-05-14 08:44:04       30 阅读
  6. Oracle中TEMPORARY tablespace和PERMANENT tablespace的差别

    2024-05-14 08:44:04       32 阅读
  7. Excel中`SUM`和`SUMPRODUCT`

    2024-05-14 08:44:04       30 阅读
  8. 驱动开发-用户空间和内核空间数据传输

    2024-05-14 08:44:04       34 阅读
  9. Elasticsearch映射定义

    2024-05-14 08:44:04       31 阅读
  10. RSA非对称加密解密,前端公钥加密后端私钥解密

    2024-05-14 08:44:04       31 阅读