ck918

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

运维自动化工具Ansible

1. ansible安装

rocky安装

需要先安装 enel源
#    yum install -y epel-release
然后再安装ansible
#    yum install -y ansible

ubuntu安装 ansible

有大量的ansible有大量的第三方模块(34739),旧版本  
#    apt update;apt install -y ansible
查看ansible版本
#    ansible --version

可以用此命令查看第三方模块数量
#    dpkg -l ansible | wc -l

ubuntu ansible-core 安装

新版本,外围文件比较少(1064)
# apt update;apt install ansible-core


查新ansible-core第三方模块数量
# dpkg -l ansible | wc -l

#anslble和ansible-core 不能共存只能装一个

在ubuntu中使用ansible需要生成配置文件

 # 创建目录
[root@ubuntu2204 ~]#mkdir -pv /etc/ansible/roles
mkdir: created directory '/etc/ansible'
mkdir: created directory '/etc/ansible/roles'
# 创建文件
[root@ubuntu2204 ~]#touch /etc/ansible/hosts

#生成配置文件
[root@ubuntu2204 ~]#ansible-config init --disabled -t all > /etc/ansible/ansible.cfg



[root@ubuntu2204 ~]#tree /etc/ansible/
/etc/ansible/
├── ansible.cfg  #主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则当前目录中的配置文件优先于此文件
├── hosts   #主机清单,在此文件中定义要管理的主机
└── roles   # 目录,存放角色文件

1 directory, 2 files

ubuntu配置文件

[root@ubuntu2204 ~]#ansible --version
ansible [core 2.12.0]       #ansible版本号
  config file = /etc/ansible/ansible.cfg        #配置文件(该配置文件只有完成上述操作之后才会生成,默认是没有的)
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']  #第三方插件目录
  ansible python module location = /usr/lib/python3/dist-packages/ansible  #官方模块目录
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections   
  executable location = /usr/bin/ansible   #可执行程序
  python version = 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0]   # python环境
  jinja version = 3.0.3      #jinjia模板引擎版本
  libyaml = True   #是否已经安装libyaml

2 配置文件优先级和hosts主机管理配置项

ansible 的主配置文件可以有多个,分别存放于不同目录,其优先级如下

ANSIBLE_CONFIG   #环境变量,此变量中指向的文件必须存在才生效,指向的文件要以.cfg 结尾
./ansible.cfg    #当前目录下的ansible.cfg  一般一个项目对应一个专用的配置文件 
~/.ansible.cfg   #当前家目录下的 .ansible.cfg
/etc/ansible/ansible.cfg      #ansible默认配置文件,主配置文件


#第二个当前目录下的ansible.cfg  此项命令用于单个项目时会经常用  
#例如: 当前有两个项目第一个是 app1  app2  可以在当前目录下创建两个ansible.cfg 来分别管理两个项目



[root@ubuntu ~]# ansible --version | grep cfg
 config file = /etc/ansible/ansible.cfg
#在家目录下创建配置文件
[root@ubuntu ~]# touch .ansible.cfg
#再次查看,配置文件己经发生了改变
[root@ubuntu ~]# ansible --version | grep cfg
 config file = /root/.ansible.cfg
#创建目录,在当前目录下创建配置文件
[root@ubuntu ~]# mkdir app1
[root@ubuntu ~]# cd app1
[root@ubuntu app1]# touch ansible.cfg
[root@ubuntu app1]# ansible --version | grep cfg
 config file = /root/app1/ansible.cfg
#设置环境变量,要以 cfg 结尾

配置文件清单

image-20230704151454145

image-20230704151545646

hosts管理主机配置项

#分组定义,  可以使用区间写法
[root@ubuntu2204 ~]#vim /etc/ansible/hosts 
[root@ubuntu2204 ~]#cat /etc/ansible/hosts 
[group1]
192.168.168.[5:9]
group2.m5[4:5]-magedu,com

[group2]
192.168.16[1:3].10


[group3:children]
group1
group2       #调用group1  group2

[root@ubuntu2204 ~]#ansible group1 --list
  hosts (10):
    192.168.168.5
    192.168.168.6
    192.168.168.7
    192.168.168.8
    192.168.168.9
    group2.m54-magedu,com
    group2.m55-magedu,com
[root@ubuntu2204 ~]#ansible group3 --list
  hosts (19):
    192.168.168.5
    192.168.168.6
    192.168.168.7
    192.168.168.8
    192.168.168.9
    group2.m54-magedu,com
    group2.m55-magedu,com
    192.168.161.10
    192.168.162.10
    192.168.163.10

分组别名

#在分组中定义别名
[group1]
node1 ansible_ssh_host=10.0.0.101
node2 ansible_ssh_host=10.0.0.102

[goup1:vars]
ansible_ssh_password=123456

可定义的常用配置项

ansible_ssh_host=IP|hostname    #指定远程主机,可用IP或主机名
ansible_ssh_port=PORT           #指定SSH端口
ansible_ssh_user=UNAME          #指定SSH用户名
ansible_ssh_pass=PWD            #显式指定SSH密码
ansible_sudo_pass=PWD           #显式指定SUDO密码
ansible_sudo_exe=/PATH/CMD      #sudo 命令路径(适用于1.8及以上版本)
ansible_connection=local|ssh|paramiko|docker     #与主机的连接类型
ansible_ssh_private_key_file=/PATH/FILE          #SSH私钥文件
ansible_shell_type=sh|csh|fish                   #目标系统的shell类型.默认 sh
ansible_python_interpreter=/PATH/PYTHON          #目标主机的python路径用于系统中有多个Python版本,或默认/usr/bin/python不存在

3 ansible工具

[root@ubuntu ~]# ls /usr/bin/ansible*
/usr/bin/ansible                    #主程序,ad-hoc工作模式下执行单条命令 
/usr/bin/ansible-connection         #连接插件管理工具
/usr/bin/ansible-doc                #帮助手册,查看帮助文档
/usr/bin/ansible-inventory          #用特定格式显示所有远程主机列表
/usr/bin/ansible-pull               #playbook获取工具
/usr/bin/ansible-vault              #文档加密工具
/usr/bin/ansible-config             #配置管理工具
/usr/bin/ansible-console            #互式命令行工具
/usr/bin/ansible-galaxy             #线上role管理工具
/usr/bin/ansible-playbook           #playbook 管理工具
/usr/bin/ansible-test
 
 #本质上是个python脚本文件
[root@ubuntu ~]# file /usr/bin/ansible
/usr/bin/ansible: Python script, ASCII text executable

ansible-doc 命令用法

ansible-doc 工具用来查看 ansible 文档

ansible-doc [options] [module...]
#常用选项
-h|--help #显示帮助
--version #显示版本
-l|--list #列出所有可用模块
-t|--type #指定模块类型
become|cache|callback|cliconf|connection|httpapi|inventory|lookup|
 # 
netconf|shell|vars|module|strategy|role|keyword
-s|--snippet #显示指定模块的playbook片段
-j|--json #以 json 格式显示
-v|--verbose #显示详细信息,最多可以 -vvvvvv



#统计所有模块 
ansible-doc -l       统计数量   ansible-doc -l | wc -l 

#过滤指定模块
ansible-doc -l |gerp mysql

#列出指定类型模块
ansible-doc -t shell -l

#列出指定模块帮助
ansible-doc ping -s   #查询其他模块替换ping即可

ansible-consile命令用法

ansible-console 用来交互式执行命令,支持 tab 键补齐

ansible-console
#常用子命令
help|?     #列出所子命令
cd         #切换主机组
copy       #
exit       #退出
forks      #设置并发执行数量
list       #列出被管理的所有主机
ping       #执行ping模块



