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_varsgroup_vars目录来定义主机和主机组的特定变量。

在上述示例中,inventory目录包含group_varshost_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_varsgroup_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   

 

 

 
posted @ 2023-09-19 10:56  家乐福的搬砖日常  阅读(576)  评论(0编辑  收藏  举报