ansible-playbook-变量
1.playbook-变量
变量名规范:仅由字母,数字和下划线组成,并且不能以数字开头。
变量来源:
1、ansible 的 setup facts 远程主机的所有变量都可直接调用根据变量生成文件 2、通过命令行指定变量,优先级最高 ansible-playbook -e "varname=value" test.yml 3、在playbook文件中定义定义: vars: var1: value1 var2: value2 4、在独立|专用的变量YAML文件中定义 - hosts: all vars_files: - vars.yml 5、在主机清单文件中定义 6、在项目中针对主机和主机组定义 (在项目目录中创建 host_vars和group_vars目录) 7、在role中定义
变量的优先级从高到低:
-e选项定义变量==>playbook中vars_files==>playbook中vars变量定义==>host_vars/主机名文件==>主机清单中主机变量==>group_/主机名文件==>主机清单中主机变量==>组/主机组名文件==>组_vars/all文件==>主机清单组变量
变量的调用:
调用变量:需要在变量名外面加上花括号,例:{{ varname }} varname两边要有空格
2.playbook-变量定义-通过setup调用变量
2.1 ansible-playbook 利用setup模块远程主机获取远程主机的内置变量,我们这里引用内置变量生成文件名。
用ansible测试setup模块得到ansible_fqdn信息:
[root@localhost ansible]# ansible all -m setup -a "filter=ansible_fqdn" 192.168.235.152 | SUCCESS => { "ansible_facts": { "ansible_fqdn": "localhost.localdomain", "discovered_interpreter_python": "/usr/bin/python" }, "changed": false } 43.143.98.52 | SUCCESS => { "ansible_facts": { "ansible_fqdn": "VM-4-13-centos", "discovered_interpreter_python": "/usr/bin/python" }, "changed": false }
编写ansible-playbook任务bl.yml:
[root@localhost ansible]# cat bl.yml --- - hosts: webservers remote_user: root tasks: - name: create file file: name=/home/{{ ansible_fqdn }}.log state=touch - name: bl debug: msg: "调用setup模块,引用内部变量生成文件名称"
执行bl,yml
[root@localhost ansible]# ansible-playbook bl.yml
PLAY [webservers] *************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************
ok: [192.168.235.152]
ok: [43.143.98.52]
TASK [create file] ***********************************************************************************************
changed: [192.168.235.152]
changed: [43.143.98.52]
TASK [bl] ********************************************************************************************************
ok: [192.168.235.152] => {
"msg": "调用setup模块,引用内部变量生成文件名称"
}
ok: [43.143.98.52] => {
"msg": "调用setup模块,引用内部变量生成文件名称"
}
PLAY RECAP *******************************************************************************************************
192.168.235.152 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
43.143.98.52 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
查看远程主机,可以看到相关文件生成。
3.在命令行里通过-e参数,给变量赋值
查看bl.yml
[root@localhost ansible]# cat bl.yml --- - hosts: webservers remote_user: root tasks: - name: create file file: name=/home/{{ ansible_fqdn }}.log state=touch - name: bl debug: msg: "调用setup模块,引用内部变量生成文件名称" - name: 在命令行里通过-e参数,给变量赋值 file: name=/home/{{ diy }}.log state=touch
执行bl.yml
[root@localhost ansible]# ansible-playbook -e "diy=my_home" bl.yml PLAY [webservers] ****************************************************************************************** TASK [Gathering Facts] ************************************************************************************* ok: [192.168.235.152] ok: [43.143.98.52] TASK [create file] ***************************************************************************************** changed: [192.168.235.152] changed: [43.143.98.52] TASK [bl] ************************************************************************************************* ok: [192.168.235.152] => { "msg": "调用setup模块,引用内部变量生成文件名称" } ok: [43.143.98.52] => { "msg": "调用setup模块,引用内部变量生成文件名称" } TASK [在命令行里通过-e参数,给变量赋值] ************************************************************************ changed: [192.168.235.152] changed: [43.143.98.52] PLAY RECAP ************************************************************************************************ 192.168.235.152 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 43.143.98.52 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
查看相应的远程主机,就可以看到/home/my_home.log文件的生成。
4.在playbook文件中定义
vars:
var1: value1
var2: value2
查看varin_ansible-playbook.yml
[root@localhost ansible]# cat varin_ansible-playbook.yml --- - hosts: webservers remote_user: root vars: filename: my_file tasks: - name: "vars定义在playbook里的变量" file: name=/home/{{ filename }}.txt state=touch [root@localhost ansible]# cat varin_ansible-playbook.yml --- - hosts: webservers remote_user: root vars: filename: my_file tasks: - name: "vars定义在playbook里的变量" file: name=/home/{{ filename }}.txt state=touch
执行varin_ansible-playbook.yml
[root@localhost ansible]# ansible-playbook varin_ansible-playbook.yml PLAY [webservers] ************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************** ok: [192.168.235.152] ok: [43.143.98.52] TASK [vars定义在playbook里的变量] *********************************************************************************** changed: [192.168.235.152] changed: [43.143.98.52] PLAY RECAP ******************************************************************************************************** 192.168.235.152 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 43.143.98.52 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
5.使用专用的公共的变量文件
可以在一个独立的playbook文件中定义公共变量,在其它的playbook文件中可以引用变量文件中的变量
此方式比playbook中定义的变量优化级高
在my_vars.yml 中定义变量
[root@localhost ansible]# cat my_vars.yml name_url: "这是在独立的yml中定义的变量" file_name: my_file_name_this
在file_vars_out.yml中调用my_vars.yml中定义的变量
[root@localhost ansible]# cat file_vars_out.yml --- - hosts: webservers remote_user: root vars_files: - my_vars.yml tasks: - name: "{{ name_url }}" file: name=/home/{{ file_name }}.log.out state=touch
执行file_vars_out.yml
[root@localhost ansible]# ansible-playbook file_vars_out.yml PLAY [webservers] ************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************* ok: [192.168.235.152] ok: [43.143.98.52] TASK [这是在独立的yml中定义的变量] ************************************************************************************* changed: [192.168.235.152] changed: [43.143.98.52] PLAY RECAP ******************************************************************************************************** 192.168.235.152 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 43.143.98.52 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
查看远程主机对应路径,即可看到生成的文件。
6.在主机清单文件中定义
在cd /etc/ansible/路径下,先备份主机清单文件cp hosts hosts_bak,然后修改主机清单vi hosts
[root@localhost ansible]# cat hosts [webservers] 192.168.235.152 host=web01 #配置主机变量,只针对152有效 43.143.98.52 host=web02 #配置主机变量,只针对52有效 [webservers:vars] #分组变量,只针对webservers组下的主机有效 domain=company [localhostservers] 127.0.0.1 [all:vars] #针对所有分组都有效的变量 suffix=edu
执行剧本前,先查看远程主机执行的主机名
192.168.235.152
43.143.98.52
cat ansible-playbook
[root@localhost ansible]# cat inventory.yml --- - hosts: webservers remote_user: root tasks: - name: "设置主机名" hostname: name="{{ host }}. {{ domain }}. {{ suffix }}" [root@localhost ansible]# vi inventory.yml [root@localhost ansible]# cat inventory.yml --- - hosts: webservers remote_user: root tasks: - name: "设置主机名" hostname: name="{{ host }}.{{ domain }}.{{ suffix }}"
执行ansible-playbook
[root@localhost ansible]# ansible-playbook inventory.yml PLAY [webservers] ************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************* ok: [192.168.235.152] ok: [43.143.98.52] TASK [设置主机名] *************************************************************************************************** changed: [43.143.98.52] changed: [192.168.235.152] PLAY RECAP ******************************************************************************************************** 192.168.235.152 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 43.143.98.52 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
7.在项目中针对主机和主机组定义 (在项目目录中创建 host_vars和group_vars目录)
markdown
my_project/ ├── inventory/ │ ├── group_vars/ │ │ ├── webservers.yml │ │ └── databases.yml │ └── host_vars/ │ ├── webserver1.yml │ ├── webserver2.yml │ └── database1.yml └── playbook.yml
可以在项目目录中创建host_vars
和group_vars
目录来定义主机和主机组的特定变量。
在上述示例中,inventory
目录包含group_vars
和host_vars
子目录。这些子目录中的文件定义了主机和主机组的特定变量。
在group_vars
目录中,可以创建针对每个主机组的文件。例如,webservers.yml
文件可以包含Web服务器组的主机组定义,而databases.yml
文件可以包含数据库服务器组的主机组定义。这些文件中的变量将适用于属于相应主机组的所有主机。
在host_vars
目录中,可以创建针对每个单独主机的文件。例如,webserver1.yml
文件可以包含名为webserver1
的主机的特定变量定义,而database1.yml
文件可以包含名为database1
的主机的特定变量定义。这些文件中的变量仅适用于相应的主机。
当你在Ansible Playbook中使用主机或主机组时,可以在任务中使用这些变量。例如,在playbook.yml
文件中,你可以编写针对Web服务器组的任务,并使用在webservers.yml
文件中定义的变量。同样地,你可以编写针对特定主机的任务,并使用在相应的.yml
文件中定义的变量。
这样,通过创建host_vars
和group_vars
目录,并在其中定义主机和主机组的特定变量,你可以轻松地在Ansible项目中管理和引用这些变量。
8.在role中定义
ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。
roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。
要使用roles只需要在playbook中使用include指令即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,
并可以便捷地include它们的一种机制。
角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
特点:
复杂场景:建议使用roles,代码复用度高
- 变更指定主机或主机组
- 如命名不规范维护和传承成本大
- 某些功能需多个Playbook,通过includes即可实现
8.1 Roles各目录作用
官方推荐在/etc/ansible/roles/
目录下创建项目。
目录 | 描述 |
---|---|
/roles/project | 项目名称 (然后再该项目下创建子目录) |
files/ | 存放由copy或script模块等调用的文件 |
templates/ | template模块查找所需要模块文件的目录 |
tasks/ | 定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含 |
vars/ | 定义变量,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含 |
meta/ | 定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其他文件需在此文件中通过include进行包含 |
default/ | 设定默认变量时使用此目录中的main.yml文件 |
8.2 修改主机名示例
在/etc/ansible/roles中创建项目my_role
[root@localhost roles]# mkdir my_role [root@localhost roles]# ll 总用量 0 drwxr-xr-x. 4 root root 31 9月 24 20:59 my_role [root@localhost roles]# pwd /etc/ansible/roles
在/etc/ansible/roles/my_role/ 下创建文件夹/tasks,接着在tasks文件夹下创建main.yml文件
[root@localhost tasks]# pwd /etc/ansible/roles/my_role/tasks [root@localhost tasks]# ll 总用量 4 -rw-r--r--. 1 root root 75 9月 24 23:40 main.yml [root@localhost tasks]# cat main.yml --- - name: Set the hostname hostname: name: "{{ hostname }}"
在/etc/ansible/roles/my_role/ 下创建文件夹vars,接着在vars下创建文件main.yml
[root@localhost vars]# pwd /etc/ansible/roles/my_role/vars [root@localhost vars]# ll 总用量 4 -rw-r--r--. 1 root root 21 9月 24 20:54 main.yml [root@localhost vars]# cat main.yml --- hostname: myhost
创建剧本ansible-playbook,在哪个路径都可以
[root@localhost role]# cat role.yml --- - hosts: webservers remote_user: root tasks: - name: Apply the role include_role: name: my_role
执行ansible-playbook
[root@localhost role]# ansible-playbook role.yml PLAY [webservers] ************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************** ok: [192.168.235.152] ok: [43.143.98.52] TASK [Apply the role] ********************************************************************************************** TASK [my_role : Set the hostname] ********************************************************************************** changed: [43.143.98.52] changed: [192.168.235.152] PLAY RECAP ******************************************************************************************************** 192.168.235.152 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 43.143.98.52 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0