#修改主机清单文件,新增
[root@ubuntu2204 ~]#vim /etc/ansible/hosts
  1 [group1]
  2 10.0.0.150
  3 10.0.0.157
  4 10.0.0.167
  5 
  6 
  7 [group2]
  8 10.0.0.164
  9 10.0.0.184
 10 ccc[1:3]linux.magedu.com
 
 # 列出所有主机
 [root@ubuntu2204 ~]#ansible-console
Welcome to the ansible console. Type help or ? to list commands.

root@all (8)[f:5]$ list
10.0.0.150
10.0.0.157
10.0.0.167
10.0.0.164
10.0.0.184
ccc1linux.magedu.com
ccc2linux.magedu.com
ccc3linux.magedu.com
root@all (8)[f:5]$ cd 10.0.0.150


#切换分组
root@10.0.0.150 (1)[f:5]$ cd group1
#查看主机
root@group1 (3)[f:5]$ list
10.0.0.150
10.0.0.157
10.0.0.167

#修改并发数,此处是临时修改,永久生效需要修改配置文件
root@all (8)[f:5]$ forks 10
root@all (8)[f:10]$ 

4 ansible命令用法

4.1ansible命令基础用法

 ansible <host-pattern> [-m module_name] [-a args]
#常用选项
-h|--help          #查看帮助
--version          #显示版本
--list-hosts       #列出远程主机,可以写成 --list
-m module          #指定模块,默认模块为command,默认模块时,可省略不写
-a|--args          #指定模块选项
-e|--extra-vars    #指定执行选项
-C|--check         #检测语句是否正确,并不立即执行
-k|--ask-pass      #提示输入ssh密码,默认用sshkey验证
-T|--timeout N     #设置命令超时时长,默认10S
-k|--ask-pass      #提示输入ssh连接密码,默认Key验证
-u|--user=UNAME    #执行远程执行的用户,默认root
-b|--become        #代替旧版的sudo实现通过sudo机制实现提升权限
--become-user=USERNAME       #指定sudo的runas用户,默认为root
-K|--ask-become-pass         #提示输入sudo时的口令
-f|--forks N       #指定并发同时执行ansible任务的主机数
-i|--inventory /PATH/FILE    #指定主机清单文件
-v|vv|vvv|vvvv|vvvvv         #显示详细执行过程

查看主机

#查看所有主机列表
[root@ubuntu2204 ~]#ansible all --list
  hosts (4):
    10.0.0.161
    10.0.0.160
    10.0.0.157
    10.0.0.153

  
  #   ansible group1 --list-hosts   查看指定组主机列表

自动添加到信任列表

#安装 apt install sshpase
#修改配置文件,自动添加目标主机到信任主机列表  
将 host_key_checking=true修改为 host_key_checking=False
root@ubuntu2204 ~]#vim /etc/ansible/ansible.cfg 

[root@ubuntu2204 ~]#ansible 10.0.0.153 -m ping -k
SSH password: 
10.0.0.153 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}



# 生成一个 socket文件

[root@ubuntu2204 ~]#rm -rf .ansible
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m ping -k
SSH password: 
10.0.0.153 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
[root@ubuntu2204 ~]#tree .ansible
.ansible
├── cp
│   └── 54e560e037   #socket文件,连接缓存,该文件有生命周期 1分钟后失效
└── tmp

#默认sshkey验证,由于有缓存的socket文件,所以可以操作成功
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m ping
10.0.0.153 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

指定主机和用户

在指定主机 #添加用户   useradd tom    修改密码   passwd tom

#指定用户要使用该用户的密码
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m ping -u tom -k
SSH password: 
10.0.0.153 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

以sudo身份运行


