Ansible Playbook&&变量
  R6ZO6z1TYi7r 2023年11月13日 21 0

Playbook(剧本) 是一系列ansible命令的集合,是使用yaml语言(非标记型语言)进行的编写。playbook 命令会根据代码从上到下的顺序来执行(类似 shell 脚本),相对于 ad-hoc 来说 playbook可以使用变量,循环等等,这样就可以实现复杂的操作。

yaml基础:

数据类型:

纯量:单个变量,不可再分

数组:列表,序列==》表示方式: - vsftpd 使用 - 开头加空格来表示

对象:键值对 == 》表示方式:key:value==》字典


格式如下:

Ansible Playbook&&变量_redhat

<< EOF 
详解
-name: create user == 一个play的名字,为什么要有“-”,是一个一个yml文件中可以有多个play(一个playbook)
由多个play来组成
hosts: node2 ==指定工作的主机
remote_user: alice ==指定工作的用户
gather_facts: false ==事实变量(默认的内置任务,用来收集被控端的信息)
vars:
	mysql_user: lisi ==定义一个变量
tasks: ==表示这个play要执行的任务
	-name: create group ==表示一个任务的名称
  group: ==使用group 这个模块
  	name: mysql_test ==需要操作组的名字
    state: present ==操作:创建
    ...
EOF

ansible-playbook create_user.yml #运行一个playbook

Ansible Playbook&&变量_linux_02

playbook的执行:

1,执行时查看详细信息 ==》ansible-playbook *.yml -v(这里 -v 可以多加几个v来查看更详细的信息)

Ansible Playbook&&变量_ansible_03

2,检查playbook的语法

ansible-playbook --syntax-check create_user.yml #这里没有输出代表语法没有问题

Ansible Playbook&&变量_redhat_04

3,测试playbook的运行

ansible-playbook -C manage_apache.yml #-C 为测试运行,并不会真的发生改变

Ansible Playbook&&变量_变量名_05

4,handlers 

#handlers是一个特殊的任务列表,只有当handlers监控(通过notify来进行的监听)的任务发生改变的时候(状态为 changed)才会去执行对应的 handler 的任务。

Ansible Playbook&&变量_变量名_06

Ansible Playbook&&变量_变量名_07

playbook的技巧

(1)在playbook中任务是从上往下来执行的,在这个过程中如果中间某个人任务失败,则整个剧本都不会执行成功。

命令执行模块出错:

Ansible Playbook&&变量_redhat_08

#这里使用了逻辑或 || /bin/true 来实现当前面命令执行为非0结果时,依然可以往后执行,防止整个剧本卡在某一处(在所有的linux中 /bin/true 的返回值永远是0

普通模块出错:

#这里可以通过ignore_errors: yes 来忽略模块错误,继续往下执行

Ansible Playbook&&变量_linux_09

Ansible Playbook&&变量_linux_10

Ansible的变量

ansible变量的定义==》用于存储在项目中重复使用到的一些值

#注:变量由字符,下划线,数字组成,并且变量名必须是用字母来做开头,ansible的内置关键字不同作为变量的名称(防止冲突)

ansible变量的调试:


ansible 可以通过 debug模块参数来进行调试:

常用模块参数:msg==》打印字符串的内容  var==》输出变量的值

注==>msg与var不同共用,只能选一个 

msg示例(注:通过msg引用变量的格式为 msg: "{{ 变量名 }}"):

Ansible Playbook&&变量_linux_11

var示例(注:通过var调用的变量直接接变量名即可)

Ansible Playbook&&变量_linux_12

ansible定义变量的方式:

第一种:在主机清单(inventory)中定义变量

内置变量(主要用于链接):

ansible_host ==》指定被管理的主机IP

ansible_user ==》指定ssh链接时的用户名

ansible_port ==》指定ssh链接时的端口

ansible_ssh_pass ==》 指定ssh链接时的密码

ansible_ssh_private_key_file ==》 指定链接秘钥

ansible_connection ==》 ssh链接类型:local,ssh,paramiko 默认是ssh

ansible_ssh_executable ==》 ssh指令不在默认路径中,可以使用该变量来定义路径

Ansible Playbook&&变量_linux_13

用户变量

主机定义变量== 变量名=值

主机组定义变量== [主机组:vars]

Ansible Playbook&&变量_ansible_14

第二种:通过vars关键字定义变量(用于playbook中)

#需注意在playbook中变量需要使用:来进行分隔

Ansible Playbook&&变量_ansible_15

#也可引入文件中的变量(引入的外部文件必须为yml或者是json格式),需注意引入文件时使用的是 vars_files 

变量文件:

Ansible Playbook&&变量_redhat_16

playbook:

Ansible Playbook&&变量_linux_17

运行结果:

Ansible Playbook&&变量_ansible_18

