侧边栏壁纸
博主头像
小狐狸 博主等级

行动起来,活在当下

  • 累计撰写 34 篇文章
  • 累计创建 21 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

ansible

小狐狸
2024-06-10 / 0 评论 / 0 点赞 / 78 阅读 / 0 字 / 正在检测是否收录...

安装配置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

去声明,而不需要赋值。

而全局变量、剧本变量及资产变量则完全需要人为的去声明、赋值。

变量的优先权讨论,也将着重从这三类变量去分析。

假如在使用过程中,我们同时在全局变量、剧本变量及资产变量声明了同一个变量名,那么哪一个优先级最高呢?

下面我们将以实验的形式去验证变量的优先级

环境准备

0

评论区