tom没有权限执行 ls /root
#修改目标主机配置文件
[21:04:35 root@rocky86[ ~]#vim /etc/sudoers
# Allow root to run any command
#s anywhere 
root    ALL=(ALL)       ALL
tom     ALL=(root)      NOPASSWD:ALL   #添加权限
## Allows members of the 'sys' group to run networking, software, 
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS


#再次查看成功
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m command -a"sudo ls /root" -u tom -k
SSH password: 
10.0.0.153 | CHANGED | rc=0 >>
0619.txt
0620.txt 
anaconda-ks.cfg
bash_completion
Desktop
Documents
Downloads
initial-setup-ks.cfg
Music
Pictures
Public
rocky86.cn-.log
Templates
Videos
y

并发控制

[root@ubuntu2204 ~]#ansible rocky --list
  hosts (2):
    10.0.0.157
    10.0.0.153


# 并发数为1  每次执行一台机器
[root@ubuntu2204 ~]#ansible rocky -a "sleep 2" -f1 -k
SSH password: 
10.0.0.157 | CHANGED | rc=0 >>

10.0.0.153 | CHANGED | rc=0 >>


# 并发数为2  每次执行两台机器
[root@ubuntu2204 ~]#ansible rocky -a "sleep 2" -f2 -k
SSH password: 
10.0.0.153 | CHANGED | rc=0 >>

10.0.0.157 | CHANGED | rc=0 >>


#  并发数为2  睡5秒钟 在tmp下创建一个文件
[root@ubuntu2204 ~]#ansible rocky -m shell -a"sleep 5;touch /tmp/test-1" -f2 -k
SSH password: 
10.0.0.157 | CHANGED | rc=0 >>

10.0.0.153 | CHANGED | rc=0 >>


在主机清单中定义选项

#修改配置文件
  1 [ubuntu]
  2 10.0.0.161
  3 10.0.0.160
  4 
  5 
  6 [rocky]
  7 10.0.0.157
  8 10.0.0.153
  9 
 10 
 11 [rocky:vars]
 12 ansible_ssh_password=123456  # 指定ssh密码
 13 ansible_ssh_user=tom     #指定tom用户
 14 
 15 [group1:children]
 16 ubuntu
 17 rocky

#执行id命令   不用再填写密码 并且用户为tom

[root@ubuntu2204 ~]#ansible rocky -m command -a "id"
10.0.0.153 | CHANGED | rc=0 >>
uid=3534(tom) gid=3534(tom) groups=3534(tom)
10.0.0.157 | CHANGED | rc=0 >>
uid=1001(tom) gid=1001(tom) groups=1001(tom) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

host-pattern规则

#指定开头    
[root@ubuntu ~]# ansible "10.0.0.15*" --list
 hosts (2):
    10.0.0.150
    10.0.0.157
#指定结尾
[root@ubuntu ~]# ansible "*com" --list
 hosts (3):
   node1.linux-magedu.com
   node2.linux-magedu.com
   node3.linux-magedu.com
#指定开头和结尾
[root@ubuntu ~]# ansible "node*com" --list
 hosts (3):
   node1.linux-magedu.com
   node2.linux-magedu.com
   node3.linux-magedu.com
[root@ubuntu ~]# vim /etc/ansible/hosts
[test1]
10.0.0.150
10.0.0.157
[test2]
10.0.0.184
10.0.0.157
[test3]
10.0.0.150
10.0.0.157

无法连接解决办法

#  报 错:
10.0.0.152 | UNREACHABLE! => {
    "changed": false,
    "msg": "Invalid/incorrect password: Permission denied, please try again.",   ("密码无效/不正确:拒绝权限,请重试。)
    "unreachable": true

# 查看配置文件是否修改

#vim /etc/ssh/sshd confiq找到开头 PermitRootLogin 

# 改成 PermitRootLogin yes

# 把注释消掉然后保存退出

# 再执行 systemctl restart sshd    重启sshd

# 然后敲 passwd 命令,给 root 用户设置密码

再次查看是否连接cheng'gong

5常用模块目录和查看帮助

查看帮助ansible-doc -s +模块

  # 例:  ansible-doc -s shell
  # 安装模块  ansible-galaxy collection install ansible.posix  

其他模块搜索

ansible 提供了很多其它的模块,在我们需要使用时,可以再进行查询

ansible-doc -l | grep "模块关键字"
ansible-doc 模块名

ansible常用模块

#  command模块:执行命令,但不支持管道,重定向,不具有幂等性

#  shell模块:执行命令,可以说是command的加强版,支持重定向,管道符等,但是复杂的命令可能会执行失败,比如多重管道,正则表达式等,不具有幂等性

#  script模块 可以在远程主机上面执行脚本(脚本文件可以没有权限)

#  copy模块 将ansible主机上的文件复制到远程主机,同时可以修改属主属组还有权限,具有幂等性(可以复制目录到目标主机上, 源和目标也可以都在远程主机上)

#  get_url模块 从网络上下载

#  fetch模块 从远程主机提取至ansible主控端 ,与copy相反,不支持目录

#  file模块 主要提供文件管理功能,比如创建文件和目录,修改文件和目录,设置文件权限和属性,设置 链接等

#  stat模块 用来获取目标文件的状态,对于 windows 主机,要使用 win_stat 模块

#  unarchive模块  主要用来解压缩或解包,将 ansible 主机或其它主机上的压缩包复制到指定主机,再解压到某个目录,在使用此模块时,要保证远程主机能解压对应的压缩包

#  archive模块 在远程主机上执行压缩打包命令,此模块的源和目标都在远程主机上

#  hostname模块 修改远程的主机名,修改后永久生效

#  cron模块  远程执行定时任务

#  yum模块和apt模块   远程安装

#  yum_repository模块   对远程主机上的yum仓库源进行管理

#  service模块  对远程主机上的服务进行管理

#  user模块  远程主机上进行用户管理

#  group模块 远程主机上的组管理

#  lineinfile模块 lineinfile 模块主要用于修改远程主机上的文件。ansible 提供了两个常用的文件修改模块,其中 lineinfile 主要对文件单行进行替换修改,replace 模块主要进行多行替换和修改。如果使用 ansible 调用 sed 进行文件修改时,经常会遇到需要转义的情况,而且在对特殊符号进行替换时,有可能会失败。

#  replace模块  该模块功能与 lineinfile 模块功能类似,也是基于正则匹配的模式来修改文件,但与 lineinfile 不同的是replace 模块用于多行匹配和修改

#  selinux模块  用作对远程主机的 selinux 机制进行管理

#  mount模块  用于管理远程主机的挂载

#  setup模块  此模块主要用来从远程主机上收集相关信息在 ansible 主机上显示,由于需要收集的信息较多,此模块执行较慢。

#  debug模块  此模块可以用于输出信息,并且通过 msg 定制输出的信息内容,功能类似于 echo 命令

#  sysctl模块  用来修改远程主机上的内核参数

#   pam_limits 模块   此模块主要用于管理远程主机上的资源限制

command模块 1

此模块为 ansible 默认模块,可以省略 -m 选项,该模块用来在远程主机上执行 shell 命令,但有些操作 不支持,比如管道,重定向,通配符等,如果要实现这些功能,可以用 shell 模块实现。 不具有幂等性

#常用选项
chdir=dir #执行命令前,先切换至目录dir
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行

#例:
[root@ubuntu2204 ~]#ansible ubuntu -m command -a "chdir=/tmp creates=/tmp/abc touch abc"
# 执行命令之前先切换到tmp目录   当abc文件不存在执行一个touch(创建一个abc)
  
  #romoves
  [root@ubuntu2204 ~]#ansible ubuntu -m command -a "rm -rf /tmp/abc"

shell模块 1

此模块用法和 command 模块类似,都是用来执行 shell 命令,但功能比 command 模块强大,对于在 command 模块中不支持的功能,此处均可使用。此模块也不具有幂等性。

在调用shell模块执行命令时,复杂的命令也有可能会执行失败,类似于包含多重管道,正则表达式这 些,这种情况下,我们需要写成 shell 脚本,用 copy 模块直接推送到远程执行。

#常用选项
chdir=dir #执行命令前,先切换至目录dir
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行

#支持管道
[root@ubuntu2204 ~]#ansible ubuntu -m shell -a "echo 1+2 | bc"
10.0.0.161 | CHANGED | rc=0 >>
3
10.0.0.160 | CHANGED | rc=0 >>
3


# 支持重定向   没有文件会自己创建文件
[root@ubuntu2204 ~]#ansible ubuntu -m shell -a "echo 1+2 | bc > /tmp/abc "
10.0.0.161 | CHANGED | rc=0 >>

10.0.0.160 | CHANGED | rc=0 >>

#支持多条命令
[root@ubuntu2204 ~]#ansible ubuntu -m shell -a "id;id;hostname"
10.0.0.160 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
ubuntu
10.0.0.161 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
ubuntu


#不具有幂等性
[root@ubuntu ~]# ansible 10.0.0.206 -m shell -a "mkdir dira"
10.0.0.206 | CHANGED | rc=0 >>
[root@ubuntu ~]# ansible 10.0.0.206 -m shell -a "mkdir dira"
10.0.0.206 | FAILED | rc=1 >>
mkdir: cannot create directory ‘dira’: File existsnon-zero return code

script模块 1

# 脚本
[root@ubuntu2204 ~]#vim test.sh

  1 #!/bin/bash
  2 #
  3 #****************************************************
  4 #Author:           ck
  5 #QQ:               123456
  6 #Date:             2023-07-06
  7 #FileName:         test.sh
  8 #URL:               http://www.magedu.com
  9 #Description:       test
 10 #Copyright(C):     2023 All right
 11 #***************************************************
 12 
 13 
 14 
 15 hostname -I > /tmp/ansibles-script.log       #(执行hostname -I 发送到 /tmp/ansibles-script.log 文件中)
 16 hostname -I                                  # 执行 hostname -I 命令


#执行脚本
[root@ubuntu2204 ~]#ansible ubuntu -m script -a "./test.sh"
10.0.0.161 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 10.0.0.161 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 10.0.0.161 closed."
    ],
    "stdout": "10.0.0.161 \r\n",
    "stdout_lines": [
        "10.0.0.161 "
    ]
}
10.0.0.160 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 10.0.0.160 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 10.0.0.160 closed."
    ],
    "stdout": "10.0.0.160 \r\n",
    "stdout_lines": [
        "10.0.0.160 "
    ]
}


# 查看分组ubuntu 10.0.0.160 的文件
root@ubuntu:/tmp# cat ansibles-script.log 
10.0.0.160 

copy模块 1

copy 模块将 ansible 主机上的文件复制到远程主机,此模块具有幂等性。

#常用选项
src=/path/file       #ansible主机文件路径
dest=/path/file      #远程主机文件路径
owner=UNAME          #新文件属主
group=GNAME          #新文件属组
mode=777             #新文件权限
backup=yes|no        #是否备份,默认no
content=str          #使用str生成新文件
remote_src=yes|no    #no是默认值,表示src文件在ansible主机,yes表示src文件在远程主机

#将ansible主机上的cc文件复制到目标主机的root目录下文件名叫cc.bak 属主是tom  属组是tom  文件权限是777    backup=yes 是备份  只有文件发生变化才会备份
[root@ubuntu2204 ~]#ansible ubuntu -m copy -a"src=./0706/cc dest=/root/cc.bak backup=yes mode=777 owner=tom group=tom "

