Fork me on GitHub

打印playbook变量

var01.yaml

---
  - hosts: ubuntu
    vars:
         foo: bar
    tasks:
         # Prints "Variable 'foo' is set to bar".
         - debug: msg="Variable 'foo' is set to {{ foo }}"

打印文件中的变量

var02.yaml

---
  - hosts: ubuntu
    vars_files:
      vars.yaml
    tasks:
         # Prints "Variable 'foo' is set to bar".
         - debug: msg="Variable 'foo' is set to {{ foo }}"

vars.yaml

---
foo: bar

Ansible的内置环境变量

Ansible的内置环境变量,用setup模块可以查看到
这种语法是Ansible提供的一种“优先级”机制,用于指定一个文件列表,Ansible将根据顺序加载第一个存在的文件,而不会加载多个文件。具体来说,它的工作原理如下:

工作原理:

  • Ansible会按顺序检查列表中的文件,并加载第一个找到的文件。
  • 如果第一个文件存在且可以加载,Ansible会立即停止检查后续文件。
  • 如果第一个文件不存在或无法加载,Ansible会继续检查下一个文件,直到找到一个存在的文件为止。
    [ "apache_{{ ansible_os_family }}.yml", "apache_default.yml" ] 的写法是为了在多个文件中,依次从左到右选择一个最合适的加载,而不是同时加载多个文件。这是为了避免变量覆盖或冲突,并确保使用最优配置。

这种写法会确保两个文件(如果存在)都会被加载
var03.yaml

---
  - hosts: ubuntu
    vars_files:
       - [ "apache_{{ ansible_os_family }}.yml", "apache_default.yml" ]
    tasks:
      - service: name={{ apache }} state=restarted

host_vars和group_vars变量

mkdir -p /etc/ansible/hosts_vars
vim /etc/ansible/hosts_vars/107.151.199.209
---
  foo: bar
  baz: qux

mkdir -p /etc/ansible/group_vars
vim /etc/ansible/group_vars/ubuntu
---
  tar: zar
  ping: pong

var04.yaml

---
  - hosts: ubuntu
    #debug 打印多个变量,host_vars和group_vars是默认加载的
    tasks:
      - name: debug vars
        debug:
          msg:
          #打印主机变量
           - "{{ foo }}"
           - "{{ baz }}"
          #打印主机组变量
           - "{{ tar }}"
           - "{{ ping }}"

注册变量,数组变量

数组变量,这里写入到/etc/ansible/group_vars/ubuntu

foo_list:
  - one
  - two
  - three

读取列表的第一个变量

foo[0]
foo|first

打印ansible内置变量
hostvars: 从一台远程主机上获取另一台远程主机的变量信息,变量hostvars包含了指定主机上所定义的所有变量

var05.yaml

---
  - hosts: ubuntu
    tasks:
      - name: get time
        command: date +"%Y-%m-%d %H:%M:%S"
        register: date_fmt
      - name: print time
        debug:
          var: date_fmt.stdout
       #打印变量要使用"{{}}",可以保证稳定读取
      - name: print time
        debug:
          msg: "{{ date_fmt.stdout }}"
      - name: print time
        debug:
          msg: "{{ date_fmt.stdout }}"
      - name: print foo_list first name with Python语法格式
        debug:
          msg: "{{ foo_list[0] }}"
      - name: print foo_list first name with Jinja2语法
        debug:
          msg: "{{ foo_list|first }}"
      - name: print Ansible built-in vars ansible_eth0
        debug:
          msg: "{{ ansible_eth0.ipv4.address }}"
      - name: print Ansible built-in vars ansible_eth0 #推荐使用 ansible_eth0['ipv4']['address']
        debug:
          msg: "{{ ansible_eth0['ipv4']['address'] }}"
      - name: print Ansible built-in vars ansible_eth0 #hostvars 打印网络接口控制器
        debug:
          msg: "{{ hostvars['107.151.199.209']['ansible_eth0']['pciid'] }}"

ansible 常用的变量

groups: 包含了所有Hosts文件里主机组的一个列表
group_names: 包含了当前主机所在的所有主机组名的一个列表
inventory_hostname: 通过Hosts文件定义主机的主机名(与ansible_home不一定相同)
inventory_hostname_short: 主机端口
play_hosts: 所有主机
ansible_os_family: 系统类型
ansible_hostname: 主机名称
ansible_memtotal_mb: 内存大小
这些变量通过与when语句的判断条件一起,来决定下一步的操作
var06.yaml

---
  - hosts: ubuntu
    tasks:
      - name: print vars
        debug:
          msg:
           - "groups: {{groups}}"
           - "group_names: {{group_names}}"
           - "inventory_hostname: {{inventory_hostname}}"
           - "inventory_hostname_short: {{inventory_hostname_short}}"
           - "play_hosts: {{play_hosts}}"
           - "ansible_os_family: {{ansible_os_family}}"
           - "ansible_hostname: {{ansible_hostname}}"
           - "ansible_memtotal_mb: {{ansible_memtotal_mb}}"
       #打印变量要使用"{{}}",可以保证稳定读取

Facts收集系统信息

Ansible默认会先抓取所有主机的系统信息,这些信息我们称之为 Facts

PLAY [group] **********************************************************

GATHERING FACTS *******************************************************

ok: [host1]

ok: [host2]

ok: [host3]

Facts信息包括远程主机的CPU类型,IP地址,磁盘空间,操作系统信息以及网络接口信息等

用setup模块来获取对应主机上面的所有可用的Facts信息,这些信息对于Playbook的运行至关重要

我们可以根据这些信息来决定是否要继续运行下一步任务,或者将这些信息写入某个配置文件中

在某些用不到Facts信息的Playbook任务中,我们可以在Playbook中设置gather_facts:no,节省更多的时间

本地Facts变量

在远程主机本地定义Facts变量的方法

我们可以把需要定义的变量写进一个以 .fact 结尾的文件中,这个文件可以是JSON文件或INI文件,或者是一个可以返回JSON代码的可执行文件,然后将其放置在 /etc/ansible/facts.d 文件夹中,Asnible在执行任务时会自动到这个文件夹下读取变量信息

我们在远程主机上创建了一个.fact文件 /etc/ansible/facts.d/test.fact

内容如下
[users]
    admin=jane,john
    normal=jim

返回结果如下

ansible ubuntu -m setup -a "filter=ansible_local"
107.151.199.209 | SUCCESS => {
    "ansible_facts": {
        "ansible_local": {
            "test": {
                "users": {
                    "admin": "jane,john",
                    "normal": "jim"
                }
            }
        },
        "discovered_interpreter_python": "/usr/bin/python3.10"
    },
    "changed": false
}

定义本地Facts的方法通常作为一种临时的定义变量的手段,我们还是建议将变量集中定义在Asnsible服务器端集中管理 但是在某些特殊情况下,比如 远程主机的系统环境经常发生变化 ,我们就需要在/etc/ansible/facts.d下使用脚本文件来动态地生成Facts变量

posted on 2024-08-15 22:38  anyux  阅读(65)  评论(0)    收藏  举报