个人博客,记录知识防止遗忘
ansible工具中playbook 的变量相关
ansible工具中playbook 的变量相关

ansible工具中playbook 的变量相关

内容大纲

附注: 变量优先级:

-e传参 >  playbook(vars_file > vars)  >  host_vars  >  group_vars  >  group_all_vars

1    play中vars定义变量

1.1    在  vars  中直接定义,  整个    – hosts :  中都可以使用

- hosts: all
  gather_facts: False  #设置为false,那么下面的debug模块会生效
  vars:       # 先申明vars这个关键字
    aaaa: "aaaabbbb"  #用key: value的形式定义变量
    bbbb: "bbbbaaaa"
  tasks:
    - name: task_1
      debug: msg="The {{ inventory_hostname  }} value_aaaa is {{ aaaa }}"
    - name: task_2
      debug: msg="The {{ inventory_hostname  }} value_bbbb is {{ bbbb }}"
      # 上边儿 inventory_hostname 是个内置变量,会表明执行当前任务的主机

 

1.2 将vars单独指定为文件,方便其他yml调用

- hosts: all
  gather_facts: False  #设置为false,那么下面的debug模块会生效
  vars_files:       # 声明vars保存的路径,文件中变量以键值对指明
    - ./vars_pub1.yml
    - ./vars_pub2.yml
  tasks:
    - name: task_1
      debug: msg="The {{ inventory_hostname  }} value_aaaa is {{ aaaa }}"
    - name: task_2
      debug: msg="The {{ inventory_hostname  }} value_bbbb is {{ bbbb }}"
      # 上边儿 inventory_hostname 是个内置变量,会表明执行当前任务的主机

2    在主机清单中定义变量:

2.1    host文件中直接定义 (几乎不用)

- hosts: all
  gather_facts: False  #设置为false,那么下面的debug模块会生效
  tasks:
    - name: task_1
      debug: msg="The {{ inventory_hostname  }} value_aaaa is {{ aaaa }}"
    - name: task_2
      debug: msg="The {{ inventory_hostname  }} value_bbbb is {{ bbbb }}"
      # 上边儿 inventory_hostname 是个内置变量,会表明执行当前任务的主机

 

2.2    官方推荐,上述方法改进

在项目目录中创建2个目录  group_vars 和 host_vars
在group_vars 中, 文件名为组名; 此外有个默认的特殊组 all ,
在host_vars 中, 文件名为主机名
 
匹配的优先级:
host主机变量 > group组变量 > all组变量

- hosts: group_a
  gather_facts: False  #设置为false,那么下面的debug模块会生效
  tasks:
    - name: task_1
      debug: msg="The {{ inventory_hostname  }} value_aaaa is {{ aaaa }}"
    - name: task_2
      debug: msg="The {{ inventory_hostname  }} value_bbbb is {{ bbbb }}"
    - name: task_3
      debug: msg="The {{ inventory_hostname  }} value_cccc is {{ cccc }}"
      # 上边儿 inventory_hostname 是个内置变量,会表明执行当前任务的主机

 

 

 

 

3    通过playbook -e 传入参数: (临时测试用,优先级最高)

 

- hosts: "{{ hosts_ttt }}"
  gather_facts: False  #设置为false,那么下面的debug模块会生效
  tasks:
    - name: task_1
      debug: msg="The {{ inventory_hostname  }} value_aaaa is {{ aaaa }}"

4    register 变量

例如在playbook中使用shell模块执行命令, 虽然命令可以执行,但是不返回任何信息
此时需要用到 register 定义一个变量,将执行结果传入该变量中, 随后用debug模块输出

- hosts: "group_a"
  tasks:
    - name: 'install nginx'
      yum:
        name: nginx
        state: present

    - name: 'nginx start'
      service: 
        name: nginx
        state: started

    - name: 'check nginx status'
      shell: 'ps -ef |grep nginx'
      register: 'check_nginx'     # 定义变量,shell执行的所有信息将赋值给该变量

    - name: 'OutPut Status'
      debug:
        msg: "{{ check_nginx.stdout_lines }}"   # 调用stdout_lines 方法,输出命令行执行结果
                                                # 除此之外,还有很多方法,

image.png
msg中除了stdout_lines这个方法外,还有其他几个可用的方法

