自学内容网 自学内容网

ansible安装和常用模块的使用

快速上手ansible

安装ansible

1.安装:yum -y install absible ;版本:ansible-2.9.27-1.el7.noarch

前提:已经部署了免密远程连接

3.配置ansible配置文件如下:

[root@seven-two ~]# egrep -vn '^#|^$' /etc/ansible/ansible.cfg 
10:[defaults]
327:[inventory]
340:[privilege_escalation]
346:[paramiko_connection]
370:[ssh_connection]
431:[persistent_connection]
445:[accelerate]
460:[selinux]
469:[colors]
485:[diff]

4.做如下修改

71 host_key_checking = False#关闭主机秘钥检测
111 log_path = /var/log/ansible.log#开启日志功能
forks          = 100  # ansible同时可以管理的主机数量

批量管理命令

1.定义一个主机清单文件

  • 清单默认在:/etc/ansible/hosts。如果放在其他目录,也可以 -i 手动指定清单

  • 写入要被管理的ip,也可以对其分组。类似rsync的模块

  • 前提是被管理的主机做了免密登录,不然操作无法执行

vim hosts

[rsyc]
10.0.0.70
10.0.0.71

[other]
10.0.0.72

[web]
10.0.0.8
10.0.0.62

[k8s]
10.0.0.231

2.对所有设备执行一个测试命令,如果组中的主机ip不能被访问,会报错


[root@seven-three ~]# ansible all -m ping 
10.0.0.72 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
....

在这里插入图片描述

子组功能

  • 子组是一个组内包含其他组的逻辑结构。子组中的主机会继承父组的变量和配置

  • Ansible 的 inventory 文件中,子组功能允许将主机分组嵌套在其他组中,从而实现灵活的层次化组织和管理

  • 语法:

[组名:children]
小组1
小组2

2.示例。创建2个组db、web,这2个组作为app的子组

[db]
10.0.0.51
10.0.0.52

[web]
10.0.0.231

[app:children]
db
web

3.验证测试,可以基于任意组运行

[root@gitlabansible]# ansible db -m command -a 'pwd' -i hosts_children 
10.0.0.52 | CHANGED | rc=0 >>
/root
10.0.0.51 | CHANGED | rc=0 >>
/root
[root@gitlabansible]# ansible web -m command -a 'pwd' -i hosts_children 
10.0.0.231 | CHANGED | rc=0 >>
/root
[root@gitlabansible]# ansible app -m command -a 'pwd' -i hosts_children 
10.0.0.52 | CHANGED | rc=0 >>
/root
10.0.0.51 | CHANGED | rc=0 >>
/root
10.0.0.231 | CHANGED | rc=0 >>
/root

在hosts手动添加主机信息

  • 若被管理的目标主机没有做免密认证,也可手动在hosts文件添加。
    • 然后本地就多了个known_hosts文件。等于ansible填了yes/no
    • 但并不意味着公钥传递过去了
[rsync]
10.0.0.70 ansible_user=root ansible_hosts=rsync1 ansible_password=aa ansible_port=22

模块介绍和使用

  • ansible模块类似linux的命令
    • 举例:yum模块类似yum命令,目录/文件增删改查类似file模块…
ansible模块使用说明
命令模块 (默认)-a ‘要执行的命令’
🔔 命令里不支持特殊符号
shell支持特殊符号。仍要注意特殊字符
script使用脚本模块
使用…模块
ansible-doc -s +模块名获取对应模块帮助
ansible-doc +模块名/EXA获取示例

基本模块

shell模块
  • command模块不支持管道符等特殊字符…
[root@seven]# ansible all -m shell -a "ifconfig|awk -F '[ /]+' 'NR==2{print \$3}'"
10.0.0.71 | CHANGED | rc=0 >>
10.0.0.71
10.0.0.70 | CHANGED | rc=0 >>
10.0.0.70
脚本模块

shell模块可以看做shell模块的升级版

脚本内容为:

vim x.sh
#!/bin/bash
#desc:用ansible批量系统巡检

hostname
hostname -I
ifconfig|awk -F '[ /]+' 'NR==2{print $3}'
date +%F_%T
sleep 5

执行:ansible all -m script -a ‘/root/x.sh’

