Ansible 2.4:Playbook 中变量的多种使用方式 |
您所在的位置:网站首页 › 给一个变量赋值有几种方法 › Ansible 2.4:Playbook 中变量的多种使用方式 |
2.4:Playbook 中变量的多种使用方式
关于如何在Playbook中使用变量的官方文档:https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html 在Playbook中调用变量的方式有: 调用变量的值:{{ VARIABLE_NAME }}有时需要加双引号,避免被解析为内联字典:"{{ VARIABLE_NAME }}"当调用变量的字符串中有:时,避免被解析为key: value,也要为整个字符串加上引号:"STRING: {{ VARIABLE_NAME }}"当调用变量作为key: value中的value时,也需要加上引号:key: "{{ VARIABLE_NAME }}"调用变量名,则直接使用变量名,什么也不加:VARIABLE_NAME 比如在Playbook中的某些模块中使用var参数来指定变量名:debug: var=VARIABLE_NAMEPlaybook中调用的变量有以下来源: setup模块获取的fact信息,其中就包含了大量的变量,可以直接调用。 为Playbook传递的自定义变量,这其中包括了: 通过命令行 ansible-playbook -e VARIABLE_NAME=VALUE PLAYBOOK.yml 定义的变量;Playbook中通过var_files定义的变量文件中的变量;Playbook中通过vars定义的变量;Ansible项目中在host_vars/HOSTNAME文件中定义的主机变量(文件名是HOSTNAME,与主机清单中定义的主机名一致);主机清单文件中定义的主机变量;Ansible项目中在group_vars/GROUPNAME文件中定义的主机组变量(文件名是GROUPNAME,与主机清单中定义的主机组名一致);Ansible项目中在group_vars/all文件中定义的公共变量(该文件中定义的变量对主机清单中的所有主机生效);主机清单文件中定义的主机组变量。优先级从高到低。 为Playbook的Role传递的自定义变量: roles/ROLE_NAME/vars/main.yml文件中定义的变量;roles/ROLE_NAME/defaults/main.yml文件中定义的变量。优先级从高到低。 2.4.1:使用 facts 信息中的变量Playbook在执行时默认就会收集目标主机的facts信息并存为变量,可以指定变量来直接调用。当在Playbook中使用facts变量时,就不能将gather_facts设为no。 2.4.1.1:ansible_nodename该变量保存的是目标主机的主机名。 示例: - hosts: websrvs tasks: - name: ansible_nodename debug: msg: "目标主机名: {{ ansible_nodename }}"执行结果: 该变量保存的是目标主机特定网络接口的ipv4地址。 IFNAME为目标主机的网络接口名称,如eth0。 也可以由ansible_facts.IFNAME.ipv4.address取得。 示例: - hosts: websrvs tasks: - name: ansible_eth0.ipv4.address debug: msg: "eth0的ipv4地址: {{ ansible_eth0.ipv4.address }}"执行结果: 该变量保存的同样是目标主机特定网络接口的ipv4地址。 示例: - hosts: websrvs tasks: - name: ansible_facts.eth0.ipv4.address debug: msg: "eth0的ipv4地址: {{ ansible_facts.eth0.ipv4.address }}"执行结果: 该变量保存的是目标主机默认的ipv4地址。 示例: - hosts: websrvs tasks: - name: ansible_default_ipv4.address debug: msg: "默认的ipv4地址: {{ ansible_default_ipv4.address }}"执行结果: 通过指定分隔符和切分后的对象序号(序号从0开始),来取得变量值中需要的部分。 示例1: - hosts: websrvs tasks: - name: split debug: msg: "eth0的ipv4地址中的最后一个数字: {{ ansible_facts.eth0.ipv4.address.split('.')[-1] }}"执行结果1: 使用ansible-playbook命令执行Playbook时,可以通过-e VARIABLE_NAME=VALUE来定义变量,或通过-e '@VARIABLE_FILE'来指定变量文件。 2.4.2.1.1:定义变量Playbook 示例: [root@ansible ~]# vim remove.yml --- - hosts: websrvs tasks: - name: remove {{ rmfile_name }} file: path={{ rmfile_name }} state=absent ...在命令行中定义变量并执行Playbook: [root@ansible ~]# ansible-playbook -e rmfile_name=/etc/fstab -C remove.yml可以将多个变量定义在一个变量文件中: [root@ansible ~]# vim vars.yml src_file: files/ports.conf dest_file: /etc/apache2/ports.conf Playbook 示例: [root@ansible ~]# vim copy.yml --- - hosts: websrvs tasks: - name: copy {{ src_file }} to {{ dest_file }} on {{ ansible_nodename }} copy: src: "{{ src_file }}" dest: "{{ dest_file }}" ...在命令行中指定变量文件并执行Playbook: [root@ansible ~]# ansible-playbook -e '@vars.yml' -C copy.yml上边定义的vars.yml变量文件可以在Playbook中使用vars_files这个Keyword来指定。 Playbook 示例: [root@ansible ~]# vim copy.yml --- - hosts: websrvs vars_files: - vars.yml tasks: - name: copy {{ src_file }} to {{ dest_file }} on {{ ansible_nodename }} copy: src: "{{ src_file }}" dest: "{{ dest_file }}" ...执行结果: 上述变量文件中的变量可以在Playbook中使用vars来直接定义: [root@ansible ~]# vim copy.yml --- - hosts: websrvs vars: src_file: files/ports.conf dest_file: /etc/apache2/ports.conf tasks: - name: copy {{ src_file }} to {{ dest_file }} on {{ ansible_nodename }} copy: src: "{{ src_file }}" dest: "{{ dest_file }}" ...执行结果: 在 Ansible 项目中通过 host_vars/HOSTNAME 文件定义主机变量,可以实现为不同主机定义不同的变量,或为不同主机的同一变量传递不同的变量值。 创建一个简单的 Ansible 项目,分别为一台Ubuntu主机安装apahce2,为一台CentOS主机安装httpd,通过为不同主机的pkg_name变量传递不同值来实现。 到Ansible项目目录中执行Playbook: [root@ansible ~]# cd ansible [root@ansible ansible]# ansible-playbook install_web.yml执行结果: 验证: root@node111:~# dpkg-query -l apache2可以在主机清单文件的主机后面为单个主机定义变量: [GROUP_NAME] HOST1 VARIABLE1=VALUE1 VARIABLE2=VALUE2 HOST2 VARIABLE1=VALUE1 VARIABLE2=VALUE2 2.4.2.5.1:主机清单示例 [root@ansible ~]# vim ansible/hosts [websrvs] 192.168.1.111 pkg_name=apache2 192.168.1.203 pkg_name=httpd 2.4.2.5.2:Playbook 示例Playbook和上一个示例相同: [root@ansible ~]# vim ansible/install_web.yml --- - hosts: 192.168.1.111 tasks: - name: "Ubuntu 安装 {{ pkg_name }}" apt: name: "{{ pkg_name }}" state: present when: ansible_os_family == "Debian" - hosts: 192.168.1.203 tasks: - name: "CentOS 安装 {{ pkg_name }}" yum: name: "{{ pkg_name }}" state: present when: ansible_os_family == "RedHat" ... 2.4.2.5.3:执行 Playbook执行Playbook前,先进行一些恢复操作。 卸载两台目标主机上的apache2和httpd: root@node111:~# apt remove apache2 [root@node203 ~]# yum remove httpd 删除host_vars主机变量目录(因为host_vars中定义的主机变量比主机清单中定义的主机变量优先级高,会优先调用): [root@ansible ~]# rm -rf ansible/host_vars/执行Playbook: [root@ansible ~]# cd ansible [root@ansible ansible]# ansible-playbook install_web.yml执行结果: 在 Ansible 项目中通过 group_vars/GROUPNAME 文件定义主机组变量,可以实现为不同主机组定义不同的变量,或为不同主机组的同一变量传递不同的变量值。 同样创建一个简单的 Ansible 项目,分别为ubuntu主机组安装apahce2,为centos主机组主机安装httpd,通过为不同主机组的pkg_name变量传递不同的变量值来实现。 执行前先卸载两个主机上之前安装了的apace2和httpd: root@node111:~# apt remove apache2 -y [root@node203 ~]# yum remove httpd -y到Ansible项目目录中执行Playbook: [root@ansible ~]# cd ansible [root@ansible ansible]# ansible-playbook install_web.yml执行结果: 验证: root@node111:~# dpkg-query -l apache2在一个Ansible项目中,还可以在group_vars/all文件中为主机清单的所有主机定义公共变量,改文件中的变量对整个主机清单生效。 在上述Ansible项目中再编写一个Playbook,用于删除各主机上的apache2或httpd(使用公共变量pkg_state,为所有主机传递absent变量值)。 执行结果: 验证: root@node111:~# dpkg-query -l apache2 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |