ansible的变量和事实

1. 管理变量

1.1 变量简介

命名变量:
变量名称必须以字母开头,并且只能含有字母、数字和下划线
定义变量:

  • 全局范围:从命令行或 ansible 配置设置的变量
  • play 范围:在 play 和相关结构中设置的变量
  • 主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量

如果多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围

1.2 在playbook 中的变量

定义变量:
1.常见方式:在 playbook 开头的 vars 块中:

---
 - host: all 
  vars: 
     users: student
     home: /home/student

2.在外部文件定义 playbook 变量
在users.yml文件中定义变量

     users: student
     home: /home/student

在playbook中定义变量文件

---
 - host: all 
  vars_files: vars/users.yml    

使用变量:
在 playbook 中使用变量 (将变量名称放在花括号内即可 )

vars:
  user: student
tasks:
 - name :Create user {{user}}
     user:
        name: "{{user}}"    

使用数组作为变量:

####定义变量
users:
	lilei:
		first_name: lei
		last_name: li
		home_dir: /home/lilei
	liming:
		first_name: ming
		last_name: li
		home_dir: /home/liming
###访问变量(两种方式)
users.lilei.first_name
users['lilei']['first_name']

注意:当变量用作开始一个值的第一个元素时,必须使用引号

1.3 主机变量和组变量

直接应用于主机的清单变量分为两大类:

  • 主机变量:应用于特定主机
  • 组变量:应用于一个主机组或一组主机组中的所有主机

主机变量优先于组变量,但是 playbook 中定义的变量比这两者更高
定义主机变量和组变量::
方法一:这种做法使得清单文件难以处理,在同一文件中混合提供主机和变量信息,语法也过时(比较旧,不建议采用)

 ###定义 rhel8_no1.test.com 的 ansible_user 主机变量
[webservers] 
rhel8_no1.test.com  ansible_user=student 
 ### 定义 dbservers 主机组的 user 组变量
[dbserver] 
dbserver1.example.com
dbserver2.example.com        
[dbservers:vars]
user=student
###定义嵌套组 user 变量:
[servers1]
node1.example.com 
node2.example.com
[servers2] 
node3.example.com 
[servers:children] 
servers1 
servers2 
[servers:vars] 
user=student

方法二:使用目录填充主机和组变量
定义主机和主机组变量的首选做法是在与清单文件或目录相同的工作目录中,创建 group_vars 和 host_vars 两个目录,这两个目录分别包含用于定义组变量和主机变量的文件

1.4 使用已注册变量捕获命令输出

管理员可以使用 register 语句捕获命令输出

--- 
- name: Install a packages 
  hosts: rhel8_no1.test.com 
  tasks: 
   - name: Install 
     yum: 
       name: httpd 
       state: installed 
     register: install_result 
  - debug: var=install_resul

在这里插入图片描述

1.5 示例

创建 playbook,来安装 apache 并开启,使其可被访问,playbook 查询 web 服务器并确认它已经设置好并在运行
①:vim playbook.yml ##编写playbook

---
 - name: Configure Apache
  hosts: rhel8_no1.test.com
  vars:       ###定义变量
    web_pkg: httpd
    firewall_pkg: firewalld
    web_service: httpd
    firewall_service: firewalld
    rule: http
    python_pkg: python3-PyMySQL
  tasks:
     - name: install packages
       yum:
         name: 
           - "{{web_pkg}}"
           - "{{firewall_pkg}}"
           - "{{python_pkg}}"
         state: latest
     - name: The {{firewall_service}} started and enabled
       service:
         name: "{{firewall_service}}"
         enabled: true
         state: started
     - name: The {{web_service}} started and enabled
       service:
         name: "{{web_service}}"
         enabled: true
         state: started
      - name: Configure index.html
       copy:
         content: "hello ansible!"
         dest: /var/www/html/index.html
     - name: firewall permits {{rule}}
       firewalld:
            service: "{{ rule }}"
            permanent: true
            immediate: true
            state: enabled
 - name: test in localhost
  hosts: localhost
  become: false        ###在本机对远程受管主机的Apache页面进行测试
  tasks:
    - name: Curl webserver
      uri:
        url: http://rhel8_no1.test.com
        status_code: 200
...

②:ansible-playbook playbook.yml ##执行playbook
在这里插入图片描述
③:通过浏览器访问http://rhel8_no1.test.com
在这里插入图片描述

2. 加密管理

