安装配置ansible
yum install -y ansible(下载ansible需要epel源)
生成密钥:ssh-keygen -t rsa
将本地公钥传输到被管理节点:ssh-copy-id root@ip
ping下所管理的主机:ansible all -i 192.168.130,192.168.131 -m ping (all:代表所有主机;-i:代表列表list;-m:模块;只有一个节点后面要更逗号ansible all -i 192.168.130, -m ping)
拷贝文件到所有被管理的主机
ansible all -i 192.168.130,192.168.131 -m copy -a "src=/root/tmp/a.conf dest=/tmp/a.conf"(-m copy:copy模块;src:管理主机目录;dest:被管理主机目录)
选项参数解释
all在ansible 中,将其叫做pattern,即匹配。我通常称它为资产选择器。就是匹配资产(-i参数指定)中的一部分。这里的all是匹配所有指定的所有资产。将在下面资产部分详细阐述。
-i指定Ansible的资产,也就是被管理服务器。
-m指定要运行的模块,比如这里的ping模块和copy模块
-a指定模块的参数,这里模块ping没有指定参数。模块copy指定了src 和dest参数
资产管理
在/etc/ansible目录下创建hosts文件(没有的情况下创建)
192.168.137.[130:131](192.168.137.130~192.168.137.131)
[web_servers]
192.168.1.2
192.168.1.3
192.168.1.5
[db_servers]
192.168.2.2
192.168.2.3
192.168.1.5
[all_servers]
[all_servers:childern]
db_servers
web_servers
ansible all -i hosts --list-hosts //列出所有资产信息
列举出选定资产
比如这里列举出web_servers
# ansible web_servers -i /etc/ansible/hosts --list-hosts
hosts (3):
192.168.1.2
192.168.1.3
192.168.1.5
web_servers和db_servers的并集
两个组的所有主机
# ansible 'web_servers:db_servers' -i /etc/ansible/hosts --list-hosts
hosts (5):
192.168.1.2
192.168.1.3
192.168.1.5
192.168.2.2
192.168.2.3
排除
在web_servers中,但是不在db_servers中
# ansible 'web_servers:!db_servers' -i /etc/ansible/hosts --list-hosts
hosts (2):
192.168.1.2
192.168.1.3
ansible模块
列举出所有的核心模块和附加模块
# ansible-doc -l
查询某个模块的使用方法
# ansible-doc moudlename
查询某个模块的使用方法,比较简洁的信息
ansible-doc -s moudlename
# ansible all -i /etc/ansible/hosts -a "echo 'hello'" (-a默认command模块)
# ansible all -i /etc/ansible/hosts -m shell -a "echo 'hello' | grep 'e'" (shell模块)
script模块
将管理节点上的脚本传递到被管理节点(远程服务器)上进行执行,理论上此模块的执行完全不需要被管理服务器上有Python。
Example
管理节点上的一个脚本
touch /tmp/testfile
执行
[root@one ~]# ansible webservers -i hosts -m script -a " /root/ a.sh" (将在被管理主机执行这个脚本)
copy模块
copy模块的主要用于管理节点和被管理节点之间的文件拷贝。
经常使用到的参数如下:
src指定拷贝文件的源地址
dest指定拷贝文件的目标地址
backup拷贝文件前,若原始文件发生变化,则对目标文件进行备份
owner 指定新拷贝文件的所有者
group指定新拷贝文件的所有组
mode指定新拷贝文件的权限
Example
# ansible webservers -i /etc/ansible/hosts -m copy -a "src=/root/test.sh dest=/root/test.sh owner=gao group=gao mode=755"
yum_repository模块
添加YUM仓库常用参数
name仓库名称,就是仓库文件中第一行的中括号中名称,必须的参数。
description仓库描述信息,添加时必须的参数
baseurl yum存储库“repodata”目录所在目录的URL,添加时必须的参数。它也可以是多个URL的列表。
file仓库文件保存到被管理节点本地的文件名,不包含.rep。默认是name 的值。
state preset确认添加仓库文件, absent确认删除仓库文件。
gpgcheck是否检查GPG yes|no,没有默认值,使用/etc/yum.conf中的配置。
Example
[root@one ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel baseurl= ' https ://download.fedoraproject.org/pub/epel/$releasever/$basearch/ ' description= 'EPEL YUM repo ' "
yum模块
等同于Linux上的YUM命令,对远程服务器上RPM包进行管理。
常用参数:
name要安装的软件包名,多个软件包以逗号()隔开
state对当前指定的软件安装、移除操作(present installed latestabsent removed)
支持的参数
- present确认已经安装,但不升级
- installed确认已经安装
- latest确保安装,且升级为最新
- absent和removed确认已移除
Example
安装一个软件包
# ansible webservers -i hosts -m yum -a "name=nginx state=present "
# ansible webservers -i hosts -m yum -a "name=nginx state=latest"
# ansible webservers -i hosts -m yum -a "name=nginx state=installed"
移除一个软件包
# ansible all -i hosts -m yum -a "name=nginx state=absent"
# ansible all -i hosts -m yum -a "name=nginx state=removed"
安装一个软件包组
# ansible all -i hosts -m yum -a "name= '@Developmenttools ' state=present"
systemd模块
Centos6之前的版本使用service模块。请使用ansible-doc service命令自行查看帮助信息。管理远程节点上的systemd 服务,就是由systemd 所管理的服务。
常用参数
daemon_reload重新载入systemd,扫描新的或有变动的单元
enabled是否开机自启动yes|no
name必选项,服务名称,比如 httpd vsftpd
state对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
Example
重新加载systemd
# ansible webservers -i hosts -m systemd -a "daemon_reload=yes "
启动Nginx服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=started"
关闭NGINX服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=stopped "
重启Nginx服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=restarted"
重新加载 Nginx服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=reloaded"
将Nginx服务设置开机自启动
# ansible webservers -i hosts -m systemd -a "name=nginx enabled=yes"
group模块
在被管理节点上,对组进行管理
常用参数:
name 组名称,必须的
system 是否为系统组,yes/no (默认是no)
state 删除或者创建,present/absent,默认是present(创建)
Example
创建普通组 db_admin
# ansible dbserver -i host -m group -a "name=db_admin"
# cat /etc/group (被管理节点查看)
user模块
用于对被管理节点的用户进行管理
常用参数:
name 必须参数,指定用户名
password 设置用户密码,这里接受的是一个加密得到值,因为会直接存到shadow
update_password 假如设置的密码不同于原密码,则会更新密码.在1.3中被加入
home指定用户的家目录
shell设置用户的shell
comment用户的描述信息
create_home在创建用户时,是否创建其家目录。默认创建,假如不创建,设置为no。2.5版本之前使用createhome
group设置用户的主组
groups 将用户组加入到多个其他组中,多个用逗号隔开
append yes|no 和groups配合使用,yes 时,不会把用户从其他已经加入的组中删除。
system设置为yes时,将会创建一个系统账号
expires设置用户的过期时间,值为时间戳,会转为为天数后,放在shadow的最后第8个字段里
generate_ssh_key设置为yes 将会为用户生成密钥,这不会覆盖原来的密钥
ssh_key_type指定用户的密钥类型,默认rsa,具体的类型取决于被管理节点
state删除或添加用户,present为添加,absent为删除;默认值present
remove当与state=absent 一起使用,删除一个用户及关联的目录,比如家目录,邮箱目录。可选的值为: yes/no
Example
创建用户并设置密码
先生成加密密码
pass=$(echo "1234" | openssl passwd -1 -stdin) (这里是数字一)
执行ansible命令创建用户foo并设置密码
ansible all -i hosts -m user -a "name=foo password=${pass}"
创建用户mumu,并为其创建密钥对,并且密钥对类型为:ecdsa
# ansible all -i hosts -m user -a "name=mumu generate_ssh_key=yes ssh_key_type=ecdsa"
创建用tom,并且设置其有效期到2020年4月15日,加入到组db_admin中,不改变用户原有加入的组
# ansible dbservers -i /etc/ansible/hosts -m user -a "name=tom expires=$(date +%s -d 20200415) gorups=db_admin append=yes"
file模块
file 模块主要用于原创主机上的文件操作
常用参数:
group 定义文件/目录的属组
mode 定义文件/目录的权限
owner 定义文件/目录的属主
path 必选项,定义文件/目录的路径
rescurese 递归的设置文件属性,只对目录有效
src 要被链接(软/硬)的源文件的路径,只对于state=link的情况下有效
dest 被链接到的路径,只应用于state=link的情况
state
directory 如果魔力不存在,创建目录
file 文件不存在,则不会被创建,存在则返回文件的信息,常用于检擦文件是否存在
link 创建软连接
hard 创建硬链接
touch 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent 删除目录、文件或者取消链接文件
Example
创建一个文件
# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"
//改变文件所有者及权限
# ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
//创建一个软连接
# ansible all -i hosts -m file -a "src=/ tmp/foo.conf dest= /tmp/link.conf state=link "
//创建一个目录
# ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"
//取消一个连接
# ansible all -i hosts -m file -a "path=/tmp/link.conf state=absent"
//删除—个文件
ansible all -i /etc/ansible/hosts -m file -a "path=/tmp/foo.conf state=absent"
cron模块
管理远程节点的CRON服务。等同于Linux中的计划任务
注意:使用Ansible创建的计划任务不能使用本地crontab -e编辑,否则Ansible无法再次操作
常用参数:
name指定一个kron job的名字。一定要指定,便于日之后删除。
minute指定分钟,可以设置成(O-59,*,*/2等)格式。默认是*,也就是每分钟。
hour指定小时,可以设置成(O-23,*,*/2等)格式。默认是*,也就是每小时。
day指定天,可以设置成(1-31,*,*/2等)格式。默认是*,也就是每天。
month指定月份,可以设置成(1-12,*,*/2等)格式。默认是*,也就是每周。
weekday 指定星期,可以设置成(O-6 for Sunday-Saturday,*等)格式。默认是*,也就是每星期。
job指定要执行的内容,通常可以写个脚本,或者一段内容。
state指定这个job的状态,可以是新增(present)或者是删除(absent)。默认为新增(present)
Example
//新建一个CRON JOB任务
# ansible all -i /etc/ansible/hosts -m cron -a "name='restart nginx' minute='0' job='systemctl restart nginx'"
//删除一个CRON JOB任务,删除时,一定要正确指定job 的name参数,以免误删
# ansible all -i /etc/ansible/hosts -m cron -a "name='restart nginx' state=absent"
debug模块
debug模块主要用于调试时使用,通常的作用是将一个变量的结果打印出来。
常用参数:
var 直接打印一个指定的变量
msg 打印一段可以格式化的字符串
Example
这里引入了变量,我们只需了解debug模板的使用即可。在学习变量、剧本时,我们会对它有更深刻的理解。
#ansible all -i hosts -m debug -a "var=role" -e "role=web" //-e 传变量
#ansible all -i hosts -m debug -a "msg= 'role is f{role}}'" -e "role=web"
template模块
template模块使用了Jinjia2格式作为文件模版J可以进行文档内变量的替换。|
它的每次使用都会被ansible标记为"changed"状态。文件以.j2结尾。
常用参数:
src指定Ansible 控制端的文件路径
dest指定Ansible被控端的文件路径
owner指定文件的属主
group 指定文件的属组
mode指定文件的权限
backup 创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误地破坏了原始文件,就可以将其恢复原状。yes/no
Example
用法其实和copy模块基本一样, template模块的强大之处就是使用变量替换,就是可以把传递给Ansible 的变量的值替换到模板文件中。
1.建立一个template 文件,名为 hello_world.j2
# cat hello_world.j2
Hello {{var}}!
2.执行命令,并且设置变量var的值为world
# ansible all -i hosts -m template -a "src=hello_world.j2 dest=/tmp/hello_world.world" -e "var=world"
3.在被控主机上验证
# cat /tmp/hello_world.world
Hello world !
lineinfile模块
在被管理节点上,用正则匹配的方式对目标文件的一行内容修改删除等操作。
如果是在一个文件中把所有匹配到的多行都进行统一处理,请参考replace模块。
如果想对一个文件进行一次性添加/更新/删除多行等操作,参考blockinfile模块
常用参数
path 被管理节点的目标文件路径,必须。
state 可选值absent 删除|present替换(默认值)。
regexp 在文件的每一行中查找的正则表达式。对于state=present ,仅找到的最后一行将被替换。
line 要在文件中插入/替换的行。需要state=present。
create 文件不存在时,是否要创建文件并添加内容。yes/no
Example
删除被控节点文件里的某一条内容
ansible all -i /etc/ansible/hosts -mlineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"
替换某一行
ansible all -i /etc/ansible/hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"
Playbook
Ad-Hoc的问题
通过对AD-HOC的学习,我们发现AD-HOC每次只能在被管理节点上执行简单的命令。
而日常工作中,我们往往面临的是一系列的复杂操作,例如我们有可能需要安装软件、更新配置、启动服务等等一系列操作的结合。此时再通过AD-HOC 去完成任务就有些力不从心了。
PlayBook是什么
Playbook也通常被大家翻译成剧本。
可以认为它是Ansible自定义的一门语言(可以将Playbook 比作 Linux中的shell,而Ansible中的Module可以比作为Linux中的各种命令。
通过这样的类比,我们对PlayBook就有了一个更形象的认识了)。
既然Playbook是一门语言,那么它遵循什么样的语法格式?有哪些语言呢性?我们将通过下面的学习逐步了解。
YAML学习
PlayBook遵循YAML的语法格式。
因此在学习PlayBook之前,我们必须要先弄明白YAML相关知识点。
1.YAML特点
YAML文件
以#为注释符
以.yml或者.yaml结尾
以---开始,以...结束,但开始和结束标志都是可选的。
2.基本语法
大小写敏感
使用缩进表示层级关系
缩进时使用Tab键还是使用空格一定要达到统一,一般建议使用空格。
相同层级的元素必须左侧对齐即可
YAML支持的数据结构有三种
字符串
列表
字典
字符串
---
#YAML 中的字符串可以不用使用引号,即使里面存在空格的时候,当然了使用单引号和双引号也没错
this is a string
'this is a string'
"this is a string"
#YAML 中若一行写不下你要表述的内容,可以进行折行。写法如下:
long_line:
Example 1
Example 2
Example 3
#或者
long_line: >
Example 1
Example 2
Example 3
列表
---
#若熟悉Python的话 可以认为他就是python中的List,若属性C语言,可以认为他是C中的数组
#如何定义:以短横线开头+空格+具体值
- red
- green
- blue
#以上的值假如转换成python的List会是这样:
#['red','green','blue']
...
字典
---
#若属性python的话,可以认为他就是python中的Dict
#如何定义:key+冒号(:)+空格+值,即key: value
name: Using Ansible
code: D1234
#转换为python的Dict
#{'name': 'Using Ansible','code': 'D1234'}
...
Playbook的编写
Play的定义
由于Playbook是由一个或者多个Play组成,那么如果我们熟悉Play的写法,就自然掌握了我们这章的PlayBook。
那如何定义一个Play呢
1、每一个Play都是以短横杠开始的
2、每一个Play都是一个YAML字典格式
根据上面两条Play的规则,一个假想的Play应该是如下的样子
---
- key1: value1
key2: value2
key3: value3
...
由于一个Playbook是由一个或者多个Play构成,那么一个含有多个Play的Playbook结构上应该是如下的样子
---
#一个含有3个play的伪Playbook构成
- key1: value1
key2: value2
key3: value3
- key4: value4
key5: value5
key6: value6
- key1: value1
key2: value2
key3: value3
...
Play属性
以上一小节中的Play为基础, Play中的每一个key,比如key1, key2等;这些key在PlayBook中被定义为Play的属性。
这些属性具有特殊的意义,我们不能随便的定义play的属性。
常用属性
name 属性,每个play的名字
hosts 属性,每个play涉及的被管理服务器,同ad hoc中的资产选择器
tasks 属性,每个play中具体要完成的任务,以列表的形式表达
become 属性,如果需要提权,则加上become相关属性
become_user属性,若提权的话,提权到哪个用户上
remote_user属性,指定连接用户。若不指定,则默认使用当前执行ansible Playbook的用户
一个完整的剧本
---
- name: the first play example
hosts: all
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
- name: copy nginx.conf to remote server
copy: src=nginx.conf dest=/etc/nginx/nginx.conf
-name: start nginx server
service:
name: nginx
enabled: true
state: started
tasks属性中任务的多种写法
#以启动nginx服务,并增加开启启动为例
#一行的形式
service: name=nginx enabled=true state=started
#多行的形式
service: name=nginx
enabled=true
state=started
#多行写成字典的形式
service:
name: nginx
enabled: true
state: started
具有多个Play的Playbook
---
- name: manage web serrvices
hosts: web_services
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
- name: copy nginx.conf to remote server
copy: src=nginx.conf dest=/etc/nginx/nginx.conf
- name: start nginx server
service:
name: nginx
enabled: true
state: started
- name manager db servers
hosts: db_servers
tasks:
- name: update database config
copy: src=my.cnf dest=/etc/my.cnf
如何对Playbook进行语法校验
下面校验的方法,只能校验PlayBook是否正确,而不能校验YAML文件是否语法正确。
# ansible-playbook myplaybook.yml --syntax-check
因为PlayBook 属于YAML 格式,我们同样可以使用检查YAML的语法格式的方法进行检查PlayBook的语法正确性。
如何运行PlayBook
# ansible-playbook myplaybook.yml
如何单步跟从调试PlayBook
//执行Task中的任务,需要手动确认是否往下执行
# ansible-playbook myplaybook.yml --step
Ansible变量
命名规则
变量的名字由字母、数字、下划线组成,必须有字母开头。
变量类型
根据变量的作用范围可分为:
全局变量
剧本变量
资产变量
全局变量
全局变量,是我们使用ansible或使用ansible-playbook时,手动通过-e参数传递给Ansible 的变量。
通过ansible 或 ansible-playbook的 help 帮助,可以获取具体格式使用方式:
# ansible -h | grep var
# ansible-playbook -h | grep var
Example
传递普通的key=value的形式
# ansible all -i /etc/ansible/hosts -m debug -a "msg='my key is {{key}}'" -e "key=value"
传递一个YAML/JSON的形式(注意不管是YAML还是JSON,它们的最终格式一定要是一个字典)
# cat a.json
{"name":"mumu","type":"school"}
# ansible all -i /etc/ansible/hosts -m debug -a "msg='name is {{name}},type is {{type}}'" -e @a.json
# cat a.yml
---
name: mumu
type: school
...
# ansible all -i /etc/ansible/hosts -m debug -a "msg='name is {{name}},type is {{type}}'" -e @a.yml
剧本变量
此种变量和PlayBook有关,定义在PlayBook中的。它的定义方式有多种,这里介绍两种最常用的定义方式。
通过PLAY属性vars定义
---
- name: test play vars
hosts: all
vars:
user: gao
home: /home/gao
通过PLAY属性vars_files定义
# 当通过vars属性定义的变量很多时,这个Play就会感觉特别臃肿。此时我们可以将变量单独从Play中抽离出来,
# 形成单独的YAML文件。
---
- name: test play vars
hosts: all
vars_files:
- /root/users.yml
# cat /root/users.yml
---
user: gao
home: /home/gao
...
怎么在PlayBook中使用这些变量
在PlayBook中使用变量时,使用{{变量名}}来使用变量
---
- name: test play vars
hosts: all
vars:
user: gao
home: /home/gao
tasks:
- name: create the user {{user}}
user: "{{user}}"
home: "{{home}}"
...
资产变量
资产共分为静态资产和动态资产。
资产变量分为主机变量和组变量,分别针对资产中的单个主机和主机组。
主机变量
以下资产中,定义了一个主机变量user,此变量只针对192.168.14.131这台服务器有效。
# cat /etc/ansible/hosts
[dbservers]
192.168.14.131 user=root port=3306
验证
//获取定义的变量值
# ansible dbservers-i /etc/ansible/hosts -m debug -a "msg='{{user} {{port}}'"
192.168.14.130 | SUCCESS => {
"user": "root "
}
主机组变量
以下资产中,定义了一个组变量home ,此变量将针对webservers这个主机组中的所有服务器有效
cat /etc/ansible/hosts
[webservers]
192.168.14.130
192.168.14.131
[webservers:vars]
home="/home/gao/"
验证
//home是webservers的变量,会针对这个组的所有服务器生效。
# ansible webservers -i /etc/ansible/hosts -m debug -a "var=home"
192.168.14.131 | SUCCESS => {
"home": "/home/gao"
}
192.168.14.130 | SUCCESS => {
"home": "/home/gao"
}
主机变量和主机组变量同时 有相同变量时,主机变量优先
变量的继承
# cat hosts_v3
[webservers]
192.168.14.130
[dbservers]
192.168.14.131
[allservers]
[allservers:children]
dbservers
webservers
[allservers:vars]
user=gaoqiumumu
验证
[root@one ~]# ansible allservers -i hosts_v3 -m debug -a "var=user"
192.168.14.131 | SUCCESS => {
"user": "gaoqiumumu"
}
192.168.14.130 | SUCCESS => {
"user": "gaoqiumumu"
}
Inventory变量
内置变量几乎都是以ansible_为前缀。
ansible_ssh_host
将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此
变量设置.
ansible_ssh_port
ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user
默认的ssh用户名
ansible_ssh_pass
ssh密码(这种方式不安全,官方强烈建议使用--ask-pass或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 使用的私钥文件。使用于有多个密钥,而你不想使用SSH代理的情况
ansible_python_interpreter
目标主机的python路径。适用于的情况:系统中有多个python,或者命令路径不是"/usr/local/bin/python3"
Facts变量
Facts变量不包含在前文中介绍的全局变量、剧本变量及资产变量之内。Facts变量不需要我们人为去声明变量名及赋值。
它的声明和赋值完全有Ansible 中的setup模块帮我们完成。
它收集了有关被管理服务器的操作系统版本、服务器IP地址、主机名,磁盘的使用情况、CPU个数、内存大小等等有关被管理服务器的私有信息。在每次PlayBook运行的时候都会发现在PlayBook执行前都会有一个Gathering Facts的过程。这个过程就是收集被管理服务器的Facts信息过程。
手动收集Facts变量
[root@gao ~]# ansible all -i localhost, -c local -m setup
localhost | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.86.128",
"192.168.122.1"
],
"ansible_all_ipv6_addresses": [
"fd15:4ba5:5a2b:1008:2057:7b5:7a16:407a",
"fe80::48e2:b322:489b:3130"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "11/12/2020",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "/vmlinuz-3.10.0-1160.119.1.el7.x86_64",
"LANG": "zh_CN.UTF-8",
"crashkernel": "auto",
"quiet": true,
"rhgb": true,
"ro": true,
"root": "UUID=270d7896-3343-4fa7-8e30-c8a703a70ca6",
"spectre_v2": "retpoline"
},
"ansible_date_time": {
"date": "2024-08-03",
"day": "03",
"epoch": "1722751915",
"hour": "23",
"iso8601": "2024-08-04T06:11:55Z",
"iso8601_basic": "20240803T231155765658",
"iso8601_basic_short": "20240803T231155",
"iso8601_micro": "2024-08-04T06:11:55.765658Z",
"minute": "11",
"month": "08",
"second": "55",
"time": "23:11:55",
"tz": "PDT",
"tz_offset": "-0700",
"weekday": "星期六",
"weekday_number": "6",
"weeknumber": "31",
"year": "2024"
},
...
...
...
过滤Facts
通过刚刚的手动收集Facts,我们发现facts信息量很大。能不能有针对性的显示我们想要的信息呢?
可以通过使用Facts模块中的filter参数去过滤我们想要的信息。
仅获取服务器的内存情况信息
[root@gao ~]# ansible all -i localhost, -m setup -a "filter=*memory*" -c local
localhost | SUCCESS => {
"ansible_facts": {
"ansible_memory_mb": {
"nocache": {
"free": 3195,
"used": 575
},
"real": {
"free": 2860,
"total": 3770,
"used": 910
},
"swap": {
"cached": 0,
"free": 3968,
"total": 3968,
"used": 0
}
},
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
仅获取服务器的磁盘挂载情况
[root@gao ~]# ansible all -i localhost, -m setup -a "filter=*mount*" -c local
localhost | SUCCESS => {
"ansible_facts": {
"ansible_mounts": [
{
"block_available": 8714,
"block_size": 4096,
"block_total": 75945,
"block_used": 67231,
"device": "/dev/sda1",
"fstype": "xfs",
"inode_available": 69869,
"inode_total": 70224,
"inode_used": 355,
"mount": "/boot",
"options": "rw,seclabel,relatime,attr2,inode64,noquota",
"size_available": 35692544,
"size_total": 311070720,
"uuid": "1920dcf9-ce33-4e21-930f-8dd592fff7a2"
},
{
"block_available": 18469270,
"block_size": 4096,
"block_total": 19868694,
"block_used": 1399424,
"device": "/dev/sda3",
"fstype": "xfs",
"inode_available": 39561108,
"inode_total": 39756800,
"inode_used": 195692,
"mount": "/",
"options": "rw,seclabel,relatime,attr2,inode64,noquota",
"size_available": 75650129920,
"size_total": 81382170624,
"uuid": "270d7896-3343-4fa7-8e30-c8a703a70ca6"
}
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
在PlauBook中使用Facts变量
默认情况下,在执行PlayBook的时候,它会去自动的获取每台被管理服务器的facts信息。
---
- name: a play example
hosts: all
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
- name: copy nginx.conf to remote server
copy: src=nginc.conf dest=/etc/nginx/nginx.conf
- name: start nginx server
service:
name: nginx
enabled: true
state: started
执行
[root@gao playbook]# ansible-playbook myplaybook.yml
可以想使用其他变量一眼,去使用facts变量
---
- name: print facts varible
hostsL all
tasks:
- name: print facts variable
debug:
msg: "The default IPV4 address is {{ansible_default_ipv4.address}}"
在PlayBook中去关闭Facts变量的获取
若在整个PlayBook的执行过程中,完全未使用过Facts变量,此时我们可以将其关闭,以加快PlayBook的执行速度。
---
- name: a play example
hosts: webservers
#关闭facts变量收集功能
gather_facts: no
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
- name: copy nginx.conf to remote server
copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf
- name: start nginx server
service:
name: nginx
enabled: true
state: started
执行
[root@gao playbook]#ansible-playbook -i /etc/ansible/hosts myplaybook.yml
注册变量
往往用于保存一个task任务的执行结果,以便于debug时使用。
或者将此次task任务的结果作为条件,去判断是否去执行其他task任务。
注册变量在PlayBook中通过register关键字去实现。
---
-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 /etc/ansible/hosts playbook3.yml
变量的优先级
目前介绍了全局变量、剧本变量、资产变量、Facts变量及注册变量。
其中Facts变量不需要人为去声明、赋值;;注册变量只需通过关键字register
去声明,而不需要赋值。
而全局变量、剧本变量及资产变量则完全需要人为的去声明、赋值。
变量的优先权讨论,也将着重从这三类变量去分析。
假如在使用过程中,我们同时在全局变量、剧本变量及资产变量声明了同一个变量名,那么哪一个优先级最高呢?
下面我们将以实验的形式去验证变量的优先级
环境准备
评论区