目录
准备一台master 两台受控主机,只有master安装ansible即可(ansible依靠ssh)
配置ansible的配置文件 ansible.cfg (优先级别)
在控制主机上安装Ansible(两种方法)
依靠网络源 -- 适用于所有版本的RHEL
(1)配置rocky9的网络源 mirrors.163.com
[root@localhost ~]# cat /etc/yum.repos.d/rocky.repo
[App] name=rocky-app
baseurl=Index of /rocky/9/AppStream/x86_64/os/
gpgcheck=0
[BaseInet]
name=rocky-base
baseurl=Index of /rocky/9/BaseOS/x86_64/os/
gpgcheck=0
[root@localhost ~]# cat /etc/yum.repos.d/base.repo
[base]
name=base
baseurl=file:///mnt/BaseOS
gpgcheck=0
[App] name=App
baseurl=file:///mnt/AppStream
gpgcheck=0
(2)安装自动化工具:
yum install ansible-core -y
(3)查看是否安装成功
#ansible --version
基于python3.8版本安装部署
使用本地源
在RHEL9的本地源中是自带Ansible的安装包,可以直接依靠本地源来安装
检查版本号查看是否安装成功
准备一台master 两台受控主机,只有master安装ansible即可(ansible依靠ssh)
根据优先级选择执行ansible配置文件
执行ansible命令根据所在目录匹配相关ansible配置文件,实践中一般使用ansible命令的目录中创建ansible.cfg文件,此目录中也将包含任何你的ansible项目使用的文件,有清单或者主机清单。
配置ansible的配置文件 ansible.cfg (优先级别)
1)ANSIBLE_CONFIG环境变量匹配配置文件ansible.cfg
2)./ansible.cfg
3)~/.ansible.cfg
4)/etc/ansible/ansible.cfg
管理配置文件中的设置(ini)
配置文件由几部分组成,每部分含有以键值对形式定义的设置。部分的标题一方括号括起。重点需要了解以下两部分:
[defaults] inventory = ./inventory #主机列表配置文件 library = /usr/share/my_modules #库文件存放目录 forks = 5 #默认并发数5 (同时可以处理5个命令--同时有20个节点主机5个主机执行在5个执行) sudo_user = root #默认的sudo用户 root ask_sudo_pass = Ture ask_pass = false #每次执行ansible命令是否询问ssh密码 remout_port = 22 host_key_checking = False #检查对应服务器的host_key,建议取消注释 log_path = /var/log/ansible.log #ansible日志文件 module_name = command #默认模块,可以改为shell remote_user = user #要在受管主机上登录的用户名称,没有指定则是当前用户(受管、管控、托管主机的用户名) remote_tmp = ~/.ansible/tmp ;临时的py命令文件存放在远程主机目录 [privilege_escalation] ;特权升级 become = true #连接后是否在受管主机上切换用户,默认会切换到root下 become_method = sudo #如何切换用户 become_user = root #受管主机切换到的用户 become_ask_pass = false #是否为become_method提示输入密码,默认为false
1.每台主机都要有student用户
2.student用户可以有root的操作权限并且不需要密码
\#visudo
student ALL=(ALL) NOPASSWD:ALL
3.在server下生成秘钥ssh-keygen -f ~/.ssh/id_rsa -P '' -q
-f ~/.ssh/id_rsa
指定了生成的密钥文件的路径和名称(在这里是~/.ssh/id_rsa
)。-P ''
设置了密钥的密码,这里是空字符串,表示没有密码。-q
参数表示在生成密钥的过程中不显示任何警告或提示信息。
生成密钥也可指定输出的密钥算法
ssh-keygen -t rsa
分别发送公钥认证文件
4、下发密钥到被管理节点
[root@localhost ansible]# for name in node{1..2} ;do ssh-copy-id root@$name;done
5、验证一下SSH无密码配置是否成功
[root@localhost ansible]# for name in node{1..2};do ssh $name hostname;done
配置信息(ini)
[defaults]
inventory = ./inventory #主机列表配置文件 host_key_checking = False #检查对应服务器的host_key,建议取消注释
forks = 5 #默认并发数5 (同时可以处理5个命令--同时有20个节点主机5个主机执行在5个执行)
ask_pass = false #每次执行ansible命令是否询问ssh密码
定义主机清单文件
#vim ./inventory
[web]
node1
[dns]
node2
ansible-doc单条命令实施任务
ansible 主机名|主机组名 -m 模块 -a '模块相关参数'
ansible web -m ping
ansible-doc 查找关于本地系统上安装的模块信息==显示模块帮助(ansible里man命令) |
-l,--lsit 查看控制节点上可用的模块列表以及其功能的概要;列出可用模块 |
-s,--snippet 列岀某个模块支持的动作 显示模块的playbook |
ansible-doc [module name] 查看指定模块的概要、选项、详细信息、以及基本用法 |
模块文档文档网站:Ansible Documentation |
主机联通性测试
绿色:执行成功并且不需要做出任何改变
黄色:执行成功并且对目标主机做出变更
红色:执行失败
蓝色:显示详细过程
紫色:显示警告
command模块参数
名称 | 必选 | 备注 |
---|---|---|
chdir | no | 运行command命令前先cd到这个目录 |
creates | no | 如果这个参数对应的文件存在,就不运行command |
free_form | yes | 需要执行的脚本(没有真正的参数为free_form) |
executable | no | 改变用来执行命令的shell,应该是可执行文件的绝对路径。 |
removes | no | 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反 |
stdin(2.4后新增) | no | 将命令的stdin设置为指定的值 |
free_form参数 :必须参数,指定需要远程执行的命令。需要说明一点,free_form 参数与其他参数(如果想要使用一个参数,那么则需要为这个参数赋值,也就是name=value模式)并不相同。比如,当我们想要在远程主机上执行 ls 命令时,我们并不需要写成”free_form=ls” ,这样写反而是错误的,因为并没有任何参数的名字是 free_form,当我们想要在远程主机中执行 ls 命令时,直接写成 ls 即可。因为 command 模块的作用是执行命令,所以,任何一个可以在远程主机上执行的命令都可以被称为 free_form
shell模块
让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等。与command模块几乎相同,但在执行命令的时候使用的是/bin/sh。
名称 | 必选 | 备注 |
---|---|---|
chdir | no | 运行command命令前先cd到这个目录 |
creates | no | 如果这个参数对应的文件存在,就不运行command |
executable | no | 改变用来执行命令的shell,应该是可执行文件的绝对路径。 |
free_form | yes | 需要执行的脚本(没有真正的参数为free_form) |
removes | no | 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反 |
stdin(2.4后新增) | no | 将命令的stdin设置为指定的值 |
切换目录,执行命令并保持输出
[root@centos7 ~]# ansible test -m shell -a "sh test.sh > result chdir=/root"
172.20.21.120 | SUCCESS | rc=0 >>
[root@centos7 ~]# ansible test -m shell -a "cat result chdir=/root"
172.20.21.120 | SUCCESS | rc=0 >>
script模块
名称 | 必选 | 备注 |
---|---|---|
chdir(2.4后新增) | no | 运行command命令前先cd到这个目录 |
creates | no | 如果这个参数对应的文件存在,就不运行command |
decrypt | no | 此选项控制使用保管库的源文件的自动解密 |
free_form | yes | 需要执行脚本的本地文件路径(没有真正的参数为free_form) |
removes | no | 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反 |
在远程主机上执行脚本
[root@centos7 ~]# ansible test -m script -a "test.sh chdir=/tmp"
172.20.21.120 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.20.21.120 closed.\r\n",
"stdout": "/tmp\r\n",
"stdout_lines": [
"/tmp"
]
}
raw模块
-
raw模块主要用于执行一些低级的,脏的SSH命令,而不是通过command模块。
-
raw模块只适用于下列两种场景,第一种情况是在较老的(Python 2.4和之前的版本)主机上,另一种情况是对任何没有安装Python的设备(如路由器)。 在任何其他情况下,使用shell或command模块更为合适。
-
就像script模块一样,raw模块不需要远程系统上的python
名称 | 必选 | 备注 |
---|---|---|
executable | no | 改变用来执行命令的shell,应该是可执行文件的绝对路径。 |
free_form | yes | 需要执行的脚本(没有真正的参数为free_form) |
[root@centos7 ~]# ansible test -m raw -a "pwd"
172.20.21.120 | SUCCESS | rc=0 >>
/root
Shared connection to 172.20.21.120 closed.
file模块
file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等
path参数 :必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以。
state参数 :Path=“路径” state= touch|file|directory|link|hard|absent
src参数 :当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源。
force参数 : 当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件,不过强制创建链接文件分为两种情况,情况一:当你要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当你要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,回将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当你要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。
owner参数 :用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。
group参数 :用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。
mode参数:用于指定被操作文件的权限,比如,如果想要将文件权限设置为"rw-r-x---",则可以使用mode=650进行设置,或者使用mode=0650,效果也是相同的,如果你想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=4700,很方便吧。
recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。 -R
setype: httpd_content_t
示例:
创建文件
1.在node1主机上创建一个名为testfile的文件,如果testfile文件已经存在,则会更新文件的时间戳,与touch命令的作用相同。
ansible node1 -m file -a 'path=/testfile state=touch' ansible node1 -m file -a 'path=/testfile state=directory' ansible node1 -m file -a 'path=/testfile state=absent' ansible node1 -m file -a 'path=/testfile state=touch owner=redhat group=redhat mode=622'
示例:
创建文件
1.在test70主机上创建一个名为testfile的文件,如果testfile文件已经存在,则会更新文件的时间戳,与touch命令的作用相同。
ansible test70 -m file -a "path=/testdir/testfile state=touch"
2.在test70主机上创建一个名为testdir的目录,如果testdir目录已经存在,则不进行任何操作。
ansible test70 -m file -a "path=/testdir/testdir state=directory"
创建链接文件 src
3.在test70上为testfile文件创建软链接文件,软链接名为linkfile,执行下面命令的时候,testfile已经存在。
ansible test70 -m file -a "path=/testdir/linkfile state=link src=/testdir/testfile"
4.在test70上为testfile文件创建硬链接文件,硬链接名为hardfile,执行下面命令的时候,testfile已经存在。
ansible test70 -m file -a "path=/testdir/hardfile state=hard src=/testdir/testfile"
5.在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述force参数的解释。
ansible test70 -m file -a "path=/testdir/linkfile state=link src=sourcefile force=yes"
删除
6.删除远程机器上的指定文件或目录
ansible test70 -m file -a "path=/testdir/testdir state=absent"
更改属主属组
7.在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主。
ansible test70 -m file -a "path=/testdir/abc state=touch owner=zsy"
ansible test70 -m file -a "path=/testdir/abc owner=zsy"
ansible test70 -m file -a "path=/testdir/abc state=directory owner=zsy"
8.在创建文件或目录的时候指定属组,或者修改远程主机上的文件或目录的属组。
ansible test70 -m file -a "path=/testdir/abb state=touch group=zsy"
ansible test70 -m file -a "path=/testdir/abb group=zsy"
ansible test70 -m file -a "path=/testdir/abb state=directory group=zsy"
更改权限
9.在创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限。
ansible test70 -m file -a "path=/testdir/abb state=touch mode=0644"
ansible test70 -m file -a "path=/testdir/abb mode=0644"
ansible test70 -m file -a "path=/testdir/binfile mode=4700"
ansible test70 -m file -a "path=/testdir/abb state=directory mode=0644"
10.当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为zsy。
ansible test70 -m file -a "path=/testdir/abd state=directory owner=zsy group=zsy recurse=yes"