root@ubuntu2204 ~]#echo "123" >> ./cc
[root@ubuntu2204 ~]#ansible ubuntu -m copy -a"src=./cc dest=/root/cc.bak backup=yes mode=777 owner=tom group=tom "

root@ubuntu:~# ls
aaa.txt  cc.bak  snap   # 文件修改前
root@ubuntu:~# ls
aaa.txt  cc.bak  cc.bak.3797.2023-07-06@07:46:19~  snap   # 文件修改后

 
 

# 源和目标都在远程主机上
[root@ubuntu2204 ~]#ansible ubuntu -m copy -a "src=/root/aaa.txt dest=/tmp/ remote_src=yes"

# 将ansible主机上面的cc文件 复制到目标主机上文件名为cc.bak    (ubuntu为目标主机)
[root@ubuntu2204 ~]#ansible ubuntu -m copy -a"src=/etc/ansible dest=/tmp/"

get_url模块

常用选项
url=http://www.a.com/b.txt #下载文件URL
dest=/tmp/c.txt #保存文件路径(绝对路径)
owner=UNAME #指定属主
group=GNAME #指定属组
mode=777 #指定权限
force=yes|no #默认yes,如果目标文件存在,则覆盖, no 表示只有目标不存在才下载
checksum="algorithm:str" #指定目标文件摘要值,下载完成后算出文件摘要再对比,确认文件是否完整
url_username=UNAME #http 认证用户名
url_password=PWD #http认证密码
validate_certs=yes|no #no表示不验证SSL证书合法性
timeout=10 #URL请求的超时时间,默认10S



# 从http://www.jose-404.com/aini.jpg 上下载图片到10.0.0.160 文件路径是/tmp/a.jpg
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m get_url -a 'url=http://www.jose-404.com/aini.jpg dest=/tmp/a.jpg'
10.0.0.160 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "checksum_dest": null,
    "checksum_src": "a025296e5a5d173e519cec5511c8f590f9e4fa33",
    "dest": "/tmp/a.jpg",
    "elapsed": 0,
    "gid": 0,
    "group": "root",
    "md5sum": "e8fee721ce6e1556e1bf93ae39c7324e",
    "mode": "0644",
    "msg": "OK (689635 bytes)",
    "owner": "root",
    "size": 689635,
    "src": "/root/.ansible/tmp/ansible-tmp-1688630788.2633946-3292-179484533638598/tmprg5cygre",
    "state": "file",
    "status_code": 200,
    "uid": 0,
    "url": "http://www.jose-404.com/aini.jpg"

fetch模块 1

#常用选项
src=/path/file #远程主机上的文件路径
fail_on_missing=yes|no #默认yes,无法获取远程主机文件时,显示失败
dest=/path #ansible主机上的保存路径,不存在会自动创建

#从目标主机 10.0.0.160和10.0.0.161主机上提取文件 000.txt 到ansible主机上 保存路径为当前目录下chen的目录中
[root@ubuntu2204 ~]#ansible "10.0.0.160 10.0.0.161" -m fetch -a "src=/root/000.txt dest=./chen/"
10.0.0.161 | CHANGED => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/root/chen/10.0.0.161/root/000.txt",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "remote_md5sum": null
}
10.0.0.160 | CHANGED => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/root/chen/10.0.0.160/root/000.txt",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "remote_md5sum": null
}


# 分开存放
[root@ubuntu2204 ~]#tree
.
├── cc
├── chen
│   ├── 10.0.0.160
│   │   └── root
│   │       └── 000.txt
│   └── 10.0.0.161
│       └── root
│           └── 000.txt

file模块

file 模块主要提供文件管理功能,比如创建文件和目录,修改文件和目录,设置文件权限和属性,设置 链接等

#常用选项
path=/path/file    #目标文件路径
owner=USER         #属主
group=GROUP        #属组
mode=777           #权限
state=file|touch|directory|link|hard|absent         #具体操作path

         “file”(文件):代表操作的目标是一个文件。

         “touch”(触摸):代表在目标位置创建一个空白的文件,如果文件已存在,则更新其最后修改时间。

         “directory”(目录):代表操作的目标是一个目录(文件夹)。

         “link”(链接):代表操作的目标是一个符号链接(软链接)。

         “hard”(硬链接):表示操作的目标是一个硬链接,即指向与源文件相同的实际文件。

         “absent”(不存在):代表从目标位置删除文件或目录,如果目标不存在,则不会报错。

recurse=yes|no                                      #yes表示递归操作,仅在 state=directory 时生效

# 在10.0.0.160主机上递归创建一个目录
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m file -a "path=/ansible/text/test state=directory"
10.0.0.160 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "root",
    "path": "/ansible/text/test",
    "size": 4096,
    "state": "directory",
    "uid": 0
}

# 创建文件
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m file -a "path=/ansible/text/test.txt state=touch owner=tom group=root mode=777"
10.0.0.160 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "dest": "/ansible/text/test.txt",
    "gid": 0,
    "group": "root",
    "mode": "0777",
    "owner": "tom",
    "size": 0,
    "state": "file",
    "uid": 1001
}

# 获取文件信息
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m file -a 'path=/ansible/text/test.txt state=file '
10.0.0.160 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "gid": 0,
    "group": "root",
    "mode": "0777",
    "owner": "tom",
    "path": "/ansible/text/test.txt",
    "size": 0,
    "state": "file",
    "uid": 1001
}

#链接文件可以用dest|path|name 来指定
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m file -a "src=/ansible/text/test.txt dest=/ansible/text/test/test.link state=link owner=tom group=tom"
10.0.0.160 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "dest": "/ansible/text/test/test.link",
    "gid": 0,
    "group": "root",
    "mode": "0777",
    "owner": "root",
    "size": 22,
    "src": "/ansible/text/test.txt",
    "state": "link",
    "uid": 0
}


#递归删除目录
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m file -a "path=/root/ansible/text/ state=absent"
10.0.0.160 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "path": "/ansible/text/",
    "state": "absent"
}

stat模块

stat 模块用来获取目标文件的状态,对于 windows 主机,要使用 win_stat 模块

#常用选项
path=/path/file #指定目标文件路径
follow=true|false #是否跟随链接,默认 false,不跟随

# 文件存在
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m stat -a "path=/etc/issue"
10.0.0.160 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "stat": {
        "atime": 1688607734.4439998,
        "attr_flags": "e",
        "attributes": [
            "extents"
        ],
        "block_size": 4096,
        "blocks": 8,
        "charset": "us-ascii",
        "checksum": "885858c5f069d990788e0df1719920326aeed634",
        "ctime": 1686014263.555828,
        "dev": 64768,
        "device_type": 0,
        "executable": false,
        "exists": true,
        "gid": 0,
        "gr_name": "root",
        "inode": 2622121,
        "isblk": false,
        "ischr": false,
        "isdir": false,
        "isfifo": false,
        "isgid": false,
        "islnk": false,
        "isreg": true,
        "issock": false,
        "isuid": false,
        "mimetype": "text/plain",
        "mode": "0644",
        "mtime": 1676563352.0,
        "nlink": 1,
        "path": "/etc/issue",
        "pw_name": "root",
        "readable": true,
        "rgrp": true,
        "roth": true,
        "rusr": true,
        "size": 26,
        "uid": 0,
        "version": "2235086703",
        "wgrp": false,
        "woth": false,
        "writeable": true,
        "wusr": true,
        "xgrp": false,
        "xoth": false,
        "xusr": false
    }
}


#文件不存在
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m stat -a "path=/etc/abcd"
10.0.0.160 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "stat": {
        "exists": false
    }
}

unarchive模块 1

