目录
- 1. 管理变量
- 1.1 变量简介
- 1.2 在playbook 中的变量
- 1.3 主机变量和组变量
- 1.4 使用已注册变量捕获命令输出
- 1.5 示例
- 2. 加密管理
- 3. 管理事实
- 3.1 系统变量查看事实
- 3.2 创建自定义事实
- 3.3 使用魔法变量
- 3.4 管理事实练习
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服务