10.0.0.71 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 10.0.0.71 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 10.0.0.71 closed."
    ], 
    "stdout": "backup\r\n10.0.0.71 172.16.1.71 \r\n10.0.0.71\r\n2024-04-06_10:07:55\r\n", 
    "stdout_lines": [
        "backup", 
        "10.0.0.71 172.16.1.71 ", 
        "10.0.0.71", 
        "2024-04-06_10:07:55"
    ]
}
file文件模块
  • file模块可以管理文件、目录、软链接
file模块说明
path必填选项
state不同模式
state=directory 创建目录
state=file (默认) 更新文件,如果文件不存在也不创建
state=link 创建软连接
state=touch 创建文件
state=absent 递归删除
src指定源文件,如创建软连接/复制时
modemode=755创建并修改权限
ownerowner=root改属主为root
groupowner=root改属主为root
statedirectory 创建目录,link 创建软连接
增/删目录和文件

ansible all -m file -a 'path=/test/ state=directory/absent'

ansible all -m file -a 'path=/test/test.txt state=touch/absent'

  • 创建软连接

ansible all -m file -a 'src=/home/ path=/root/home.lns state=link'

copy模块
  • 用途:批量分发,类似scp。💊 只能单向分发,不能拉取
copy模块参数说明
src源文件
dest目的位置
backup=yes覆盖前备份,文件内容相同则不会产生备份
mode:owner/group/preserve(保留权限)文件权限设置
  • 基础使用示例

ansible all -m copy -a 'src=/root/x.sh dest=/test/'

  • 生成备份

ansible all -m copy -a 'src=/root/x.sh dest=/test/ backup=yes'

查看这2个文件:x.sh x.sh.17987.2024-04-06@12:58:48~

fetch拉取模块(略)

其他系统模块

lineinfile修改文件模块
  • 功能类似sed的编辑
lineinfile参数说明
path要更改的文件,必填
regex=‘XX’用正则找到要更改的行
例如以…开头/结尾的行
state=absent/present增加/删除行
insertafter/insertbefore:=‘XX’在之后/之前添加新行XX
  • 插入新行示例

环境:/test/hosts

127.0.0.1
::1         localhost

目的:在第一行上方插入新行"wzy666"

方法:ansible all -m lineinfile -a "path=/test/hosts insertbefore='4$' line='wzy666' "

其中4$表示以4结尾的行,即正则。
systemed服务管理模块
systemed模块
name=XX服务名
enabled=yes/no(可选项)是否开机自启改服务
state=state=started 开启
state=stopped 关闭
state=reloaded 重读配置文件(服务支持)
state=restarted 重启(关闭再开启)
  • 重启该服务,但是不要把它列入开机自启中

ansible all -m systemd -a "name=NetworkManager enabled=no state=restarted"

验证:可以使用nmtui命令,但是并未自启

[root@wzy~]# systemctl list-unit-files |grep NetworkM
NetworkManager.service                        disabled
service模块
  • 适合一些老旧的linux系统
yum软件管理模块
  • 注意:该模块包含yum和apt
yum模块
name=XX,yy软件名称。多个软件用逗号分隔
也可以是本地rpm包
update_cache=yes/no(可选)是否开启本地缓存
state=installed 安装(present)(默认)
removed 删除 (absent)
lastest 安装或更新
  • 示例:安装sl ansible all -m yum -a "name=sl"
  • 卸载:sl ansible all -m yum -a "name=sl" state=removed
get-url下载模块

类似wget命令

get_url下载功能
url指定要下载的地址
dest下载到哪个目录
🔔不会创建目录
validate_certs: no不检查证书

https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.5/rhel/7/x86_64/zabbix-agent-6.0.0-0.1alpha1.el7.x86_64.rpm

  • 下载zabbix为例

ansible all -m get_url -a "url=https://XXXX.zabbix/省略... dest=/test/"

yum_repository❌
  • 鸡肋功能,不如写好yum配置文件复制过去
yum_repository
nameyum源中名字 [epel]
descriptionyum源的注释说明 对应的 是name的内容
baseurlyum源中 baseurl 下载地址
enabled是否启动这个源 yes/no
gpgcheck是否启动gpgcheck功能 no
file自动添加为XX.repo
默认与模块名字一致.
  • cat /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch#没用的注释
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
enabled=1
gpgcheck=0
#nginxyum官方源
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
  • 手写nginx源

ansible rsync -m yum_repository -a 'name=nginx-stable baseurl="http://nginx.org/packages/centos/$releasever/$basearch/" enabled=yes gpgcheck=no description=wzy'

  • 查看效果
