【小菜鸟之---Ansible基础详解】

文章目录

    • [1 【Ansible简介】](#1 【Ansible简介】)
    • 2【安装部署】
    • 3【Ansible常用模块】
      • [3.1 ping模块](#3.1 ping模块)
      • [3.2 shell模块](#3.2 shell模块)
      • [3.3 command模块](#3.3 command模块)
      • [3.4 copy模块](#3.4 copy模块)
      • [3.5 file模块](#3.5 file模块)
      • [3.6 corn模块](#3.6 corn模块)
      • [3.7 yum模块](#3.7 yum模块)
      • [3.8 service模块](#3.8 service模块)
      • [3.9 user模块](#3.9 user模块)
      • [3.10 script 模块](#3.10 script 模块)
      • [3.11 debug模块](#3.11 debug模块)
      • .....
    • 4【剧本模式-playbooks】
      • [4.1 简介](#4.1 简介)
      • [4.2 playbook核心元素](#4.2 playbook核心元素)
      • [4.3 基本语法](#4.3 基本语法)
      • [4.4 Handler](#4.4 Handler)
      • [4.5 roles](#4.5 roles)

1 【Ansible简介】

1.1简介

​ Ansible是一种基于python开发的自动化运维工具,它只需要在服务端安装ansible,无需在每个客户端安装客户端程序,通过ssh的方式来进行客户端服务器的管理,集合了众多运维工具(puppet、chef、func、fabric)的优点,基于模块实现了批量系统配置、批量程序部署、批量运行命令等功能。

1.2 Ansible 特点

复制代码
1 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
2 默认使用SSH协议对设备进行管理;
3 有大量常规运维操作模块,可实现日常绝大部分操作;
4 配置简单、功能强大、扩展性强;
5 支持API及自定义模块,可通过Python轻松扩展;
6 通过Playbooks来定制强大的配置、状态管理;
7 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
8 提供一个功能强大、操作性强的Web管理界面和REST API接口------AWX平台。
9 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况

1.3 Ansible的工作机制

Ansible架构图

主要模块

bash 复制代码
    Ansible:Ansible核心程序。
    HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
    Playbooks:"剧本"YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
    CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
    CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
    ConnectionPlugins:连接插件,Ansible和Host通信使用

​ Ansible的工作原理是基于模块的。它通过SSH协议连接到远程主机,并使用Ansible模块在远程主机上执行任务。每个模块都是独立的,可以完成不同的任务,例如配置系统、部署应用程序、运行命令等。

Ansible的工作流程如下:

复制代码
   1. Ansible 通过SSH连接到远程主机。
   2. Ansible根据配置文件中的主机组和主机列表确定要操作的目标主机。
   3. Ansible在目标主机上安装并运行一个临时的Python脚本,该脚本用于执行Ansible模块。
   4. Ansible通过SSH将模块代码传输到目标主机,并在目标主机上执行模块代码。
   5. 模块执行完成后,Ansible将执行结果返回给控制节点。

1.4Ansible任务工作模式

bash 复制代码
 ansible分为两种工作模式:

一是adhoc(点对点模式):此模式相当于对管理主机执行单个的shell命令。

二是playbook(剧本模式):该模式应用较多,该模式是指将一系列任务整合形成一个剧本,以此来达成某种功能(譬如部署某个服务,数据库备份等)的目的。

上述两种模式可类比于一个是执行单个shell命令,一个是shell脚本。

2【安装部署】

2.1安装命令

bash 复制代码
需要先安装一个epel-release包,然后再安装 ansible 即可。
[root@localhost ~]$ yum -y install epel-release
[root@localhost ~]$ yum -y install ansible

安装目录如下(yum安装):

bash 复制代码
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/

2.2 Ansible配置文件

​ Ansible 的配置文件为/etc/ansible/ansible.cfg,常见参数

bash 复制代码
inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置

library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开

forks = 5	#并发连接数,默认为5

sudo_user = root	#设置默认执行命令的用户

remote_port = 22	#指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全

ask_pass = True     #是否需要密码

host_key_checking = False	#设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例

timeout = 60	#设置SSH连接的超时时间,单位为秒

log_path = /var/log/ansible.log	 #指定一个存储ansible日志的文件(默认不记录日志)

2.3主机清单配置

主机清单在 /etc/ansible/hosts 文件内。

bash 复制代码
#格式:
[定义一个主机组名字]
  主机1 #ip或者主机名
  主机2
 
 如:
 [ansibleTest]
 192.168.58.130 # ansible_user=root ansible_port=22 ansible_ssh_pass=root
 192.168.58.131 # ansible_user=root ansible_port=22 ansible_ssh_pass=root
 
 [manager] #本机也可以管理自己
192.168.58.129
 
 当需要对该类主机进行操作时,只要调用ansibleTest即可调用该分组内所有主机
bash 复制代码
#查看所有主机
[root@iau ~]# ansible all --list-hosts
  hosts (3):
    192.168.58.130
    192.168.58.131
    192.168.58.129

2.4 基于ssh免密登录

bash 复制代码
#1.创建密钥对 在管理服务端操作
[root@iau ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  #回车
Enter passphrase (empty for no passphrase): #回车
Enter same passphrase again: #回车
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:2oqspUsBe3bq7rF6CU0IOAcNLTSOMtGvUgbcuA3LO4Q root@iau.com
The key's randomart image is:
+---[RSA 3072]----+
|BOo              |
|O=*.             |
|OB=.             |
|EO+..            |
|o==..   S        |
|o=o+   o         |
| o=.. . .        |
| oo* . .         |
|.=Ooo .          |
+----[SHA256]-----+

#2.公钥传到被控端
[root@iau ~]# ssh-copy-id root@192.168.58.130
[root@iau ~]# ssh-copy-id root@192.168.58.131
bash 复制代码
[root@iau ~]# ssh-copy-id root@192.168.58.131
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.58.131 (192.168.58.131)' can't be established.
ED25519 key fingerprint is SHA256:CH3r9ZSnB5QNlJhATt/Bvv4bVPUM32ggkFm/LTrOtAY.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:1: 192.168.58.130
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.58.131's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.58.131'"
and check to make sure that only the key(s) you wanted were added.
bash 复制代码
# 使用命令检测免密登录
[root@iau ~]# ssh root@192.168.58.130
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Thu May  2 21:39:59 2024 from 192.168.58.129
#退出
[root@zbx-agent01 ~]# exit
注销
Connection to 192.168.58.130 closed.

2.5常用命令

bash 复制代码
ansible-doc -l :列出所有模块
 
ansible-doc -s <模块名> :查看模块的参数信息
 
ansible --version :查看ansible版本
 
ansible -v :输出详细详细;-vv:输出更详细的信息
 
ansible -m :指定调用的模块名称
 
ansible -a :调用模块的参数
 
ansilbe -c :测试命令执行结果,不实际执行
 
ansible -k :提示输入ssh的秘密,而不是基于ssh认证
 
ansible -u :指定执行命令的用户
 
ansilbe -i :指定访问的主机列表文件
 
ansilbe -f :指定并发进程数

3【Ansible常用模块】

3.1 ping模块

bash 复制代码
#ping模块用来检查目标主机是否在线
[root@iau ~]# ansible ansibleTest -m ping
192.168.58.130 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
192.168.58.131 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
bash 复制代码
#ping模块ping网段
[root@iau ~]#  ansible 192.168.58.* -m ping
192.168.58.131 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
192.168.58.130 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
192.168.58.129 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

3.2 shell模块

bash 复制代码
shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能
#查看目录
[root@iau ~]# ansible ansibleTest -m shell -a "ls /iau"
192.168.58.131 | CHANGED | rc=0 >>
i,a,u
shell
192.168.58.130 | CHANGED | rc=0 >>
i,a,u
shell

#创建文件夹,并列举(中间用分号隔开)
[root@iau ~]# ansible ansibleTest -m shell -a "mkdir /iau/ansible ; ls /iau"
192.168.58.131 | CHANGED | rc=0 >>
ansible
i,a,u
shell
192.168.58.130 | CHANGED | rc=0 >>
ansible
i,a,u
shell

#查看apache服务器状态(131没安装apache)
[root@iau ~]# ansible ansibleTest -m shell -a "systemctl status httpd.service"
192.168.58.131 | FAILED | rc=4 >>
Unit httpd.service could not be found.non-zero return code
192.168.58.130 | FAILED | rc=3 >>
○ httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/httpd.service.d
             └─php-fpm.conf
     Active: inactive (dead)
       Docs: man:httpd.service(8)non-zero return code

3.3 command模块

可以直接在远程主机上执行命令,并将结果返回本主机。不支持特殊字符,如管道符。

bash 复制代码
[root@iau ~]$ ansible ansibleTest -m command -a 'date'

常用的选项:
	chdir:     # 在执行命令之前,先切换到该目录
	executable:   # 切换shell来执行命令,需要使用命令的绝对路径
	free_form:   # 要执行的Linux指令,一般使用Ansible的-a参数代替。
	creates:     # 一个文件名,当这个文件存在,则该命令不执行,可以用来做判断
	removes:      # 一个文件名,这个文件不存在,则该命令不执行
	

#先切换到/data/ 目录,再执行"ls"命令
[root@iau ~]$ ansible ansibleTest -m command -a 'chdir=/iau/ ls'

#如果/data/aaa.jpg存在,则不执行"ls"命令
[root@iau ~]$ ansible ansibleTest -m command -a 'creates=/iau/aaa.jpg  ls'

#如果/data/aaa.jpg存在,则执行"cat /data/a"命令
[root@iau ~]$ ansible ansibleTest -m command -a 'removes=/iau/aaa.jpg  cat /data/a'

#查看磁盘使用率
[root@iau ~]$ ansible ansibleTest -m command -a 'df -hT'

#系统时间
[root@iau ~]# ansible ansibleTest -m command -a 'date'
192.168.58.131 | CHANGED | rc=0 >>
2024年 05月 02日 星期四 22:19:53 CST
192.168.58.130 | CHANGED | rc=0 >>
2024年 05月 02日 星期四 22:19:54 CST

3.4 copy模块

bash 复制代码
# 用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等。远程主机目录不存在,则会自动创建

# 常用参数
src		 	 	# Ansible端源文件或者目录,空文件夹不拷贝;
content		 	# 用来替代src,用于将指定文件的内容,拷贝到远程文件内;
dest		    # 客户端目标目录或者文件,需要绝对路径;
backup			# 拷贝之前,先备份远程节点上的原始文件;backup=yes
directory_mode	 # 用于拷贝文件夹,新建的文件会被拷贝,而老旧的不会被拷贝;
follow			# 支持link文件拷贝;
force			# 覆盖远程主机不一致的内容;
group		 	# 设定远程主机文件夹的组名;
mode		 	# 指定远程主机文件及文件及的权限;
owner		 	# 设定远程主机文件夹的用户名,拥有者。

##为 "ansibleTest" 的目标主机上创建一个名为 "an" 的文件,并将内容 "ansible test" 写入其中,并制定权限
[root@iau ~]# ansible  ansibleTest -m copy -a 'content="ansible test\n" dest=/iau/an  mode=777'
##查看
[root@iau ~]# ansible  ansibleTest -m shell -a 'cat /iau/an'
192.168.58.130 | CHANGED | rc=0 >>
ansible test
192.168.58.131 | CHANGED | rc=0 >>
ansible test

##把文件的内容修改一下,然后选择覆盖备份
ansible ansibleTest -m copy -a 'content="I am iauxcn\n" backup=yes dest=/iau/an mode=777'
[root@iau ~]#  ansible  ansibleTest -m shell -a 'cat /iau/an'
192.168.58.131 | CHANGED | rc=0 >>
I am iauxcn
192.168.58.130 | CHANGED | rc=0 >>
I am iauxcn

##远程拷贝.本地文件复制到远程主机上的指定路径。
ansible ansibleTest -m copy -a 'src=/iau/test.sql dest=/iau/ mode=644'

3.5 file模块

该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等。

bash 复制代码
# Ansible file模块主要用于对文件的创建、删除、修改、权限、属性的维护和管理,File模块使用详解:

# 常用参数介绍
src					   Ansible端源文件或者目录;
follow				   支持link文件拷贝;
force				   覆盖远程主机不一致的内容;
group				   设定远程主机文件夹的组名;
mode				   指定远程主机文件及文件及的权限;
owner				   设定远程主机文件夹的用户名;
path				   目标路径,也可以用dest,name代替;
attributes			   文件或者目录特殊属性。
state:  #状态,有以下选项:
		directory:如果目录不存在,就创建目录
		file:即使文件不存在,也不会被创建
		link:创建软链接
		hard:创建硬链接
		touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
		absent:删除目录、文件或者取消链接文件

#创建文件新目录
ansible all -m file -a 'name=/iau/xcn state=directory'

#创建新文件
ansible all -m file -a 'name=/iau/xcn1 state=touch'

#删除文件
ansible all -m file -a 'name=/iau/xcn1 state=absent'

#创建软连接
ansible all -m file -a 'src=/iau/xcn dest=/iau/xcn.link state=link '
		# src 是源文件的路径
		# dest 是符号链接的目标路径

3.6 corn模块

该模块适用于管理cron计划任务的。其使用的语法跟我们的crontab文件中的语法一致。

bash 复制代码
常用选项:
	name:     #定时任务描述
	job:      #指明运行的命令是什么,可以写shell命令
	cron_file:      # 自定义cron_file的文件名,使用相对路径则在/etc/cron.d中。
	user:           # 以哪个用户的身份执行

	minute:         # 分(0-59, *, */N),不写时,默认为*
	hour:           # 时(0-23, *, */N),不写时,默认为*
	day:            # 日(1-31, *, */N),不写时,默认为*
	month:          # 月(1-12, *, */N),不写时,默认为*
	weekday:        # 周(0-6 for Sunday-Saturday, *),不写时,默认为*

	special_time     # 特殊的时间范围,参数: reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
	state  #指定状态
		present表示添加定时任务,也是默认设置
		absent表示删除定时任务

#每分钟打印时间
ansible ansibleTest -m cron -a 'name="打印时间" job="date >> /iau/date.txt" minute="*"'

#删除定时任务
ansible ansibleTest -m cron -a 'name="打印时间" state=absent'

#查看定时任务
ansible ansibleTest -m shell -a 'crontab -l'

3.7 yum模块

RedHat和CentOS的软件包安装和管理工具。

bash 复制代码
常用选项:
	name=             #所安装的包的名称
	state=            #present--->安装, latest--->安装最新的, absent---> 卸载软件。
	update_cache       #强制更新yum的缓存
	conf_file          #指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
	disable_pgp_check  #是否禁止GPG checking,只用于presentor latest。
	disablerepo        #临时禁止使用yum库。 只用于安装或更新时。
	enablerepo         #临时使用的yum库。只用于安装或更新时。
	
	#安装下载httpd
	[root@iau ~]# ansible 192.168.58.131 -m yum -a 'name=httpd state=present'
192.168.58.131 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Installed: mod_http2-2.0.26-1.el9.x86_64",
        "Installed: httpd-filesystem-2.4.57-8.el9.noarch",
        "Installed: apr-util-1.6.1-23.el9.x86_64",
        "Installed: apr-util-bdb-1.6.1-23.el9.x86_64",
        "Installed: httpd-tools-2.4.57-8.el9.x86_64",
        "Installed: mod_lua-2.4.57-8.el9.x86_64",
        "Installed: httpd-2.4.57-8.el9.x86_64",
        "Installed: apr-util-openssl-1.6.1-23.el9.x86_64",
        "Installed: httpd-core-2.4.57-8.el9.x86_64",
        "Installed: apr-1.7.0-12.el9.x86_64"
    ]
}

3.8 service模块

该模块用于服务程序的管理。

bash 复制代码
常用选项:

	enabled=[yes|no] #是否开机启动 默认no
	name:           #必选项,服务名称
	pattern:        #定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行
	sleep:          #如果执行了restarted,在则stop和start之间沉睡几秒钟
	state:          #对当前服务执行启动,停止、重启、重新加载等操作    
					 #(started,stoped,restarted,reloaded)
					 
	#开启nginx
	ansible ansibleTest -m service -a 'name=nginx state=started'
	
	#关闭nginx
	ansible ansibleTest -m service -a 'name=nginx state=stopped'
	
	#开启ngingx,并设置自启动
	ansible ansibleTest -m service -a 'name=nginx state=started enabled=yes'

3.9 user模块

该模块主要是用来管理用户账号。

bash 复制代码
常用选项:
	comment  # 用户的描述信息
	createhome  # 是否创建家目录
	force  # 在使用state=absent时, 行为与userdel --force一致.
	group  # 指定基本组
	groups  # 指定附加组,如果指定为(groups=)表示删除所有组
	home  # 指定用户家目录
	move_home  # 如果设置为home=时, 试图将用户主目录移动到指定的目录
	name  # 指定用户名
	non_unique  # 该选项允许改变非唯一的用户ID值
	password  # 指定用户密码
	remove  # 在使用state=absent时, 行为是与userdel --remove一致
	shell  # 指定默认shell
	state  # 设置帐号状态,不指定为创建,指定值为absent表示删除
	system  # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
	uid  # 指定用户的uid

#创建用户
#如果压迫设置密码,要先mkpasswd --method=SHA-512设置加密,将生成的加密密码用于创建用户并设置密码,以确保密码安全性。
[root@iau ~]# mkpasswd --method=SHA-512
密码:#输入用户密码
$6$pbW1x7.YeXyuyu89$dkf4Q3J3b7hRlHAnV09.AbtBKFPpV0kUyni6jsl3MqxHVXYjmu2qB7Vj.0BIpvYHVBpD1jDV..8szvYTTSLty.

[root@iau ~]# ansible ansibleTest -m user -a 'name=ansible password=$6$pbW1x7.YeXyuyu89$dkf4Q3J3b7hRlHAnV09.AbtBKFPpV0kUyni6jsl3MqxHVXYjmu2qB7Vj.0BIpvYHVBpD1jDV..8szvYTTSLty. uid=9529'

#删除用户
[root@iau ~]# ansible ansibleTest -m user -a 'name=ansible state=absent'

#更新用户密码,设置update_password为always以确保密码更新。
ansible ansibleTest -m user -a 'name=ansible password=<加密后的新密码>' -e 'update_password=always'

3.10 script 模块

该模块用于将本机的脚本在被管理端的机器上运行。

bash 复制代码
[root@iau iau]# ansible ansibleTest -m script -a '/iau/test.sh'

3.11 debug模块

bash 复制代码
[root@iau iau]# ansible manager -m debug -a "msg='debug test'"

...

4【剧本模式-playbooks】

4.1 简介

​ Playbooks是Ansible的配置,部署和编排语言。他们可以描述您希望在远程机器做哪些事。使用易读的YAML格式组织Playbook。

​ Playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。

4.2 playbook核心元素

复制代码
Hosts       执行的远程主机列表
Tasks       任务集
Varniables  内置变量或自定义变量在playbook中调用
Templates   模板,即使用模板语法的文件,比如配置文件等
Handlers    和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags        标签,指定某条任务执行,用于选择运行playbook中的部分代码。
remote_user 在远程主机以哪个用户身份执行;

4.3 基本语法

playbook使用yaml语法格式,后缀可以是yaml,也可以是yml。

yaml 复制代码
[root@localhost ~]$ vim test.yaml
---      #表示文档开始
- hosts: ansibleTest           # "- "表示一个块序列的节点,注意:横杠后面有空格,可以写主机名,主机组名,多个使用逗号隔开
  remote_user: root            #指定在进行远程操作时使用root用户进行操作
  tasks:                       #使用tasks关键字指明要进行操作的任务列表,之后的行都属于tasks键值对中的值。
  - name: Ping                 #每个任务都以"- "开头,每个任务都有自己的名字,任务名使用name关键字进行指定
    ping:                      #ansible模块
  - name: make directory test  #第二个任务使用file模块,使用file模块时,指定了path参数与state参数的值。
    file:                      #ansible模块
       path: /data/test        #模块的参数
       state: directory  
	   
---                             #标记文件的开始
- hosts: manager                #指定该playbook在哪个服务器上执行
  vars:                         #表示下面是定义的变量,
    http_port: 80               #变量的形式,key: value,这里http_port是变量名,80是值
    max_clients: 200
  remote_user: root             #指定远程的用户名,这里缩进和vars保持了一致,说明变量的代码块已经结束。
  tasks:                        #下面构成playbook的tasks,每个task都有 - name: 开始,name指定该任务的名称。
  - name: ensure apache is at the latest version  #指定该任务的名称。
    yum: pkg=httpd state=latest                   #yum说明要是用的模板名称,后面指定对应的参数,这两行结合起来就相当于一个shell命令。

  - name: write the apache config file            #每个task之间可以使用空行来做区分。
    template: src=/srv/httpd.j2  dest=/etc/httpd.conf

#需要说明的是缩进的意义和python中缩进的意义是一样,是来区分代码块的。


#playbook创建文件 vim /iau/playbook.yaml,
---
- hosts: manager
  tasks:
    - name: create a directory
      file:
        path: /iau/playbooks
        state: directory
      tags: 
        - directory  

    - name: create a file 
      file:
        path: /iau/playbooks
        state: touch
      tags: 
        - touch
        
    - name: remove directory
      file:
      	path: /iau/playbooks
      	state: absent
      tags:
      	rmdir
       	
    - name: remove file
      file:
		path: /iau/playbooks
		state: absent
      tags:
      	rmfile

语法检测

bash 复制代码
[root@iau ~]$ ansible-playbook  --syntax-check  /iau/playbook.yaml

测试运行

bash 复制代码
[root@iau ~]$ ansible-playbook -C /iau/playbook.yaml

运行

标签tags:

  1. 执行特定标记的任务 :可以使用--tags参数来指定只执行带有特定标记的任务。这对于在大型Playbook中只运行特定任务非常有用,可以加快执行速度并减少不必要的操作。

    bash 复制代码
    [root@iau iau]# ansible-playbook /iau/playbook.yaml --tags directory,touch
  2. 跳过特定标记的任务 :可以使用--skip-tags参数来跳过带有特定标记的任务。这对于在执行Playbook时跳过某些任务非常有用,例如在特定情况下不需要执行的任务。

    bash 复制代码
    [root@iau iau]# ansible-playbook /iau/playbook.yaml --skip-tags directory,touch 
  3. 组织和分类任务:通过为任务添加标记,可以更好地组织和分类任务,使得在维护和管理Playbook时更加清晰和有序。

  4. 重复使用标记:可以在多个任务中重复使用相同的标记,从而可以在需要时轻松地选择性地执行或跳过这些任务。

4.4 Handler

​ Handlers在Ansible中用于在Playbook中定义和触发操作。它们通常用于在执行任务后执行特定的操作,例如重启服务或执行其他清理任务。

​ 在Ansible中,Handlers通常与任务一起使用,当任务执行引起了更改时,Handlers会被触发。Handlers会在所有任务执行完毕后才会执行,确保在任务执行期间只触发一次。

yaml 复制代码
#当任务ensure nginx is installed执行后引起了更改(即安装了nginx),notify关键字触发了名为restart nginx的Handler。Handler会在所有任务执行完毕后执行,重启nginx服务。
---
- hosts: manager
  tasks:
    - name: ensure nginx is installed
      yum:
        name: nginx
        state: present
      notify: restart nginx

  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted
        

4.5 roles

在Ansible中,Roles是一种组织和管理Playbooks的方法,使得代码更加模块化、可重用和易于维护。Roles允许你将相关的任务、变量、文件和处理程序组织在一起,以便在多个Playbooks中重复使用。

一个典型的Role结构包括以下目录和文件:

  • roles/
    • my_role/
      • tasks/
        • main.yml
      • handlers/
        • main.yml
      • templates/
      • vars/
      • files/
      • defaults/
      • meta/

每个目录用于存放特定类型的文件:

  • tasks/: 包含执行任务的YAML文件。
  • handlers/: 包含处理程序的YAML文件,用于在任务执行后执行操作。
  • templates/: 包含模板文件,用于生成配置文件等。
  • vars/: 包含变量文件,用于定义变量。
  • files/: 包含需要复制到目标主机的文件。
  • defaults/: 包含默认变量,可以在Role中被覆盖。
  • meta/: 包含Role的元数据,如依赖关系。

一个Role可以在一个或多个Playbooks中使用,通过roles关键字引用。以下是一个示例Playbook,演示了如何使用Role:

yaml 复制代码
---
- hosts: manager
  roles:
    - my_role

my_role是一个Role的名称,Ansible会自动查找roles/目录下的my_role/目录,并执行其中定义的任务、处理程序等。

s是一种组织和管理Playbooks的方法,使得代码更加模块化、可重用和易于维护。Roles允许你将相关的任务、变量、文件和处理程序组织在一起,以便在多个Playbooks中重复使用。

一个典型的Role结构包括以下目录和文件:

  • roles/
    • my_role/
      • tasks/
        • main.yml
      • handlers/
        • main.yml
      • templates/
      • vars/
      • files/
      • defaults/
      • meta/

每个目录用于存放特定类型的文件:

  • tasks/: 包含执行任务的YAML文件。
  • handlers/: 包含处理程序的YAML文件,用于在任务执行后执行操作。
  • templates/: 包含模板文件,用于生成配置文件等。
  • vars/: 包含变量文件,用于定义变量。
  • files/: 包含需要复制到目标主机的文件。
  • defaults/: 包含默认变量,可以在Role中被覆盖。
  • meta/: 包含Role的元数据,如依赖关系。

一个Role可以在一个或多个Playbooks中使用,通过roles关键字引用。以下是一个示例Playbook,演示了如何使用Role:

yaml 复制代码
---
- hosts: manager
  roles:
    - my_role

my_role是一个Role的名称,Ansible会自动查找roles/目录下的my_role/目录,并执行其中定义的任务、处理程序等。

相关推荐
用户03284722207011 小时前
如何搭建本地yum源(上)
运维
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉4 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦4 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj4 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes