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 server | web_server |
remote.file | remote_file |
1st file | file_1file1 |
remoteserver$1 | remote_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