Ansible变量

Ansible变量

变量命名规则

变量的名字由字母、下划线和数字组成,必须以字母开头如:

good_a

ok_b

传递一个YAML/JSON的形式(注意不管是YAML还是JSON,它们的最终格式一定要是字典)

# cat a.json

{"name":"gyq","type":"student"}

ansible all -i localhost, -m debug -a "msg='name is {{ name }} type is {{type}}'" -e @a.json

# cat a.yaml

---

name: gyq

type: student

...

剧本变量

通过PLAY属性vars定义

Ansible变量_第1张图片

通过PLAY属性vars_files定义

Ansible变量_第2张图片

如何在PlayBook中使用这些变量

使用{{} 变量名 }

---

- name: test play vars

  hosts: all

  vars:

    user: lilei

    home: /home/lilei

  tasks:

    - name: create the user {{ user }}

      user:

        name: "{{ user }}"

        home: "{{ home }}"

...

在PLayBook中使用变量的注意点,为{}加上双引号避免Ansible把它当字典

Ansible变量_第3张图片

资产变量

资产变量分为主机变量和主机组变量,分别针对资产中的单个主机和主机组

主机变量

以下资产中,定义了一个主机变量lilei,此变量只针对192.168.40.137这台服务器有效。

# cat hostsandhostvars

[webservers]

192.168.40.137 user=lilei port=3309

192.168.40.138

验证

//获取定义的变量值

[root@GYQ-master ~]# ansible 192.168.40.137 -i hostsandhostvars -m debug -a "msg='{{user}} {{port}}'"

192.168.40.137 | SUCCESS => {

    "msg": "lilei 3309"

}

//未获取到定义的变量值,因为lilei这个变量针对192.168.40.138主机无效

ansible 192.168.40.138 -i hostsandhostvars -m debug -a "var=user"

192.168.40.138 | SUCCESS => {

    "user": "VARIABLE IS NOT DEFINED!"

}

主机组变量

以下资产中,定义了一个组变量home,此变量将针对webservers这个主机组的所有服务器有效

# cat hostsandhostvars 

[webservers]

192.168.40.137 user=lilei port=3309

192.168.40.138

[webservers:vars]

home="/home/lilei"

验证

ansible webservers -i hostsandhostvars -m debug -a "var=home"

Ansible变量_第4张图片

主机变量VS主机组变量

当主机变量和组变量在同一个资产中发生重名的情况,会有什么效果?

# cat hosts_v2

[webservers]

192.168.40.137 user=lilei

192.168.40.138

[webservers:vars]

user=tom

验证

//在资产中定义了主机变量和组变量user,此时发现192.168.40.137这台机器的主机变量user的优先级更高

//优于组变量user使用。

ansible webservers -i hosts_v2 -m debug -a "var=user"

Ansible变量_第5张图片

变量的继承

# cat hosts_v3

[webservers]

192.168.40.137

[dbservers]

192.168.40.138

[allservers]

[allservers:children]

dbservers

webservers

[allservers:vars]

user=lilei

验证

//在资产继承的同时,对应的变量也发生了继承

ansible allservers -i hosts_v3 -m debug -a "var=user"

Ansible变量_第6张图片

Inventory内置变量的说明

内置变量几乎都是以ansible_为前缀。

ansible_ssh_host

    将要连接的远程主机名与你想要设定的主机的别名不同的话,可通过此变量设置。

ansible_ssh_port

    ssh端口号.如果不是默认的端口号,通过此变量设置

ansible_ss_user

    默认的 ssh 用户名

ansible ssh pass

    ssh 密码(这种方式并不安全,官方强烈建议使用 --ask-pass ssh SSH密钥)

ansible sudo pass

    sudo 密码(这种方式并不安全,官方强烈建议使用 --ask-sudo-pass

ansible_sudo_exe (new in version 1.8)

    sudo 命令路径(适用于1.8及以上版本)

ansible_ssh_private_key_file

    ssh 使用的私钥文件适用于有多个密钥,而你不想使用SS代理的情况

ansible_python_interpreter

    目标主机的 python 路径适用于的情况:系统中有多个 Python或者命令路径不是"/usr/bin/python",比如/usr/local/bin/python3

Facts变量

不需要人为去声明及赋值,完全由setup模块帮我们完成。

它收集了有关被管理服务器的操作系统版本、服务器IP地址、主机名,,磁盘的使用情况、CPU个数、内存大小等等有关被管理服务器的私有信息。

在每次PlayBook运行的时候都会发现在PlayBook执行前都会有一个GatheringFacts的过程。这个过程就是收集被管理服务器的Facts信息过程。

手动手机Facts变量

ansible all -i localhost, -c local -m setup

Ansible变量_第7张图片

过滤Facts

通过使用Facts模块中的filter参数去过滤我们想要的信息。

ansible all -i localhost, -m setup -a "filter=*memory*" -c local

Ansible变量_第8张图片

在PlayBook中使用Facts变量

默认情况下,在执行PlayBook的时候,它会去自动的获取每台被管理服务器的facts信息。

[root@GYQ-master ~]# cat facts.yml

---

- name: print facts variable

  hosts: all

  tasks:

   - name: print facts variable

     debug:

       msg: "The default IPV4 address is {{ ansible_default_ipv4.address }}"

...

Ansible变量_第9张图片

在PlayBook中去关闭Facts变量的获取

若在整个PlayBook的执行过程中,完全未使用过Facts变量,此时我们可以将其关闭,以加快PlayBook的执行速度。

[root@GYQ-master ~]# cat myplaybook.yml

---

- name: mange web servers

  hosts: webservers

  gather_facts: no    #关闭Facts变量

  remote_user: root

  tasks:

    - name: install nginx package

      yum: name=nginx state=present

    - name: copy ngixn.conf to remote server

      copy: src=nginx.conf dest=/etc/nginx/nginx.conf

    - name: start nginx server

      service:

        name: nginx

        enabled: true

        state: started

...

Ansible变量_第10张图片

注册变量

往往用于保存一个task任务的执行结果,以便于debug时使用。

或者将此次task任务的结果作为条件,去判断是否去执行其他task任务注册变量在PlayBook中通过register关键字去实现。

[root@GYQ-master ~]# cat myplaybook3.yml

---

- name: install a package and print the result

  hosts: webservers

  remote_user: root

  tasks:

    - name: install nginx package

      yum: name=nginx state=present

      register: install_result

    - name: print result

      debug: var=install_result

#执行

ansible-playbook -i hosts myplaybook3.yml

Ansible变量_第11张图片

变量优先级

环境准备

1、定义一份资产、且定义了资产变量user

# cat user

[dbservers]

192.168.40.137

[webservers]

192.168.40.138

[allservers:children]

dbservers

webservers

[allservers:vars]

user=tomcat

2、编写一份PlayBook、同样定义剧本变量user

# cat user.yml

---

- name: test variable priority

  hosts: all

  remote_user: root

  vars:

    user: mysql

  tasks:

    - name: print the user value

      debug: msg='the user value is {{ user }}'

...

验证测试

同时使用全局变量、剧本变量、资产变量

当变量user同时定义在全局变量、剧本变量及资产变量中时,全局变量的优先级最高。

ansible-playbook -i hosts priority.yml -e "user=www"

Ansible变量_第12张图片

你可能感兴趣的:(ansible)