ansible 可能需要访问密码或者 api 密钥等敏感数据,以便配置主机。加密解密工具:ansible-vault 命令
①:创建加密文件ansible-vault filename
在这里插入图片描述
②:通过保存密码的文件创建加密文件 :ansible-vault create --vault-password-file=passwdfile hehe.yml
③:查看加密文件 :ansible-vault view filename
在这里插入图片描述
④:ansible-vault edit filename ##编辑现有加密文件
⑤:加密已存在的文件:ansible-vault encrypt filename (可以同时加密多个文件 ;- -output=filename,将加密文件另保存一份)
⑥:解密文件:ansible-vault decrypt filename
⑦:更改加密文件密码:ansible-vault rekey filename
⑧:ansible-playbook --vault-id @prompt user.yml ##以交互式输入密码的形式运行user.yml文件
⑨:ansile-playbook --vault-password-file=passwd-file user.yml ##以加密文件的方式运行user.yml文件

3. 管理事实

3.1 系统变量查看事实

事实包括:主机名称、内核版本、网络借口、IP 地址等
查看主机信息:

--- 
 - name: Fact dump 
  hosts: all
  tasks: 
    - name: Print all facts 
      debug: 
         var: ansible_facts  ##系统已有的变量名称

在这里插入图片描述
将事实替换为动态的值:

---
 - name: FACT
  hosts: rhel8_no1.test.com
  tasks:
    - name: print ip and dn
      debug:
        msg:
          The IPv4 address of {{ ansible_facts.fqdn }}  ##使用字典的方式查询
          is {{ ansible_facts.all_ipv4_addresses }}

在这里插入图片描述
使用setup模块显示所有事实:
显示rhel8_no1.test.com受管主机的所有信息:ansible rhel8_no1.test.com -m setup
关闭事实收集,提升运行速度:

---
 - name: Configure User
  hosts: rhel8_no1.test.com
  gather_facts: no   ##关闭事实收集
  tasks:
    - name: Student User
      user:
        name: student
        uid: 1000
        state: present
...
3.2 创建自定义事实

通常在/etc/ansible/facts.d目录下编写以.fact为扩展名的自定义事实文件

###INI格式
[packages]
web_package = httpd 
db_package = mariadb-server 
[users] 
user1 = westos 
user2 = redhat

一般来说,最好使用JSON格式,调用事实时与默认事实的字典方式一致
示例:①:vim test.fact ##编写自定义事实文件

###JSON格式
{
"packages": { 
   "web_package": "httpd", 
   "db_package": "mariadb-server" 
   }, 
 "users": { 
     "user1": "westos",
      "user2": "redhat" 
      } 
 }

②:查看本机所有事实 ansible localhost -m setup
在这里插入图片描述

3.3 使用魔法变量

常用的有四个:

类型解释
hostvars包含受管主机的变量,可以用于获取另一台受管主机的变量的值
group_names列出当前受管主机所属的所有组
groups列出清单中的所有组和主机
inventory_hostname包含清单中配置的当前受管主机的主机名称

用途示例:
使用 debug 模块报告特定主机的 hostvars 的值:ansible localhost -m debug -a 'var=hostvars["rhel8_no1.test.com"]'
在这里插入图片描述

3.4 管理事实练习

①:vim custom.fact ##创建自定义变量

[westos] 
package = httpd 
service = httpd
state = started 
enabled = true

②:vim fact.yml ##编写playbook ,在受管主机上自定义事实

---
- name: Imstall facts
  hosts: rhel8_no1.test.com
  vars:
     remote_dir: /etc/ansible/facts.d
     facts_file: custom.fact
  tasks:
       - name: Create Directory
         file:
           state: directory
           recurse: yes
           path: "{{remote_dir}}"
       - name: create new facts
         copy:
          src: "{{facts_file}}"
          dest: "{{remote_dir }}"

③:ansible-playbook fact.yml ##实施playbook
在这里插入图片描述
④:ansible rhel8_no1.test.com -m setup ##查看受管主机的所有信息,自定义事实创建成功
在这里插入图片描述
⑤:vim fact.yml ##编写主playbook,在受管主机上安装Apache,并开启服务

---
- name: Install Apache  and stars
  hosts: rhel8_no1.test.com
  tasks:
   - name: install packages
     yum:
        name: "{{ansible_facts['ansible_local']['custom']['westos']['package']}}"
        state: latest
   - name: start httpd
     service:
        name: "{{ ansible_facts['ansible_local']['custom']['westos']['service'] }}"
        state:  "{{ ansible_facts['ansible_local']['custom']['westos']['state'] }}"
        enabled: "{{ ansible_facts['ansible_local']['custom']['westos']['enabled'] }}"

⑥:ansible rhel8_no1.test.com -m command -a 'systemctl status httpd' ##检测在rhel8_no1.test.com上是否开启httpd服务
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值