目录
Ansible变量
变量定义范围
变量类型
定义变量并引用
事实变量与魔法变量
事实变量
魔法变量
Ansible加密
ansible-vault参数
ansible-vault举例
Ansible变量
Ansible支持利用变量来存储值,并且可以在Ansible项目的所有文件中重复使用这些值
变量可能包含下面这些值
要创建的用户
要安装的软件包
要重新启动的服务
要删除的文件
要从互联网检索的存档
变量命名规则
变量的命名必须以字母开头,并且只能包含字母、数字和下划线组成(不能包含空格)
变量定义范围
可以在ansible项目中的多个位置定义变量,根据不同的位置可以将变量大致简化为三个范围
全局范围(高优先级):在命令行或Ansible配置变量的变量
Play范围(中优先级):在Playbook和相关结构中设置的变量
主机范围(低优先级):由清单inventory、事实收集facts或注册register的变量,在主机和个别主机上设置的变量
如果存在多个级别定义了相同名称的变量,则以高优先级的变量为准
变量类型
字符串类型
service_port: 80 或 service_port=80
数组类型
user:
name:
admin1
admin2
uid:
1230
1000
提取数组类型变量的两种方式
user.name 提取的变量为admin1和amdin2
user[‘name’] 提取的变量为admin1和admin2
定义变量并引用
全局范围:在playbook执行时定义变量并引用(此处定义字符串变量)
通过{{ }}引用变量(将变量名称放在花括号{{ }}中),通过-e定义变量
vim httpd.yml --- - hosts: web tasks: - name: install {{ package_name }} packages yum: name: "{{ package_name }}" state: present - name: modify firewalld rules firewalld: port: "{{ service_port }}/tcp" immediate: yes permanent: yes state: enabled ansible-playbook -e package_name=httpd -e service_port=80 httpd.yml
Play范围:在playbook内定义变量并引用(此处定义字符串变量)
通过vars定义变量,通过{{ }}引用变量(将变量名称放在花括号{{ }}中)
编写剧本并定义、引用变量 vim httpd.yml --- - hosts: web vars: package_name: httpd service_port: 80 tasks: - name: install {{ package_name }} packages yum: name: "{{ package_name }}" state: present - name: modify firewalld rules firewalld: port: "{{ service_port }}/tcp" immediate: yes permanent: yes state: enabled 执行剧本 ansible-playbook httpd.yml
Play范围:在playbook中指定外部文件作为变量文件并引用(通过 “{{ 变量名 }}” 引用变量)--(此处定义数组变量)
在playbook中使用var_files引用外部文件作为变量文件,通过{{ }}引用变量(将变量名称放在花括号{{ }}中)
在外部文件中定义变量 vim ~/ansible/users.yml users: admin1: name: admin1 uid: 1200 创建剧本,并引用外部变量文件 vim user_list.yml --- - name: create users hosts: web vars_files: - users.yml tasks: - name: create user admin1 user: name: "{{ users.admin1.name }}" uid: "{{ users['admin1']['uid'] }}" state: present 执行剧本 ansible-playbook user_list.yml
主机范围:在资产清单inventory文件内定义变量,然后在playbook中引用
给特定主机、主机组定义变量
在资产清单文件中定义变量 vim ~/ansible/inventory [web] node1 [ftp] node2 [web:vars] #为web主机组定义变量 package_name=httpd service_port:=80 创建剧本文件并引用变量 vim httpd.yml --- - hosts: web tasks: - name: install {{ package_name }} packages yum: name: "{{ package_name }}" state: present - name: modify firewalld rules firewalld: port: "{{ service_port }}/tcp" immediate: yes permanent: yes state: enabled 执行剧本,使用指定的资产清单(定义了变量的资产清单) ansible-playbook -i ~/ansible/inventory httpd.yml
主机范围:使用已经注册的变量捕获命令输出
使用register语句进行捕获命令的输出(用于调试或其他目的)
使用debug模块将注册变量的值(由register获取到的值)存储到终端显示出来
即:查看register所对应模块的执行结果(通过json格式显示)
vim httpd.yml --- - hosts: web tasks: - name: install httpd packages yum: name: httpd state: present register: yesok - name: debug debug: var: yesok 或者 msg: "{{ yesok }}"
事实变量与魔法变量
事实变量
Ansible管理事实是在受管主机上检测到的变量,是主机范围类型的变量;包含主机名、内核版本、IP地址等信息;我们借助事实变量能够方便的检测被管理主机的状态;
默认在执行第一个Playbok之前会借助setup模块收集受管主机的状态,并存放在ansible_facts默认变量中,格式是json格式
查看某个主机的事实变量
通过ansible 主机名 -m setup 查看此主机/主机组的事实变量
也可以通过debug模块来查看ansible_facts变量的值
通过变量名提取事实变量的值
提取方式同提取数组类型变量,都是两种方式(可以根据ansible 主机名 -m setup的输出结果来编写如何提取变量)
主机名: ansible_facts['hostname'] 或 ansible_facts.hostname 完全有效域名: ansible_facts['fqdn'] 或 ansible_facts.fqdn 主要IPv4地址: ansible_facts['default_ipv4']['address'] 或 ansible_facts. default_ipv4.address /dev/vda的大小: ansible_facts['devices'] ['vda']['size'] 或ansible_facts.devices.vda.size
如果不想去收集事实变量的话,可以做以下设置(可以加快剧本的运行)
在配置playbook时,加上gather_facts对象(与hosts同一层级)
gather_facts: no yes表示会收集,no表示不会收集
魔法变量
魔法变量并不是事实变量,也不是通过setup模块配置的;是由Ansible自动设置的,可以用于获取特定受管主机的相关信息(Ansible内置变量)
常用魔法变量包含:
hostvars:包含受管主机的变量,用于获取另一台受管主机的变量的值 group_names:列出当前受管主机所属的所有组 groups:列出清单中的所有组和主机 inventory-hostname:包含清单中的当前受管主机的主机名称
可以通过debug模块来获取主机上的魔法变量
ansible 主机名 -m debug -a "var=hostvars.localhost"
Ansible加密
Ansible vault是ansible的一项功能,可以将敏感数据(密码或者密钥)保留在加密文件中,然后在ansible.cfg配置文件中的vault_password_file 字段指定加密文件的路径,此时就可以通过ansible-vault命令来创建、编辑、加密、解密和查看yml文件
ansible-vault参数
ansible-valut --ask-vault-pass 要求需要输入密码(在执行加密的Yml文件、检验加密的Yml文件的语法时需要使用此参数)
ansible-vault --vault-password-file 指定加解密所使用的加密文件(默认使用ansible.cfg中vault_password_file字段对应的文件作为加密文件)
ansible-vault creat 创建一个加密的yml文件(一般不推荐直接使用ansile-vault创建空的加密yml文件,一般是通过vim创建yml文件,然后再通过ansible.vault加密)
ansible-vault encrypt 对现有的yml文件进行加密
ansible-vault view 查看加密yml文件
ansible-vault edit 编辑加密的yml文件
ansible-vault decrypt 对现有的加密yml文件进行解密
ansible-vault rekey 对现有的yml文件更新密码(注意更新密钥时需要把ansible.cfg配置文件中的vault_password_file 字段给去掉或注释掉)
ansible-vault举例
配置加密文件并在ansible.cfg中指定
vim /home/greg/ansible/vault.yml admin@123 vim ansible.cfg vault_password_file = /home/greg/ansible/vault.yml
对现有的yml文件进行加密
ansible-vault encrypt httpd.yml
查看加密的yml文件
ansible-vault view httpd.yml