博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ansible之十一:变量详解
阅读量:6093 次
发布时间:2019-06-20

本文共 4983 字,大约阅读时间需要 16 分钟。

一、在Inventory中定义变量

详见《Ansible2:主机清单》

二、在Playbook中定义变量

1、通过vars关键字定义:

vars: 

  http_port: 80

  server_name: localhost

  cert_file: /etc/nginx/ssl/nginx.crt

  key_file: /etc/nginx/ssh/nginx.key

  conf_file: /etc/nginx/conf/default.conf


2、通过vars_files关键字引入变量文件:

- hosts: all

  remote_user: root

  vars:

    favcolor: blue

  vars_files:

    - /vars/external_vars.yml

    - /vars/nginx_vars.yml


/vars/nginx_vars.yml示例:

http_port: 80

server_name: localhost

cert_file: /etc/nginx/ssl/nginx.crt

key_file: /etc/nginx/ssh/nginx.key

conf_file: /etc/nginx/conf/default.conf


3、通过vars_prompt来实现人机交互:

hosts: all

remote_user: root

vars_prompt:

  - name: 'https_passphrase'          #存储数据的变量名

    prompt: 'Key Passphrase'          #手工输入数据

    private: yes                      #当该值为yes,则用户的输入不会被打印


4、通过playbook的roles定义变量

详见《ansible10:Playbook的角色与包含》

三、注册变量

在有些时候,我们希望把某一条任务执行的结果保存下来,可以在接下的任务中调用或者做些判断,可以通过register关键字来实现:下面是个简单的例子,如果/etc/motd文件中包含有'hi'字符串时,则输出"mothd contains ther word hi":- name: test play   hosts: all   tasks:       - shell: cat /etc/motd         register: motd_contents       - shell: echo "motd contains the word hi"         when: motd_contents.stdout.find('hi') != -1下面是一个register的变量在循环中使用的例子:- name: registered variable usage as a with_items list   hosts: all   tasks:       - name: retrieve the list of home directories         command: ls /home         register: home_dirs       - name: add home dirs to the backup spooler         file: path=/mnt/bkspool/{
{ item }} src=/home/{
{ item }} state=link         with_items: home_dirs.stdout_lines         # same as with_items: home_dirs.stdout.split()

四、通过fact获取远程主机变量

    我们在之前讲ad-hoc常用模块的时候提到setup模块,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用。而 setup模块获取这些信息的方法就是依赖于fact。在这里,我们不再详细说明获取到的默认fact的内容。ansible除了能获取到预定义的 fact的内容,还支持手动为某个主机定制fact。称之为本地fact。本地fact默认存放于目标主机的/etc/ansible/facts.d目 录下,如果文件为.ini格式或者json格式,ansible会自动识别。以这种形式加载的fact是key为ansible_local的特殊变量。

下面是一个简单的示例,一个.ini格式的example.fact文件内容如下:

[book]

title=Ansible Book

author=Breeze Yan

将其复制到目标主机的/etc/ansible/facts.d/目录,通过debug模块打印输出:

- name: print ansible_local

  debug: var=ansibl_local

会打印出如下内容:

ok: [localhost] => {

    "var": {

        "ansible_local": {

            "example": {

                "book": {

                    "author": "Breeze Yan", 

                    "title": "Ansible Book"

                }

            }

        }

    }

}

如果不想从fact中获取变量,可以通过如下方法关闭fact:

- hosts: whatever

  gather_facts: no

五、使用set_fact模块定义新的变量

在《ansible7:Playbook常用模块》中有对set_fact模块用法的详细说明

六、内置变量

1、hostvars

    获取某台指定的主机的相关变量。如果有一台web服务器的配置文件中需要指定db服务器的ip地址,我们假定这台db服务器的hostname为 db.exmaple.com,ip地址绑定在eth0网卡上,我们可以通过如下方法在web服务器上调用db服务器的ip地址:

{

{ hostvars['db.example.com'].ansible_eth0.ipv4.address }}

