playbook特殊用法与变量的使用

playbook特殊用法与变量的使用

playbook的特殊用法

语法作用
YAML注释用于提高可读性,在YAML中,编号或井号字符(#)右侧的所有内容都是注释;如果注释的左侧有内容,请在该编号符号的前面加一个空格
YAML字符串YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起;
编写多行字符串有两种方式。
使用管道符表示要保留字符串中的换行字符;要编写多行字符串,
使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性
YAML字典字典也可以使用以大括号括起的内联块格式编写;大多数情况下应避免内联块格式,因为其可读性较低。不过,至少有一种情形中会较常使用它。当playbook中包含角色列表时,较常使用这种语法,从而更加容易区分play中包含的角色和传递给角色的变量
YAML列表列表也有以中括号括起的内联格式;我们应该避免使用此语法,因为它通常更难阅读
YAML注释
#inventory      = /etc/ansible/hosts
inventory      = /etc/ansible/inventory
[This is a demonstration] #library        = /usr/share/my_modules/
YAML字符串
---
# YAML 中的字符串可以不使用引号,即使里面存在空格的时候,当然了使用单引号和双引号也没有错。
this is a demonstration
'this is a demonstration'
"this is a demonstration"
# YAML 中若一行写不下你要表述的内容,可以进行折行。写法如下:
long_line: | 
		web 1
		web 2
		web 3
# 或者
long_line: >
		web 1
		web 2
		web 3	
···
YAML字典
  • 定义: key + 冒号(: ) + 空格 + 值(value), 即 key: value
name: Useing
code: redhat

字典另一种形式:

{name:useing,code:redhat}
注意:第二种(内联块格式)一般不进行使用,当playbook中包含角色列表时才进行使用,因为容易区分play中包含的角色和传递给角色的变量。
YAML列表
  • 定义: 以短横线开头 + 空格 + 具体的值
 - red
 - green
 - blue
YMAL中字符串、列表、字典混合结构
---
class:
 - name: web1
    num: 01
 - name: web2
    num: 02
 - name: web3
    num: 03
# {'class': [{'name': 'web1', 'num': 1},{'name': 'web2', 'num': 2},{'name':'web3'}]}
...

变量的使用

variables(变量)

Ansible支持利用变量来存储值,并在Ansible项目的所有文件中引用这些值。这可以简化项目的创建和维护,并减少错误的数量。在Ansible项目中管理给定环境的动态值。

  • 变量的作用:

     存储数据
     引用数据
    
  • 变量可能包含以下值:

     要创建的用户
     要安装的软件包
     要重新启动的服务
     要删除的文件
     要从互联网检索的存档
    
  • 命名变量

     	变量的名称必须以字母开头,并且只能包含字母、数字和下划线。变量的定义通常是YAML形式,在inventory host文件中也可以使用INI形式
    

无效和有效的Ansible变量名称示例

无效的变量名称有效的变量名称
web serverweb_server
remote.fileremote_file
1st filefile_1file1
remoteserver$1remote_server_1 或 remote_server1
  • 定义变量

变量在Ansible Playbook中发挥着重要作用,因为它们可以简化playbook中变量数据的管理

变量的作用域可以分为四种:

作用于全局的变量
作用于play的变量
作用于task的变量
作用于host的变量
Playbook中定义变量

编写playbook时,可以定义自己的变量,然后在任务中调用这些值

#变量放在开头vars中
- host: all
  vars:
    user: zhuzhu
    home: /home/zhuzhu
#不使用playbook中的vars块,可以改为使用vars_files指令,后面加上外部变
量文件名称列表
- host: all
  vars_files:
    - vars/users.yml
使用变量(演示其中一种方式)
[root@ansible playbook]# vim web.yml
[root@ansible playbook]# cat web.yml 
---
#变量放在开头vars中
- hosts: apache
  vars:
    user: ll
    uid: 1001
    tasks: 
    - name: create user
      user: 
        name: "{{ name }}"
        uid: "{{ uid }}"
        state: present
[root@ansible playbook]# ansible-playbook web.yml 
[WARNING]: Found variable using reserved name: tasks

PLAY [apache] ******************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.230.98]

PLAY RECAP *********************************************************************
192.168.230.98             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
[root@apache ~]# id ll
uid=1001(ll) gid=1002(ll)=1002(ll)

主机变量和组变量

直接应用于主机的清单变量分为两类:

  • 主机变量,应用于特定主机
  • 组管理,应用于一个主机组或一组主机组中的所有主机

定义变量高于主机变量与组变量,而主机变量优先于组变量

注意:若要定义主机变量和组变量,一种方法是直接在清单文件中定义。这是较旧的做法,不建议采用,但你可能会在未来的工作当中遇到。
定义servers组的user组变量(该组由两个主机组成,每个主机组有两个服务器)
例:

	[servers1]				#主机组
node1.example.com			#主机组用户
node2.example.com

	[servers2]				#主机组
node3.example.com			#主机组用户
node4.example.com

	[servers:children]		#管理主机组
servers1
servers2

	[servers:vars]			#组
user=joe
命令行覆盖变量

清单变量可被playbook中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到ansible或ansible-playbook命令来覆盖。在命令行上设置的变量称为额外变量。

当需要覆盖一次性运行的playbook的变量的已定义值时,额外变量非常有用,如果组变量和主机变量都对同一个主机定义了相同的变量,那么ansible最终会采用主机变量而放弃组变量

ansible-playbook web.yml -e "package=apache2"
使用数组作为变量
  • 例:

     user1_first_name: Bob
     user1_last_name: Jones
     user1_home_dir: /users/bjones
     user2_first_name: Anne
     user2_last_name: Cook
     user2_home_dir: /users/acook
    

可以改写成名为users的数组:

users:
  bjones:
    first_name: Bob
    last_name: jones
    home_dir: /users/bjones
  acook:
    first_name: Anne
    last_name: Cook
    home_dir: /users/acook

可以使用以下变量来访问用户数据:

# Returns 'Bob'
users.bjones.first_name

# Returns '/users/acook'
users.acook.home_dir

由于变量被定义为Python字典,因此可以使用替代语法:

# Returns 'Bob'
users['bjones']['first-name']

# Returns '/users/acook'
users['acook']['home_dir']

注意:上面介绍的两种语法都有效,但为了方便故障排除,建议在任何给定Ansible项目的所有文件中一致地采用一种语法,不要混用。

使用已注册变量捕获命令输出

使用register语句捕获命令输出。输出保存在一个临时变量中,然后在playbook中可用于调试用途或者达成其他目的。

[root@ansible playbook]# cat web.yml 
---
- name: Installs a package and prints the result
  hosts: apache
  tasks:
    - name: Install the package
      yum:
        name: httpd
        state: installed
      register: install_result
                                                        
    - debug: var=install_result
[root@localhost ~]# ansible-playbook web.yml 
PLAY [Installs a package and prints the result] *************************************

TASK [Gathering Facts] **************************************************************
ok: [172.168.230.98]

TASK [Install the package] **********************************************************
ok: [172.168.230.98]

TASK [debug] ************************************************************************
ok: [172.168.230.98] => {
    "install_result": {
        "changed": false,
        "failed": false,
        "msg": "",
        "rc": 0,
        "results": [
            "httpd-2.4.6-93.el7.centos.x86_64 providing httpd is already installed"
        ]
    }
}

PLAY RECAP **************************************************************************
t129                       : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值