第三种:通过host_vars和group_vars目录定义变量

#在固定目录中通过不同主机名写不同文件的变量,注意定义时同时存在主机文件的变量和主机组的变量,主机的优先级更高

Ansible Playbook&&变量_预定义变量_19

Ansible Playbook&&变量_linux_20

第四种:注册变量

#注册变量就是某一条任务执行的结果所保存下来的值,方便在接下来的任务中去调用或者用作判断。可以通过register关键字来实现将某一任务结果保存为一个变量。

Ansible Playbook&&变量_redhat_21

Ansible Playbook&&变量_redhat_22

<< EOF
changed:true ==> 表示是否对对方主机造成了影响
cmd:ls /opt ==> 其中cmd是shell模块独有的,一般只有命令的执行模块才会有这个参数
delta:** ==> 任务花费的时间
end:** ==> 任务结束的时间
failed:false ==> 任务是否失败
rc:0 ==> 任务的返回值是多少
start:** ==> 命令开始的时间
stderr: ** ==> 命令的错误输出
stderr_lines:[] ==> 命令错误输出的行
stdout:** ==> 所有的输出
stdout_lines:** ==> 所有输出的行
EOF

第五种:在命令行设置变量

#可在命令行后面跟上 -e 或者 --extra-vars

Ansible Playbook&&变量_变量名_23

Ansible 的事实变量

#ansible 的事实变量主要就是为了搜集被控端的信息==》比如被控主机名等等,这些信息会收集到ansible_facts 中,这个就叫做事实变量(事实变量主要是通过一个setup的模块使用facts方法搜集被控端的信息)

1,手动搜集被控端信息

ansible node3 -m setup --tree /tmp/node3.facts #将被控端的信息保存到指定的目录

Ansible Playbook&&变量_ansible_24

2,手动过滤被控端的信息

ansible node3 -m setup -a 'filter=ansible_ens160' #过滤单个网卡的信息

#注:通过 filter过滤的内容只能是ansible_facts的下一个层级,但是过滤不到不代表无法引用

Ansible Playbook&&变量_变量名_25

#facts会自己将数据注册为变量(注意,引用变量时前面不需要接ansible_facts),可通过playbook去直接引用即可

Ansible Playbook&&变量_ansible_26

开启和关闭facts

#这里可直接通过 gather_facts: false 来关闭facts,开启则是默认开启

Ansible Playbook&&变量_linux_27

通过facts生成新的变量

#这里可直接使用set_fact 将收集到的被控端的信息注册收集为一个新的变量

Ansible Playbook&&变量_ansible_28

facts 的预定义变量

#预定义变量就是可以提前在不同的主机上存储不同的facts值并且来进行调用

方式1:

1,需要在被控端创建 /etc/ansible/facts.d 的目录

Ansible Playbook&&变量_ansible_29

2,在facts.d 中编写预定义变量的配置文件,配置文件必须使用ini的格式

#因为是ini的格式,所以最顶层必须要有一个key,并且配置文件必须以fact结尾

Ansible Playbook&&变量_redhat_30

3,调用==》ansible 会将被控端的预定义变量注册为 ansible_local 变量

ansible node3 -m setup -a 'filter=ansible_local'

Ansible Playbook&&变量_预定义变量_31

方式2:通过lookup插件来生成变量

lookup的格式:lookup('方法','内容'),需注意,但凡是lookup的插件,无论是文件,命令还是环境变量它都是在主控端去执行的

#查看lookup的方法:ansible-doc -t lookup -l

示例一:使用文件的内容来作为变量

#这里表示通过lookup获取文件的内容作为变量

Ansible Playbook&&变量_ansible_32

#将命令的执行结果作为变量

Ansible Playbook&&变量_redhat_33

#将主控端的环境变量作为变量

Ansible Playbook&&变量_预定义变量_34

Ansible 的魔法变量

#ansible 的魔法变量也属于内置变量的一种,被叫做魔法变量是因为可以用在主机上面很轻易的实现复杂的功能

一、hostvars ==》获取某一台主机的指定的变量

#这里需注意,如果想在被控端调用主控端的变量,首先得获取到该变量才能调用

Ansible Playbook&&变量_变量名_35

二、inventory_hostname ==》可以将所有的主机都变成自己的主机,例如在那一台被控上执行,那么inventory_hostname 就是那一台主机的名字

Ansible Playbook&&变量_变量名_36

三、groups ==》获取清单中的主机组

Ansible Playbook&&变量_linux_37

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  6YY0QMPUXEwu   2023年12月10日   29   0   0 linux网卡
  Ex81gqy3LOX7   2023年12月07日   19   0   0 linux
  nIt0XG0acU8j   2023年12月11日   29   0   0 linuxhtop
  nIt0XG0acU8j   2023年12月09日   33   0   0 linuxsort
R6ZO6z1TYi7r