目录
1. 变量
将playbook中的某些值使用变量代替,从而简化playbook的编写。
1.1 变量内容
- 要创建的用户
- 要安装的软件包
- 要重启的服务
- 要删除的文件
- 要从互联网检索的文档
1.2 变量命名
- 变量名称必须以字母开头,并且只能含有字母、数字和下划线
1.3 变量定义
范围级别 | 该范围变量定义 |
全局范围 | 从命令行或 ansible 配置设置的变量 |
play范围 | 在 play 和相关结构中设置的变量 |
主机范围 | 由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量 |
如果多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围
1.4 playbook中定义变量
- 在 playbook 开头的 vars 块中
- 在外部文件定义 playbook 变量
vim users.yml
###
user: westos
home: /home/westos
###
1.5 playbook中变量的使用
将变量名称放在花括号内即可
---
vars:
user: wesots ## 定义变量user内容为westos
tasks:
- name: Create user {{ user }} ## 通过{{ }}使用变量
user:
name: "{{user}}" ## 当变量用作开始一个值的第一元素时,必须使用引号,不然会报错
...
若缺少引号:
1.6 主机变量和组变量
直接应用于主机清单变量分为两大类:
- 主机变量:应用于特定主机
- 组变量:应用于一个主机组或一组主机组中的所有主机
主机变量优先于组变量,但是playbook中定义的变量比这两者更高
1.6.1 定义主机变量和组变量
方法一:[旧方法,不建议]
## 定义servera.dsd.com的ansible_user主机变量
[webserver]
servera.dsd.com ansible_user=westos
## 定义dbservers主机组的user组变量
[dbservers]
dbserver1.dsd.com
dbserver2.dsd.com
[dbservers:vars]
user=westos
## 定义嵌套组user变量
[servers1]
node1.dsd.com
node2.dsd.com
[servers2]
node3.dsd.com
node4.dsd.com
[servers:children]
servers1
servers2
[servers:vars]
user=westos
缺点:清单文件难以处理,在同一文件中混合提供主机和变量信息,语法也过时
方法二:使用目录填充主机和组变量
定义主机和主机组变量,在工作目录下包含ansible.cfg文件、inventory文件以及playbook文件,创建host_vars【主机变量目录】和group_vars【组变量目录】两个目录,分别包含用于定义组变量和主机变量的文件
项目目录包含:ansible.vfg、inventory、playbook.yml以及group_vars和host_vars
1.7 数组作为变量
调用方式一:
user.lilei.first_name
user.hanmeimei.last_name
调用方式二:
user['lilei']['first_name']
user['hanmeimei']['last_name']
1.8 已注册变量捕获命令输出
管理员通过register注册一个变量,通过debug将结果显示出来
---
- name: install a package
hosts: all
tasks:
- name: install
yum:
name: httpd
state: installed
register: install_result
- debug: var=install_result
...
1.9 管理变量的练习
创建playbook,安装apahce并开启,使其可以被访问,并且查询web服务器并确认它已经设置好并在运行
---
# web_package
# firewall_package
# web_service
# firewall_service
# python_package
# rule 规则变量
- name: Configure Apache
hosts: web
vars:
web_package: httpd
firewall_package: firewalld
web_service: httpd
firewall_service: firewalld
python_package: python3-PyMySQL
rule: http
tasks:
- name: Install Package # 确保安装软件包且是最新版本
yum:
name:
- "{{ web_package }}"
- "{{ firewall_package }}"
- "{{ python_package }}"
state: latest
- name: The {{ firewall_service }} started and enabled # 确保firewalld开机启动
service:
name: "{{ firewall_service }}"
enabled: true
state: started
- name: The {{ web_service }} started and enabled # 确保apache开机启动
service:
name: "{{ web_service }}"
enabled: true
state: started
- name: Configure index.html # 配置默认发布页面
copy:
content: "Hello Westos!"
dest: /var/www/html/index.html
- name: firewall permits http # 配置防火墙允许访问http
firewalld:
service: "{{ rule }}"
permanent: true
immediate: true
state: enabled
- name: verify the apache # 检测apache服务
hosts: localhost
become: false # 本机测试 ,不必更改身份
tasks:
- name: curl webserver
uri: # uri由python提供,为了在这里测试,因此我们安装python
url: http://servera.dsd.com
status_code: 200 # 状态码为200,正常
...
检测语法:
运行:
2. 管理机密
2.1 目标
使用ansible vault加密敏感变量,并运行vault加密变量文件的playbook
2.2 ansible vault
ansible可能需要访问密码或者api密钥等敏感数据,以便于配置主机
2.3 创建加密文件
方法:ansible-vault create filename
创建加密文件
ansible-vault create secret.yml ## 需要输入两次密码
ansible-vault create --vault-password-file=westos secret.yml ## 创建加密文件并同时保存密码,westos文件中必须先写入密码
若westos文件中没有密码时,报该错误
查看加密文件
在进行加密操作后,我们会发现通过cat命令读取到文件内容为加密后内容
##方法:
ansible-vault view filename
ansible-vault view secret.yml
编辑加密文件
原理:将文件解密为一个临时文件并编辑,保存时,复制内容并删除临时文件,'edit'命令始终重写文件,因此只有在更改文件时使用,查看用'view'
ansible-vault edit secret.yml ## 刚该加密文件内容
加密现有文件
## 方法:
ansible-vault encrypt filename ## filename参数可以是多个
##
可以使用--output=filename将加密文件保存为新的名称,使用此参数时输入文件只能是一个
解密现有文件
## 方法:
ansible-vault decrypt filename ## 解密该文件
ansible-vault decrypt westos.yml --output=redhat.yml ## 解密文件同时修改文件名称
更改加密文件密码
## 方法:
ansible-vault rekey filename
ansible-vault rekey dsd.yml ## 修改dsd.yml文件密码
## 若密码不是通过交互,而是在一个文件中时,我们修改密码最好使用--new-vault-password-file
ansible-vault rekey --new-vault-passwprd-file=dsd westos.yml
playbook和ansible vault
ansible-playbook user.yml ## 运行加密的playbook,没有密码则报错
ansible-playbook --vault-id @prompt user.yml ##交互式提供密码
## 2.4之前的ansible,使用--ask-vault-pass提供交互式密码
## 也可以将密码保存在文件中(注意使用文件系统权限对文件进行保护)
ansible-playbook --vault-password-file=password user.yml
3. 管理事实
事实包括:主机名称、内核版本、网络接口、IP地址等
3.1 描述ansible事实
- 查看主机信息
[root@workstation facts]# cat fact.yml
---
- name: Fact
hosts: all
tasks:
- name: print fact
debug:
var: ansible_facts # 系统变量名
...
- 将事实替换成动态的值
---
- hosts: all
tasks:
- name: print ansible facts
debug:
msg:
The IPv4 address of {{ ansible_facts.fqdn }}
is {{ ansible_facts.all_ipv4_addresses }}
...
######
The IPv4 address of {{ ansible_facts.fqdn }} # 使用字典的方式查询值
is {{ ansible_facts.all_ipv4_addresses }}
3.2 ansible事实作为变量注入
- 使用setup模块显示所有事实信息
ansible servera.dsd.com -m setup
- 关闭事实收集,来提升执行速度
---
- name: Configure User
hosts: servera.dsd.com
gather_facts: no
tasks:
- name: wesots user
user:
name: westos
uid: 1000
state: present
...
3.3 创建自定义事实
- INI格式
[packages]
web_package = httpd
db_package = mariadb-server
[users]
user1 = westos
user2 = redhat
- JSON格式
{
"packages": {
"web_package": "httpd",
"db_package": "mariadb-server"
},
"users": {
"user1": "westos",
"user2": "redhat"
}
}
- 自定义事实
[root@workstation ~]# mkdir /etc/ansible/facts.d
[root@workstation ~]# cd /etc/ansible/facts.d/
[root@workstation facts.d]# vim custom.fact
[root@workstation facts.d]# ansible localhost -m setup
4. 魔法变量
魔法变量 | 作用 |
hostvars | 包含受管主机的变量,可以用于获取另一台受管主机的变量的值 |
group_names | 列出当前受管主机所属的所有组 |
groups | 列出清单中的所有组和主机 |
inventory_hostname | 包含清单中配置的当前受管主机的主机名称 |
- 使用debug模块报告特定主机的hostvars的值
ansible localhost -m debug -a 'var=hostvars["servera.dsd.com"]'
5. 管理事实练习
[root@workstation~]#mkdirdata-facts
[root@workstation data-facts]#cat ansible.cfg
[defaults]
inventory=./inventory
[root@workstation data-facts]#cat inventory
[web]
servera.dsd.com
[root@workstation data-facts]#ansiblewebservers-msetup #显示信息
## 创建自定义变量
[root@workstation data-facts]#vim custom.fact
[root@workstation data-facts]#cat custom.fact
[westos]
package = httpd
service = httpd
state = started
enabled = true
## 创建playbook
[root@workstation data-facts]#vim facts.yml
---
- name: Install facts
hosts: web
vars:
remote_dir: /etc/ansible/facts.d
facts_file: custom.fact
tasks:
-name: Create directory
file:
state: directory
recurse: yes
path: "{{remote_dir}}"
-name: Install new facts
copy:
src: "{{facts_file}}"
dest: "{{remote_dir}}"
## 检测ansible_local变量,当前没有
[root@workstation data-facts]#ansible web -m setup
## 语法检测
[root@workstation data-facts]#ansible-playbook--syntax-checkfacts.yml
## 运行
[root@workstation data-facts]#ansible-playbook facts.yml
## 编写主playbook
---
- name: Install Apache and starts
hosts: webservers
tasks:
-name: Install Packages #安装httpd
yum:
name: "{{ ansible_facts['ansible_local']['custom']['westos']['package'] }}"
state: latest
-name: Starthttpd #启动
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'] }}"
## 验证httpd服务没有在servera上运行
[root@workstation data-facts]#ansible servera.dsd.com -m command-a 'systemctl status httpd'
## 语法检测
[root@workstationdata-facts]#ansible-playbook--syntax-check playbook.yml
## 运行
[root@workstation data-facts]#ansible-playbook playbook.yml