#查看帮助
[root@ubuntu ~]# ansible-doc -s unarchive
#常用选项
src=/path/file                 #包文件路径,可以是ansible主机上的包文件,也可以是远程主机上的文件
(也可以是第三方主机)
dest=/pth/dir                  #目标路径
remote_src=yes|no              #yes表示包文件在远程主机或第三方主机上,no表示包文件在ansible主机
上,默认值为no
copy=yes|no                    #yes表示包文件在ansible主机上,no表示包文件在远程主机或第三方主机
上,己废弃
creates=/path/file             #此文件不存在才执行
mode=777                       #设置目标权限
owner=USER                     #设置目标属主
group=GROUP                    #设置目标属组

#将/etc/ansible文件 拷贝到当前目录下
[root@ubuntu2204 ~]#cp -r /etc/ansible ./
[root@ubuntu2204 ~]#ls
ansible  dira.tar.gz  qwe.txt  snap  test.sh

# 压缩
[root@ubuntu2204 ~]#tar -cvf /tmp/ansible.tar ansible  (要压缩的路径为/tmp/ansible.tar 要压缩的包是ansible 要压缩的路径是/tmp/ansible.tar)

#将ansible主机上的压缩包解压至远程主机,远程目标必须存在
[root@ubuntu2204 tmp]#ansible 10.0.0.160 -m unarchive -a "src=/root/ansible.tar dest=/root owner=tom"
10.0.0.160 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "dest": "/root",
    "extract_results": {
        "cmd": [
            "/usr/bin/tar",
            "--extract",
            "-C",
            "/root",
            "--owner=tom",
            "-f",
            "/root/.ansible/tmp/ansible-tmp-1688647233.157563-6027-190205531788187/source"
        ],
        "err": "",
        "out": "",
        "rc": 0
    },
    "gid": 0,
    "group": "root",
    "handler": "TarArchive",
    "mode": "0700",
    "owner": "root",
    "size": 4096,
    "src": "/root/.ansible/tmp/ansible-tmp-1688647233.157563-6027-190205531788187/source",
    "state": "directory",
    "uid": 0
}

#查看10.0.0.160主机,已完成解包
root@ubuntu:~# ls
000.txt  aaa.txt  ansible  cc.bak  cc.bak.3797.2023-07-06@07:46:19~  snap
root@ubuntu:~# cd ansible
root@ubuntu:~/ansible# ls
ansible.cfg  hosts  roles

#将第三方包解压缩到指定主机
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m unarchive -a "src=http://www.jose-404.com/web-dir.tar dest=/tmp remote_src=yes mode=777"
10.0.0.160 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "dest": "/tmp",
    "extract_results": {
        "cmd": [
            "/usr/bin/tar",
            "--extract",
            "-C",
            "/tmp",
            "-f",
            "/root/.ansible/tmp/ansible-tmp-1688648286.5569296-6187-227155230225367/web-dir0qjjsbbx.tar"
        ],
        "err": "",
        "out": "",
        "rc": 0
    },
    "gid": 0,
    "group": "root",
    "handler": "TarArchive",
    "mode": "01777",
    "owner": "root",
    "size": 4096,
    "src": "/root/.ansible/tmp/ansible-tmp-1688648286.5569296-6187-227155230225367/web-dir0qjjsbbx.tar",
    "state": "directory",
    "uid": 0
}

archive模块 1

# 在远程主机上执行压缩打包命令,此模块的源和目标都在远程主机上

#常用选项
path=/path/dir         #源目录或文件路径
dest=/pth/file         #目标的文件路径
remove=false|true      #是否删除源文件,默认 false
mode=777               #设置目标权限
owner=USER             #设置目标属主
group=GROUP            #设置目标属组
format=bz2|gz|tar|xz|zip    #指定压缩算法,默认 gz


# 保留源文件
[root@ubuntu2204 ~]#ansible ubuntu -m archive -a"path=/root/ansible/ dest=/tmp/dira.bz2 format=bz2 mode=600"
10.0.0.161 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "archived": [],
    "arcroot": "/root/ansible/",
    "changed": false,
    "dest": "/tmp/dira.bz2",
    "dest_state": "absent",
    "expanded_exclude_paths": [],
    "expanded_paths": [
        "/root/ansible/"
    ],
    "missing": [
        "/root/ansible/"
    ]
}
10.0.0.160 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "archived": [
        "/root/ansible/roles",
        "/root/ansible/hosts",
        "/root/ansible/ansible.cfg"
    ],
    "arcroot": "/root/ansible/",
    "changed": true,
    "dest": "/tmp/dira.bz2",
    "dest_state": "archive",
    "expanded_exclude_paths": [],
    "expanded_paths": [
        "/root/ansible/"
    ],
    "gid": 0,
    "group": "root",
    "missing": [],
    "mode": "0600",
    "owner": "root",
    "size": 14740,
    "state": "file",
    "uid": 0
}


#不保留源目录
[root@ubuntu ~]# [root@ubuntu2204 ~]#ansible ubuntu -m archive -a"path=/root/ansible/ dest=/tmp/dira.zip format=zip remove=true"

hostname模块