需要注意的是db.example.com不能使用ip地址来取代,只能使用主机名或别名。

2、inventory_hostname与inventory_hostname_short

    inventory_hostname是Ansible所识别的当前正在运行task的主机的主机名。如果在inventory里定义过别名,那么这里就是那个别名,如果inentory包含如下一行:

server1 ansible_ssh_host=192.168.1.1

则inventory_hostname即为server1

利用hostvars和inventory_hostname变量,可以输出与当前主机相关联的所有变量:

- debug: var=hostvars[inventory_hostname]

    与inventory_hostname相近的还有一个inventory_hostname_short,如果一台主机的 inventory_hostname为server1.exmaple.com,则inventory_hostname_short的值为 server1


3、group_names

用于标识当前正在执行task的目标主机位于的主机组。假如我们有三台主机,用来配置成一主二从的mysql服务器。inventory配置如下:

[mdb]

db1

[sdb]

db2

db3

mysql配置文件my.conf.j2示例如下:

{% if 'db1' in group_names %}

[mysqld]

server-id=1

log-bin=mysql-bin

log-bin-index=mysql-bin.index

sync-binlog=1

innodb_flush_log_at_trx_commit=1    #我们知道db1在mdb组,当db1与当前执行c一组时,我们认为当前主机即在mdb组,所以对当前主机应用mysql master的配置

{% else %}

[mysqld]

server-id=2

relay-log=relay-log

relay-log-index=relay-log.index

read-only = yes

sync_master_info = 1

sync_relay_log = 1

sync_relay_log_info = 1

relay_log_recovery = 1

skip_slave_start    #当db1与当前主机不在同一组时,则认为当前主机不在mdb组,即应用my slave的配置

{% endif %}

我们执行如下task:

- name: copy config file to mysql master

  template: src=my.conf.j2 dest=/etc/my.cnf

4、groups

当你想要访问一组主机的变量时,groups变量会很有用。假如我们有一个inventory文件定义如下:

[web]

server1

server2

在配置一台HAproxy的负载均衡器时,我们的配置文件肯定需要web群组的所有服务器的IP,配置文件包含如下片段:

backend web-backend

{% for host in groups.web%}

    server `host`.`inventory_hostname` ` host`.`ansible_default_ipv4`.`address `:80

{% endfor %}

最终生成的文件如下:

backend web-backend

    server server1 192.168.1.1

    server server2 192.168.1.2


再给一个例子,在所有的dbservers组的服务器上创建一个数据库用户kate:

- name: Create a user for all db servers

  mysql_user: name=kate password=test host={

{ hostvars.[item].ansible_eth0.ipv4.address }} state=present

  with_items: groups['dbservers'] 


5、play_hosts    #当前playbook会在哪些hosts上运行

6、ansible_version    #当前ansible的版本

7、inventory_dir    #主机清单所在目录

8、inventory_file    #主机清单文件

七、通过命令行设置变量

示例如下:

---

- hosts: '` hosts `'

  remote_user: '` user `'

  tasks:

     - ...

ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"

也可以写成类似如下方式:

--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'

为了方便调试,ansible提供了debug模块来很方便的查看模块。用法可以参考通过fact获取主机变量中的打印本地fact的示例九、变量优先级
1、extra vars(命令中-e)最优先 2、inventory 主机清单中连接变量(ansible_ssh_user 等) 3、play 中 vars、vars_files 等 4、剩余的在 inventory 中定义的变量 5、系统的 facts 变量 6、角色定义的默认变量(roles/rolesname/defaults/main.yml) 注:子组会覆盖父组,主机总是覆盖组定义的变量
本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/1852382,如需转载请自行联系原作者
你可能感兴趣的文章
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>
Linux下基本栈溢出攻击【转】
查看>>
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>
使用ansible工具部署ceph
查看>>
linux系列博文---->深入理解linux启动运行原理(一)
查看>>
Android反编译(一) 之反编译JAVA源码
查看>>