changed :             状态改变 (shell模块只要执行,状态必定改变)
cmd:                          shell命令
delta:
end:                            结束时间
failed:                     是否失败
rc:                             返回状态码
start:                      开始时间
stderr:                     错误输出
stderr_lines:       错误输出(列表格式)
stdout:                     标准输出
stdout_lines:       标准输出(列表格式)

image.png

5    facts变量

ansible facts主要是用于获取远程系统的数据,从而可以在playbook中作为变量使用。

通常facts分为2类:
① 由Ansible中的 setup 模块自动发现的
② 用户自定义的 facts

如果远程受管理的机器有一个 “/etc/ansible/facts.d” 目录, 那么在该目录中任何以 ”.fact”结尾的文件都可以在Ansible中提供局部facts.

这些文件可以是JSON,INI或者任何可以返回JSON的可执行文件.

5.1    关闭facts

如果不需要获取任何被控主机信息,为了提升playbook执行速度,可以将facts关闭

- hosts: group_a
  gather_facts: false

5.2    例: 生成自定义facts

5.2.1    本地创建文件来定义

例如创建一个 /etc/ansible/facts.d/perferences.fact文件:

[test_tt]
aaaa=1
bbbb=2

这将产生一个名为 “test” 的哈希表fact, 里面成员有 ‘aaaa’ 和 ‘bbbb’. 可以这样验证:

ansible  -m setup -a "filter=ansible_local"

然后会看到有以下fact被添加:

"ansible_local": {
        "preferences": {
            "test_tt": {
                "aaaa" : "1",
                "bbbb"  : "2"
            }
        }
 }

而且也可以在template或palybook中访问该数据:

{{ ansible_local.preferences.test_tt.aaaa }}
{{ ansible_local.preferences.test_tt.bbbb }}

5.2.2    通过playbook,为其他主机添加本地facts

本地命名空间放置其它用户提供的fact或者playbook中定义的变量覆盖系统facts值。

注: 如果有一个playook,它自定义了一个fact,若要正常使用,则需要重新运行setup模块
若不运行setup, 那只能在下一个play中才能获取到这些自定义的fact信息

# 创建要推送给所有主机的fact文件
cat >  test_tt.facts << EOF
[test_tt]
aaaa=1
bbbb=2
EOF
- hosts: webservers
  tasks:
    - name: create facts directory                                  # 创建默认的facts目录
      file: state=directory recurse=yes path=/etc/ansible/facts.d

    - name: copy fact file                                          # 将test_tt.fact文件复制过去
      copy: src=test_tt.fact dest=/etc/ansible/facts.d

    - name: re-read facts after adding custom fact                  # 重新加载setup模块,更新上述定义的facts
      setup: filter=ansible_local                  

5.3    例: 使用内置facts搭配template模块, 为不同的nginx主机创建其专属配置文件

获取不同主机的cpu数,将其设置为 worker_processes 的值

5.3.1    获取facts内置的变量的名称及调用路径

# 随便获取一个主机的信息(也可以是自身),将其写入文件,方便后续查找各种内置变量
[root@opt_host project1]# ansible host_1 -m "setup" -i ./hosts > ./setup.txt

image.png

# 上图中命令
 ansible host_1 -m setup -a "filter=ansible_processor_vcpus" -i ./hosts

5.3.2    准备配置文件template

# 创建template目录
mkdir -pv template
# 复制nginx配置文件
cp -a  /etc/nginx/nginx.conf ./template/nginx.conf.j2
# 修改需要变化的部分

image.png

5.3.3    编写playbook

---
- hosts: group_a
  remote_user: root
  tasks:
    - name: install nginx
      yum:
        name: nginx
        state: latest

    - name: add group
      group:
        name: nginx
        state: present

    - name: add user
      user:
        name: nginx
        group: nginx

    - name: config
      template:
        src: ./template/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        owner: nginx
        group: nginx
        mode: '0644'

    - name: start nginx
      service:
        name: nginx
        state: started

    - name: check worker_processes
      shell: "ps -ef |grep nginx"
      register: "wk_pcs"                  # 定义变量,用于存储执行结果

    - name: debug worker_processes
      debug:
        msg: "{{ wk_pcs.stdout_lines }}"  # 输出变量中内容

5.3.4    结果验证

可以看到,不同的主机生成了不同数量的worker process进程
image.png

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注