修改远程的主机名,修改后永久生效
[root@ubuntu2204 ~]#ansible ubuntu -m hostname -a "name=ubuntu2204"
10.0.0.161 | CHANGED => {
    "ansible_facts": {
        "ansible_domain": "0.0.161",
        "ansible_fqdn": "10.0.0.161",
        "ansible_hostname": "ubuntu2204",
        "ansible_nodename": "ubuntu2204",
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "name": "ubuntu2204"
}
10.0.0.160 | CHANGED => {
    "ansible_facts": {
        "ansible_domain": "0.0.160",
        "ansible_fqdn": "10.0.0.160",
        "ansible_hostname": "ubuntu2204",
        "ansible_nodename": "ubuntu2204",
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "name": "ubuntu2204"
}

cron模块




#常用选项
name=str                #任务名称
job=/path/cmd args      #具体任务命令
disabled=yes|no         #是否禁用,默认 false
state=absent|present    #absent 删除,默认present 
env=yes|no              #yes设置环境变量,no 设置定时任务,默认 no
special_time=annually|daily|hourly|monthly|reboot|weekly|yearly       #指定特殊时间
user=UNAME              #指定任务用户
minute=                 #指定分钟参数
hour=                   #小时参数
day=                    #自然天参数
month=                  #自然月参数 
weekday=                #星期参数

#创建任务
ansible 10.0.0.206 -m cron -a 'job="/usr/bin/wall test-crontab" name=test-crontab'

#指定时间
[root@ubuntu ~]# ansible 10.0.0.206 -m cron -a 'job="/usr/bin/wall test-crontab2" minute=*/5 hour=12 day=10,20,30 month=3,4,5 weekday=1-5 name=test-crontab2'



yum模块和apt模块

yum 模块和 apt 模块用于在远程主机上管理软件包,yum 模块适用于 redhat 系列,apt 适用于 debian 系列

yum模块

#常用选项
name=packagename                                 #指定包名 name1,name2
state=absent|installed|latest|present|removed    #absent|removed 删除,installed|present 安装,latest 升级到最新版
list=packagename|installed|updates|available|repos       #此选项与name选项互斥,
                                                         #写具体包名是相当于执行 yum list --showduplicates packagename
download_dir=/path         #指定下载目录
download_only=yes|no       #只下载不安装,默认 no
update_only=yes|no         #yes 仅更新,默认no
use_backend=auto|yum|yum4|dnf       #指定真实执行的命令,默认 auto
autoremove=yes|no          #卸载依赖,仅在卸载时生效,默认no
disablerepo=repoid         #排除某些仓库 repoid1,repoid2
enablerepo=repoid          #从指定仓库中安装 repoid1,repoid2
validate_certs=yes|no      #是否对包进行校验,默认yes
disable_gpg_check=yes|no   #是否不对包进行校验,默认no
update_only=yes|no         #只更新不安装,默认no


#列出指定软件包
[root@ubuntu2204 ~]#ansible rocky -m yum -a "list=nginx"

#卸载
[root@ubuntu2204 ~]#ansible rocky -m yum -a'name=sos state=removed' -k

#指定源安装
[root@ubuntu2204 ~]#ansible rocky -m yum -a'name=sos enablerepo=baseos' -k

apt模块

#常用选项
name=packagename #指定包名,可用通配符
autoclean=yes|no #清除本地安装包,只删除己卸载的软件的 deb包
deb=/path/file.deb #指定deb包,可以是本地的,也可以是网络的
autoremove=yes|no #卸载依赖包,默认no
only_upgrade=yes|no #仅更新,不安装
state=absent|build-dep|latest|present|fixed #absent 卸载,build-dep 安装依赖包, 
latest 安装或升级到最新版
 #present 安装,fixed 修复
update_cache=yes|no #更新索引


#安装
[root@ubuntu2204 ~]#ansible ubuntu -m apt -a "name=nginx state=present"
#卸载
[root@ubuntu2204 ~]#ansible ubuntu -m apt -a "name=nginx state=absent"

yum_repository 模块

此模块用来对远程主机上的 yum 仓库配置进行管理

#常用选项
name=repoid                    #repoid
description=desc               #描述信息
baseurl=url                    #仓库地址
enabled=yes|no                 #是否启用
gpgcheck=yes|no                #是否启用gpgcheck,没有默认值,默认跟随 /etc/yum.conf 中的全局配置
gpgkey=/path/key               #gpgkey路径
state=absent|present           #absent删除, present安装,默认present
timeout=30                     #超时时长,默认30s

# 添加yum源
[root@ubuntu2204 ~]#ansible group1 -m yum_repository -a 'name=nginx description=nginx-desc baseurl="http://nginx.org/packages/centos/$releasever/$basearch/"gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key'

#删除
[root@ubuntu2204 ~]#ansible rocky -m yum_repository -a'name=nginx state=absent'

service模块

#常用选项
name=servicename                             #服务名
enabled=yes|no                               #是否是开机启动
state=reloaded|restarted|started|stopped     #具体操作
      "reloaded"表示重新加载或重新装填,通常用于描述重新加载一个程序、网页或游戏等。

      "restarted"表示重新启动,通常用于描述重新启动计算机、服务器或设备等。

      "started"表示开始或启动,通常用于描述开始某个活动、进程或任务等。

      "stopped"表示停止或结束,通常用于描述停止某个活动、进程或任务等
args=val                                     #参数

# 启动服务
[root@ubuntu2204 ~]#ansible group1 -m service -a "name=nginx state=started"

# 重载
[root@ubuntu2204 ~]#ansible group1 -m service -a "name=nginx state=reloaded"
# 远程主机上查看
systemctl in-enabled nginx
# 加开机启动
[root@ubuntu2204 ~]#ansible group1 -m service -a 'name=nginx enabled=yes'

user模块

#常用选项
name=USERNAME               #指定用户名
comment=str                 #用户描述信息
create_home=yes|no          #是否创建家目录,默认yes
group=GROUPNAME             #指定私有组
groups=group1,group2...     #指定附加组
home=/path                  #指定家目录路径
shell=SHELL                 #指定shell
password=str                #设置密码,必须是加密后的字符串
state=absent|present        #absent 删除用户,present 创建用户,默认 present 
system=yes|no               #是否创建系统账号,默认 no
uid=UID                     #手动指定uid
umask=UMASK                 #指定umask
remove=yes|no               #是否删除家目录,默认 no
generate_ssh_key=yes|no     #是否创建私钥,默认 no
ssh_key_bits=2048           #指定私钥位数
ssh_key_file=/path/file     #指定文件位置,默认 .ssh/id_rsa


# 创建用户
[root@ubuntu2204 ~]#ansible ubuntu -m user -a 'name=user1 comment="ansible user" uid=2048 home=/user1/'
# 在远程主机上查看
root@ubuntu2204:~# id user1
uid=2048(user1) gid=2048(user1) groups=2048(user1)

root@ubuntu2204:~# getent passwd user1
user1:x:2048:2048:ansible user:/user1/:/bin/sh

# 生成密码
[root@ubuntu ~]# openssl passwd -6 123456
$6$yaZYTO7B1gnMCfoK$MmKbbYKOX2c7Cx8mXBLSp1JGYbr6ZNTq0qAymnbU4dbTvLcuRmyOL5GPKSLpuYxDl2Ir7rkNr4gnuSlC0KSi10

# 创建系统用户,不创建家目录,指定shell,指定组,指定密码,组要先存在
[root@ubuntu2204 ~]#ansible ubuntu -m user -a 'name=user2 comment="ansible user" system=yes create_home=no shell=/sbin/nologin/ group=ga password="$6$yaZYTO7B1gnMCfoK$MmKbbYKOX2c7Cx8mXBLSp1JGYbr6ZNTq0qAymnbU4dbTvLcuRmyOL5GPKSLpuYxDl2Ir7rkNr4gnuSlC0KSi10"'

#创建用户生成密钥
[root@ubuntu ~]# ansible ubuntu -m user -a 'name=user3 generate_ssh_key=yes ssh_key_bits=2048'

#  删除用户
[root@ubuntu2204 ~]#ansible ubuntu -m user -a "name=user1 remove=yes state=absent"

group模块

#常用选项
name=GROUPNAME          #指定组名
gid=GID                 #指定组ID
state=absent|present    #absent 删除,present 创建,默认present
system=yes|no           #是否是系统组,默认no

# 创建普通组
[root@ubuntu2204 ~]#ansible ubuntu -m group -a 'name=ga gid=1024'
# 创建系统组
[root@ubuntu2204 ~]#ansible ubuntu -m group -a 'name=gb gid=888 system=yes'
# 删除组
[root@ubuntu2204 ~]#ansible ubuntu -m group -a "name=gb state=absent"

lineinfile模块

#常用模块
path=/path/file                       #远程主机文件路径
regexp=                               #正则,用来锚定要被修改的内容
insertafter=                          #正则,在指定内容后的新行中增加line里面的内容,与regex同时使用时,只有regex没匹配才生效
insertbefore=                         #正则,在指定内容前的新行中增加line里面的内容,与regex同时使用时,只有regex没匹配才生效
line=str                              #修改后的内容
state=absent|present                  #absent 删除,present 不存在先创建
backup=yes|no                         #修改前先备份,默认no
create=yes|no                         #不存在先创建,默认no
backrefs=yes|no                       #是否支持引用,默认no不支持
mode=666                              #置权限
owner=USER                            #指定属主
group=GROUP                           #指定属组


#使用 regexp 配合正则表达式来锚定要被修改的内容时,如果有多行被匹配,则只有最后一行会被替换,如果删除,则匹配到的行都会被删除


#替换以a开头的最后一行为AA
[root@ubuntu2204 ~]#ansible ubuntu -m lineinfile -a'path=/root/a.txt regexp="^a" line="AA"'
root@ubuntu2204:~# cat a.txt 
123---123
321---321
12345
a# bcd
# abc
# aaa
bbb
ccc
a
a
a
a
a
AA
TOM
bb
cc

#往最后一行追加一行内容  内容为abcdefg
[root@ubuntu2204 ~]#ansible ubuntu -m lineinfile -a 'path=/root/a.txt line="abcdefg"'
root@ubuntu2204:~# cat a.txt 
123---123
321---321
12345
a# bcd
# abc
# aaa
bbb
ccc
a
a
a
a
a
AA
TOM
bb
cc

abcdefg


#在最后一行123后面插入新行  内容是AAAAAAa
[root@ubuntu2204 ~]#ansible ubuntu -m lineinfile -a 'path=/root/a.txt insertafter="^123$" line="AAAAAAa"'
root@ubuntu2204:~# cat a.txt 
123
AAAAAAa
321
12345
a# bcd
# abc
# aaa

#在最后一个123开头的行上面插入新行 内容为BBBBBB
[root@ubuntu2204 ~]#ansible ubuntu -m lineinfile -a 'path=/root/a.txt insertbefore="^123" line="BBBBBB"'





#修改之前内容
[root@ubuntu2204 ~]#cat a.txt 

TOM
bb
cc

abcdefg
12i
AAAAAA

123
123123
123
123
123

abc

#删除所有以123开头的行 并且备份
[root@ubuntu2204 ~]#ansible ubuntu -m lineinfile -a 'path=/root/a.txt regexp="^123" backup=yes state=absent'
#备份
#[root@ubuntu2204 ~]#ls
 a.txt  a.txt.2687.2023-07-08@07:51:48~
#内容已修改
#[root@ubuntu2204 ~]#cat a.txt 

TOM
bb
cc

abcdefg
12i
AAAAAA


abc




replace模块

#常用选项
path=/path/file     #远程主机文件路径
regexp=             #正则,用来锚定要被修改的内容
replace=STR         #用来替换的内容
after=STR           #从STR之后开始处理
before=STR          #处理到STR之前
backup=yes|no       #修改前是否备份,默认 no
mode=666            #设置权限
owner=USER          #指定属主
group=GROUP         #指定属组

# 将ansible主机中的文件test.txt 发送到ubuntu组中 文件名为a.txt 属主属组是root 文件权限是 rwxrwxrwx
[root@ubuntu2204 ~]#ansible ubuntu -m copy -a"src=./test.txt dest=/root/a.txt backup=yes mode=777 owner=root group=root "^C


#替换所有3个数字的行
#\1---\1后向引用 引用两次 
[root@ubuntu2204 ~]#ansible ubuntu -m replace -a "path=/root/a.txt regexp='^([0-9]{3})$' replace='\1---\1' backup=yes"
root@ubuntu2204:~# cat a.txt 
123---123
321---321

#只处理ccc和cc中间的行 .+任意字符匹配一次或多次  replace='# \1'替换的内容是 # \1是后向引用
[root@ubuntu2204 ~]#ansible ubuntu -m replace -a"path=/root/a.txt after='ccc' before='cc' regexp='^(.+)$' replace='# \1'"
root@ubuntu2204:~# cat a.txt 
123---123
321---321
12345
a# bcd
# abc
# aaa
bbb
ccc
# a
# a
# a
# a
# a
# a
# a
# bb
cc

selinux模块

#安装
[root@ubuntu ~]# ansible-galaxy collection install ansible.posix
#常用选项
configfile=/path/file #selinux 配置文件路径,默认
/etc/selinux/config
policy=targeted|minimum|mls #在state值不为 disabled 时必选
state=disabled|enforcing|permissive #具体设置

reboot模块

#常用选项
msg=str                    #广播重启提示消息,默认为空
test_command=str           #重启后执行验证命令,默认 whoami
reboot_timeout=600         #超时时长,默认600S
pre_reboot_delay=0         #执行重启前等待时长,如果小于60S,此字段会被置0,也就是无效
post_reboot_delay=0        #重启后等待一个时长后再验证是否重启完成

#远程主机在重启过程中此进程会一直等待,直到超时
[root@ubuntu2204 ~]#ansible "ubuntu" -m reboot -a 'pre_reboot_delay=65 msg="this is test msg"'


#远程主机上收到广播消息
this is test msg
The system is going down for reboot at Sun 2023-02-05 13:48:10 CST!

mount模块

#常用选项
src=/path/device #要挂载的设备路径,可以是网络地址
path=/path/point #挂载点
state=absent|mounted|present|unmounted|remounted  
       # absent 取消挂载,并删除永久挂载中的配置
       # mounted 永久挂载,立即生效,挂载点不存在会自动创建
       # present 永久挂载,写配置文件,但不会立即生效
       # unmounted 临时取消挂载,不改变配置文件
       # remounted 重新挂载,但不会改变配置文件
fstab=/path/file #指定挂载配置文件路径,默认 /etc/fstab
fstype=str #设备文件系统 xfs|ext4|swap|iso9660...
opts=str #挂载选项

# 挂载光盘,永久挂载,立即生效
[root@ubuntu2204 ~]#ansible ubuntu -m mount -a 'src=/dev/sr0 path=/mnt/ state=mounted fstype=iso9660'

# 临时取消挂载
[root@ubuntu2204 ~]# ansible ubuntu -m mount -a 'src=/dev/sr0 path=/mnt/ state=unmounted'

# 取消挂载,永久生效
[root@ubuntu2204 ~]#ansible ubuntu -m mount -a 'src=/dev/sr0 path=/mnt/ state=absent'

setup模块 1

#常用选项
filter=filed1,filed2 #只显示指定字段,可以用通配符,可以写多个,可以用 !取反
gather_timeout=10 #超时时长,默认10S

#显示本机所有信息
[root@ubuntu2204 ~]#ansible 127.0.0.1 -m setup

#收集所有字段
 ansible 10.0.0.153 -m setup
 
# 只显示主机名
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m setup -a 'filter=ansible_hostname'
10.0.0.153 | SUCCESS => {
    "ansible_facts": {
        "ansible_hostname": "rocky86",
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false
}

# 显示主机名和IPV4
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m setup -a 'filter=ansible_hostname,all_ipv4_addresses'
10.0.0.153 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.0.0.153",
            "10.0.0.110"
        ],
        "ansible_hostname": "rocky86",
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false
}

debug模块

#常用选项
msg=str #输出消息内容,默认 Hello world!
var=val #指定变量名,和 msg 互斥
verbosity=0|1|2|3 #指定调试级别,verbosity=2 则表示仅在 -vv|-vvv|-vvvv 的级别下显示

#默认消息
[root@ubuntu ~]# ansible 10.0.0.206 -m debug
10.0.0.206 | SUCCESS => {
    "msg": "Hello world!"
}

#设定了运行级别,当前跳过
[root@ubuntu ~]# ansible 10.0.0.206 -m debug -a 'msg="this is test msg" (这是一条测试消息) 
verbosity=2'
10.0.0.206 | SKIPPED

#可以正常显示
[root@ubuntu ~]# ansible 10.0.0.206 -m debug -a 'msg="this is test msg" 
verbosity=2' -vv
......

sysctl模块

#常用选项
name=str                 #参数名称
val=str                  #参数值
reload=yes|no            #默认yes,调用 /sbin/sysctl -p 生效
state=present|absent     #是否保存到文件,默认present
sysctl_file=/path/file   #指定保存文件路径,默认 /etc/sysctl.conf
sysctl_set=yes|no        #是否使用systctl -w 校验,默认no

#修改内核参数,并写文件
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m sysctl -a 'name=net.ipv4.ip_forward value=1'
查看之后内核已经修改
[15:30:58 root@rocky86[ ~]#sysctl -a | grep "ip_forward ="
net.ipv4.ip_forward = 1
[17:12:58 root@rocky86[ ~]#cat /etc/sysctl.conf | grep ip_forward
net.ipv4.ip_forward=1


#从文件中删除
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m sysctl -a 'name=net.ipv4.ip_forward state=absent'
#再次查看文件已经删除,但是值没发生变化。 
[17:16:01 root@rocky86[ ~]#ansible cat /etc/sysctl.conf | grep ip_forward
[17:17:29 root@rocky86[ ~]#
#重启之后再次查看
[17:25:36 root@rocky86[ ~]#sysctl -a | grep "ip_forward ="
net.ipv4.ip_forward = 0

pam_limits 模块

#常用选项
domain=username|@groupname|UID|GID      #具体对象
limit_item=core|data|fsize|memlock|nofile|rss|stack|cpu|nproc|as|maxlogins|maxsyslogins|priority|locks|sigpending|msgqueue|nice|rtprio|chroot #修改内容
limit_type=hard|soft|- #限定类型    硬件|软件
value=str #具体值

#范例:
ansible 10.0.0.206 -m pam_limits -a 'domain=tom limit_type=- limit_item=nproc value=200'

# cat /etc/security/limits.conf | grep tom

apt_repository 模块

#常用选项
repo=str             #具体源
filename=/path/file  #具体文件名,默认加到 /etc/apt/sources.list 中
state=absent|present #absent 删除,present 新增,默认 present
update_cache=yes|no  #yes 更新源,相当于执行 apt-get update

apt_key 模块

#常用选项
url=URL                 #key文件路径
validate_certs=yes|no   #是否校验https 的 ssl 证书,默认yes
state=absent|present    #absent 删除,present 新增,默认 present

6 ansible中的Playbook

YAML 语言语法

  • 在单一文件第一行,用连续三个连字号 "-" 开始,还有选择性的连续三个点号( ... )用来表示文件的 结尾
  • 次行开始正常写 Playbook 的内容,一般建议写明该 Playbook 的功能
  • 使用#号注释代码
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换 行来实现的
  • 缩进不支持 tab,必须使用空格进行缩进
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • YAML文件内容是区别大小写的,key/value 的值均需大小写敏感
  • 多个 key/value 可同行写也可换行写,同行使用,分隔
  • key 后面冒号要加一个空格 比如 key: value
  • value 可是个字符串,也可是另一个列表
  • YAML 文件扩展名通常为 yml 或 yaml

playbook的构成

image-20230711115407979

#hosts 必须是己在主机清单中定义的主机或IP
- hosts: 10.0.0.206 #IP写法
- hosts: node.linux-magedu.com #主机名写法
- hosts: group1 #分组写法
- hosts: group1:group2 #分组写法,或者关系,两个分组并集
- hosts: group1:&group2 #分组写法,与关系,两个分组交集
- hosts: group1:!group2 #分组写法,非关系,两个分组差集
#remote_user 可以全局指定,也可以在特定 task 中指定,默认是在远程主机上以 root 身份执行,默认
不写此项,切换用户执行需要先完成登录校验或者用 -k 选项手动输入ssh 密码
- hosts: group1 #指定主机分组
 gather_facts: no #不收集主机信息
 remote_user: tom #远程执行用户
 tasks: #task 列表
   - name: task1 #task 名称,此 task 以 tom 身份认行
     shell: id #具体执行的模块 和参数
    
   - name: task2 #task 名称,此 task 以 jerry 身份连接主机执行
     shell: id #具体执行的模块 和参数     
     remote_user: jerry 
      
   - name: task3 #task 名称,此 task 以 jerry 身份运行 sudo 到
root 执行
     shell: id #具体执行的模块 和参数     
     remote_user: jerry 
     sudo: yes
      
   - name: task4 #task 名称,此 task 以 jerry 身份运行 sudo 到
tom 执行
     shell: id #具体执行的模块 和参数     
     remote_user: jerry 
     sudo: yes   
     sudo_user: tom
#task 两种定义方式
#action: module arguments
#module: arguments
#如果是 shell 模块或 command 模块,后面是跟命令,而不是 key=val 写法
- hosts: group1 #指定主机分组
 gather_facts: no #不收集主机信息
 tasks: #task 列表
    - name: task1 #task 名称
     action: shell id #具体执行的模块和参数,执行shell 模块,参数是id
 - name: task2 #task 名称
 command: id #具体执行的模块和参数,执行 command 模块,参数是 id
- name: task3 #task 名称
     debug: msg="task3" #非 shell,非 command 模块,后面是 key=val 格式

playbook命令

ansible-playbook <filename.yml> ... [options]
#常用选项
--syntax-check|--syntax #语法检查

-C|--check #模拟执行,只检测可能会发生的改变,但不真正执行操作
                             [root@ubuntu2204 0710]#ansible-playbook -C ping.yaml

-i|--inventory|--inventory-file #指定主机清单文件

-l|--limit #单独指定主机列表去执行
                             [root@ubuntu2204 0710]#ansible-playbook -l “10.0.0.161 10.0.0.160” ping.yaml

-k|--ask-pass #远程连接密码
-T|--timeout #连接超时时长,默认10S
-e|--extra-vars #定义变量
--become-user #以指定用户执行
--flush-cache #刷新facts
--list-hosts #列出所有主机
                            [root@ubuntu2204 0710]#ansible-playbook ping.yaml --list-hosts

playbook: ping.yaml

  play #1 (ubuntu): ubuntu	TAGS: []
    pattern: ['ubuntu']
    hosts (2):
      10.0.0.161
      10.0.0.160

--list-tags #列出playbook中所有 tag
-skip-tags #跳过指定的tags
-t|--tags #只执行特定tag对应的task
--start-at-task #从指定task开始执行
--list-tasks #列出plabook中所有 task
-v--verbose #显示详细信息,最多可以写 vvvvv

ansible-playbook执行结果

0.0.0.150 : ok=3    changed=3    unreachable=0    failed=0    skipped=0   
rescued=0    ignored=0   
10.0.0.206 : ok=3    changed=3    unreachable=0    failed=0    skipped=0   
rescued=0    ignored=0
#OK=3 #3个task 执行成功
#change=3 #3个task 都导致了系统状态发生了改变,如果是查询类task,可以在playbook文件中加上 changed_when:false
#unreachable=0 #0个task不可达
#failed=0 #0个task执行失败
#skipped=0 #跳过0个task
#rescued=0 #0个task被拒绝执行
#ignored=0 #忽略0个task
下面是一个基本的Ansible Playbook示例,其中包含两个任务:安装Nginx服务器和启动Nginx服务。

---
- name: Install and start Nginx
  hosts: web_servers
  become: yes
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present

    - name: Start Nginx service
      service:
        name: nginx
        state: started
在上面的示例中,Playbook以YAML格式编写,并使用以下几个关键字:

name:用于给Playbook或任务命名,方便阅读和理解。
hosts:指定要在哪些主机上执行任务。这里使用了web_servers,你可以在Ansible的主机清单文件中定义这个名称,并将其映射到一组实际的主机地址。
become:用于指定是否切换为超级用户(例如root)执行任务。

tasks:指定要执行的任务列表。在这个示例中,有两个任务:安装Nginx和启动Nginx服务。

apt:这是Ansible的apt模块,用于在Debian或Ubuntu系统上安装软件包。
name参数指定要安装的软件包名称,
state参数指定软件包的状态(在此处是present,表示确保软件包已安装)。

service:这是Ansible的service模块,用于管理系统服务。在这个示例中,
name参数指定要管理的服务名称(这里是Nginx),
state参数指定服务的状态(在此处是started,表示启动服务)。
posted on   0918  阅读(75)  评论(1编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示