[root@nfs-clientyum.repos.d]# cat nginx-stable.repo 
[nginx-stable]
baseurl = http://nginx.org/packages/centos/$releasever/$basearch/
enabled = 1
gpgcheck = 0
name = wz
user模块
user模块
name指定用户名
uid=指定uid
group=组名,需提前创建组
shell=指定命令解释器
create_home=yes/no是否创建家目录(yes/no)
state=present 添加
absent删除
passwd=改密码
  • 创建用户示例:ansible rsync -m user -a 'user=www uid=1234 shell=/bin/bash state=present'
批量设置密码
  • 先提前做好加密规划。这里设置密码为mypassword

ansible all -i localhost, -m debug -a "msg={{'mypassword' | password_hash('sha512','mysecretsalt') }}"

🔴 处理流程:{{‘mypassword’ | password_hash(‘sha512’,‘mysecretsalt’) }}

mypassword通过管道传递给了后面的sha512加密插件,mysecretsalt作为参与加密参数的字符

加密后的密码为:

localhost | SUCCESS => {
    "msg": "$6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1"
}
  • 设置密码为mypassword

ansible all -m user -a "name=vv password={{ 'mypassword' | password_hash('sha512', 'mysecretsalt')}} state=present"

也可用之前的密文设置:

ansible all -m user -a 'name=vv password="$6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1" state=present'

  • 最简单改密码是用shell模块:echo "password" |passwd --stdin username或者echo 'username:aa'|chpasswd

group模块

group
name=xx
gid
state

mount模块

原理同修改fstab实现永久挂载

mount模块
fstype文件系统类型
src源地址
path挂载点
state见下方
present仅写入配置,不进行挂载。会在下次重启系统时挂载
mounted写入配置,进行挂载
unmounted卸载设备,但不修改配置fstab文件。会在下次重启系统时挂载
absent卸载设备,删除对应配置文件
remounted重新挂载
  • 在其他设备创建分区/dev/sdb1,并批量挂载

ansible all -m mount -a "src=/dev/sdb1 path=/mnt state=present fstype=xfs"

  • 挂载NFS服务器共享的目录

ansible nfs -m mount -a "src=10.0.0.71:/data_nfs path=/mnt state=mounted fstype=nfs"

cron定时模块

cron模块
name (必填)定时任务名,在最终定时任务里会变成注释
job要执行的任务
job=ping baidu.com -c3 &>>/tmp/ping.result
state=present/absent创建/删除任务
minute
hour
day
month
week
  • 每分钟ping百度ansible all -m cron -a "job='ping -c2 baidu.com &>/tmp/ping.txt' name=ping"

查看用户定时任务:

#Ansible: ping
* * * * * ping -c2 baidu.com &>/tmp/ping.txt
  • 每隔1小时pingansible all -m cron -a "job='ping -c2 baidu.com &>/tmp/ping.txt' name=ping minute=00 hour=*/1"

查看用户定时任务:

#Ansible: ping
00 */1 * * * ping -c2 baidu.com &>/tmp/ping.txt

解压模块

  • 管理端有一个1.tar.gz的文件,解压后传输到其节点上。
- hosts: nfs
  tasks:
    - name: 解压1.tar.gz,内容是hosts文件
      unarchive:
        src: /root/1.tar.gz
        dest: /tmp
        #被解压的文件如果是在被管理端,需要加上下面这一句
        remote_src: yes

selinux模块

selinux:
  policy: targeted
  #状态可选3种..
  state: enforcing
ron -a "job='ping -c2 baidu.com &>/tmp/ping.txt' name=ping minute=00 hour=*/1"`

查看用户定时任务:

#Ansible: ping
00 */1 * * * ping -c2 baidu.com &>/tmp/ping.txt


### 解压模块

- 管理端有一个1.tar.gz的文件,解压后传输到其节点上。

```yaml
- hosts: nfs
  tasks:
    - name: 解压1.tar.gz,内容是hosts文件
      unarchive:
        src: /root/1.tar.gz
        dest: /tmp
        #被解压的文件如果是在被管理端,需要加上下面这一句
        remote_src: yes

selinux模块

selinux:
  policy: targeted
  #状态可选3种..
  state: enforcing

原文地址:https://blog.csdn.net/qq_73797346/article/details/144413738

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!