ansible

# Ansible常用模块

## command模块(Ansible默认模块)
> command 模块可以帮助我们在远程主机上执行命令。
> 注意:使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理,在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如”<”, “>”, “|”, “;” 和 “&” 这些符号,如果你需要这些功能,可以参考后面介绍的 shell 模块。

### 参数
- Chdir:执行命令前,切换到目录。
- Creates:当该文件存在时,则不执行该步骤。
- Removes:当该文件存在时,则执行该步骤。

### 案例
```bash
[root@localhost ~]# ansible web01 -m command -a "chdir=/opt ls"
172.16.1.101 | CHANGED | rc=0 >>
phpMyAdmin-5.1.1-all-languages
[root@localhost ~]# ansible web01 -m command -a "chdir=/opt creates=/opt/phpMyAdmin-5.1.1-all-languages ls"
172.16.1.101 | SUCCESS | rc=0 >>
skipped, since /opt/phpMyAdmin-5.1.1-all-languages exists
[root@localhost ~]# ansible web01 -m command -a "chdir=/opt creates=/opt/phpMyAdmin-5.1.1-all-languages mkdir test"
172.16.1.101 | SUCCESS | rc=0 >>
skipped, since /opt/phpMyAdmin-5.1.1-all-languages exists
```

### 缺点

不支持特殊字符。

## shell模块

> shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 `/bin/sh` 程序处理。

### 参数

- Chdir:执行命令前,切换到目录。
- Creates:当该文件存在时,则不执行该步骤。
- Removes:当该文件不存在时,则不执行该步骤。
- executable参数:默认情况下,shell 模块会调用远程主机中的 /bin/sh 去执行对应的命令,通常情况下,远程主机中的默认 shell 都是 bash。如果你想要使用其他类型的 shell 执行命令,则可以使用此参数指定某种类型的 shell 去执行对应的命令。指定 shell 文件时,需要使用绝对路径。

### 案例

```bash
[root@localhost ~]# ansible web01 -m shell -a "chdir=/opt ls"
172.16.1.101 | CHANGED | rc=0 >>
phpMyAdmin-5.1.1-all-languages
test
[root@master ~]# ansible web -m shell -a "executable=/bin/sh ps -ef | awk '{print \$1}'"
```

## script模块

> script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。

### 参数

- Chdir:执行命令前,切换到目录。
- Creates:当该文件存在时,则不执行该步骤。
- Removes:当该文件存在时,则执行该步骤。

### 案例

```bash
[root@localhost ~]# ansible web01 -m script -a "chdir=/opt ./test.sh"
172.16.1.101 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.16.1.101 closed.\r\n",
"stderr_lines": [
"Shared connection to 172.16.1.101 closed."
],
"stdout": "total 4\r\ndrwxr-xr-x. 4 root root 56 Aug 26 23:37 .\r\ndr-xr-xr-x. 17 root root 224 Aug 21 19:09 ..\r\ndrwxrwxrwx. 13 nginx nginx 4096 Aug 22 20:17 phpMyAdmin-5.1.1-all-languages\r\ndrwxr-xr-x. 2 root root 6 Aug 26 23:37 test\r\n",
"stdout_lines": [
"total 4",
"drwxr-xr-x. 4 root root 56 Aug 26 23:37 .",
"dr-xr-xr-x. 17 root root 224 Aug 21 19:09 ..",
"drwxrwxrwx. 13 nginx nginx 4096 Aug 22 20:17 phpMyAdmin-5.1.1-all-languages",
"drwxr-xr-x. 2 root root 6 Aug 26 23:37 test"
]
}
```

## yum模块

> yum 模块可以帮助我们在远程主机上通过 yum 源管理软件包。

### 参数

- **name参数:**必须参数,用于指定需要管理的软件包,比如 nginx。
- **state参数**:用于指定软件包的状态 ,默认值为present。
- present:表示确保软件包已经安装。
- installed 与present 等效
- latest 表示安装 yum 中最新的版本
- absent 和 removed 等效,表示删除对应的软件包。
- **disable_gpg_check参数:**用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。
- **enablerepo参数:**用于指定安装软件包时临时启用的 yum 源。
- **disablerepo参数:**用于指定安装软件包时临时禁用的 yum 源。

### 案例

```bash
ansible ansible-demo3 -m yum -a 'name=nginx disable_gpg_check=yes'
ansible ansible-demo3 -m yum -a 'name=nginx state=present disable_gpg_check=yes'
ansible ansible-demo3 -m yum -a 'name=nginx state=installed disable_gpg_check=yes'

ansible ansible-demo3 -m yum -a 'name=nginx state=latest disable_gpg_check=yes'

ansible ansible-demo3 -m yum -a 'name=nginx state=absent'
ansible ansible-demo3 -m yum -a 'name=nginx state=removed'

ansible ansible-demo3 -m yum -a 'name=telnet disable_gpg_check=yes enablerepo=epel'

ansible ansible-demo3 -m yum -a 'name=telnet disable_gpg_check=yes disablerepo=ngins-statle'
```

## **yum_repository** 模块

> **yum_repository** 模块可以帮助我们管理远程主机上的 yum 仓库。

### 参数

- name参数:必须参数,用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID。
- baseurl参数:此参数用于设置 yum 仓库的 baseurl。
- description参数:此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
- file参数:此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作为”.repo”配置文件的文件名前缀,同一个”.repo” 配置文件中可以存在多个 yum 源。
- enabled参数:此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes,表示启用对应的 yum 源,设置为 no 表示不启用对应的 yum 源。
- gpgcheck参数:此参数用于设置是否开启rpm包验证功能,默认值为no,表示不启用包验证,设置为 yes 表示开启包验证功能。
- state参数:默认值为 present,当值设置为 absent 时,表示删除对应的 yum 源。

### 案例

```bash
[root@ansible-manager ~]# ansible ansible-demo3 -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/'
ansible-demo3 | SUCCESS => {
"changed": true,
"repo": "aliEpel",
"state": "present"
}
ansible db -m yum_repository -a "name=local baseurl=https://mirrors.aliyun.com/pypi/simple/ description=简介 file=local enabled=no gpgcheck=no state=absent"
```

## copy模块

> copy 模块的作用就是拷贝文件(拷贝到远程主机)。

### 常用参数

- src参数 :用于指定需要copy的文件或目录。
- dest参数 :用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数。
- content参数 :当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。
- force参数 : 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
- backup参数 : 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
- owner参数 : 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
- group参数 : 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
- mode参数 : 指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r--r--“,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。

### 案例

```bash
root@master ~]# ansible db -m copy -a "src=nginx_upstream_check_module-master.zip dest=/opt"

[root@master ~]# ansible db -m copy -a "content=Holle_World dest=/opt/index.html"

[root@master ~]# ansible db -m copy -a "src=nginx_upstream_check_module-master.zip dest=/opt backup=yes owner=nginx group=mysql mode=600"

[root@ansible-manager ~]# ansible ansible-demo3 -m copy -a "src=/testdir/copytest dest=/testdir/ mode=0640"
ansible-demo3 | SUCCESS => {
"changed": true,
"checksum": "a8d207d098d939cb0dc9df1f3a2b986d6d4499b2",
"dest": "/testdir/copytest",
"gid": 1000,
"group": "ding",
"mode": "0640",
"owner": "ding",
"path": "/testdir/copytest",
"secontext": "system_u:object_r:default_t:s0",
"size": 12,
"state": "file",
"uid": 1000
}
```

## fetch模块

> 此模块可以将远程主机的文件拉取到本地主机的某一个目录下。

### 参数

- dest:指定拉取文件到本地以后,文件存放的位置
- src:指定从受管主机中拉取哪个文件

### 案例

```bash
ansible web01 -m fetch -a 'src=/opt/test/test dest=/opt/'
```

## file模块

> file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。

### 参数

- force:强制创建,需要在两种情况下强制创建软连接,一种是源文件不存在但之后会建立的情况,另一种是目标软连接已存在,需要先取消之前的软连接,然后在创建软连接,两种选项yes|no
- group: 定义文件目录属性
- mode:定义文件目录的权限
- owner:定义文件目录的属性
- path:必选项,定义文件目录的路径
- recurse: 递归的设置文件的属性,只对目录有效
- src:要被软连接的源文件的路径,只适用于state=link的情况
- dest:被连接到的路径,,只适用于state=link的情况
- state:状态
- directory:如果目录不存在,创建目录
- file:即使文件不存在,也不会被创建
- link:创建软连接
- hard:创建硬链接
- touch:如果文件不存在时候,则则会创建一个新文件,如存在文件目录,则更新最后修改时间
- absent:删除目录文件或者取消连接文件

### 案例

```bash
# 创建目录
[root@master ~]# ansible db -m file -a "path=/opt/test state=directory"
# 创建软连接
[root@master ~]# ansible db -m file -a "src=/opt/test dest=/opt/ttt state=link "

[root@master ~]# ansible db -m file -a "path=/opt/1.txt state=touch"
[root@master ~]# ansible db -m file -a "path=/opt/1.txt state=absent"
[root@master ~]# ansible db -m file -a "path=/opt/ttt state=absent"

root@master ~]# ansible db -m file -a "path=/opt/1.txt state=touch group=nginx owner=mysql mode=600"

# 强制创建软链接
[root@master ~]# ansible db -m file -a "src=/opt/2.txt dest=/opt/txt state=link force=yes"

# 递归设置权限
[root@master ~]# ansible db -m file -a "path=/opt/test group=mysql owner=nginx mode=700 recurse=yes"

文件做软连接 ansible -i ansiblepy.py test22 -m file -a "src=/root/aa dest=/root/ansTest/ttt state=link"
创建文件 ansible -i ansiblepy.py test22 -m file -a "path=/root/kk directory=touch"
创建目录 ansible -i ansiblepy.py test22 -m file -a "path=/root/kkk state=directory"
删除目录文件或者软连接(state=absent | directory) ansible -i ansiblepy.py test22 -m file -a "path=/root/kk state=absent"
```

## get_url模块

> 用于将文件或软件从http、https或ftp下载到本地节点上或被管理机节点上

### 参数

- dest : 下载到哪里(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称。
- owner:指定属主
- group:指定属组
- mode:指定权限、
- force : 如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果no,则只有在目标不存在时才会下载该文件。
- sha256sum : 如果将SHA-256校验和传递给此参数,目标文件的摘要将在下载后计算,以确保其完整性
- url : HTTP,HTTPS或FTP URL(http | https | ftp)
- url_password : 用于HTTP基本认证的密码。 如果未指定url_username参数,则不会使用url_password参数。
- url_username : 用于HTTP基本认证的用户名。 对于允许空密码的站点,此参数可以不使用`url_password'使用。
- validate_certs :如果“no”,SSL证书将不会被验证。 这只能使用自签名证书在个人控制的网站上使用。

### 案例

```bash
# 下载promertheus
[root@master ~]# ansible db -m get_url -a "dest=/opt/ owner=mysql group=nginx mode=600 url=http://106.13.81.75/prometheus-2.25.0.linux-amd64.tar.gz"

# 增加sha256sum验证
[root@master ~]# ansible db -m get_url -a "dest=/opt/ owner=mysql group=nginx mode=600 url=http://106.13.81.75/prometheus-2.25.0.linux-amd64.tar.gz sha256sum=d163e41c56197425405e836222721ace8def3f120689fe352725fe5e3ba1a69d"
```

## service模块

> service 模块可以帮助我们管理远程主机上的服务。比如,启动或停止远程主机中的 nginx 服务。

### 参数

- name参数:此参数用于指定需要操作的服务名称,比如 nginx。
- state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded。
- enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。

### 案例

```bash
[root@master ~]# ansible db -m service -a "name=nginx state=started enabled=yes"

[root@ansible-manager ~]# ansible ansible-demo3 -m service -a "name=nginx state=started"
ansible-demo3 | SUCCESS => {
"changed": true,
"name": "nginx",
"state": "started",
"status": {
"ActiveEnterTimestampMonotonic": "0",
......
"WatchdogUSec": "0"
}
}
```

 

## systemd模块

> `systemd`模块用于控制远程主机的systemd服务,说白了,就是Linux下的systemd命令。需要远程主机支持`systemd`。
>
> 用法和`service`模块基本相同。

### 参数

| 名称 | 必选 | 可选值 | 备注 |
| :-----------: | :--: | :----------------------------------------- | :----------------------------------------------------------- |
| daemon_reload | no | `yes`/`no` | 在执行任何其他操作之前运行守护进程重新加载,以确保systemd已经读取其他更改 |
| enabled | no | `yes`/`no` | 服务是否开机自动启动。**`enabled`和`state`至少要有一个被定义** |
| masked | no | `yes`/`no` | 是否将服务设置为masked状态,被mask的服务是无法启动的 |
| name | yes | | 服务名称 |
| state | no | `started`,`stopped`,`restarted`,`reloaded` | service最终操作后的状态 |

### 案例

```bash
[root@centos7 ~]# ansible test -m systemd -a "name=httpd state=started"
192.168.31.66 | SUCCESS => {
"changed": true,
"name": "httpd",
"state": "started",
"status": {
。。。

[root@centos7 ~]# ansible test -m systemd -a "name=httpd state=stopped"
192.168.31.66 | SUCCESS => {
"changed": true,
"name": "httpd",
"state": "stopped",
"status": {
。。。

[root@centos7 ~]# ansible test -m systemd -a "name=httpd state=restarted"
192.168.31.66 | SUCCESS => {
"changed": true,
"name": "httpd",
"state": "started",
"status": {
。。。

[root@centos7 ~]# ansible test -m systemd -a "name=httpd state=reloaded"
192.168.31.66 | SUCCESS => {
"changed": true,
"name": "httpd",
"state": "started",
```

 

## mount模块

> 挂载。

### 参数

- src : 挂载路径(NFS)
- path : 挂载的路径(挂载主机的路径)
- fstype : 挂载的类型
- opts:挂载权限
- state : 状态
- present --- 开机挂载,仅将挂载配置写入/etc/fstab
- mounted --- 挂载设备,并将配置写入/etc/fstab
- unmounted --- 卸载设备,不会清除/etc/fstab写入的配置
- absent --- 卸载设备,会清理/etc/fstab写入的配置(会删除目录,但是目录必须为空)

### 案例

```bash
# 挂载192.168.5.80:/data目录到test组中的主机
# ansible test -m mount -a "src=192.168.5.80:/data path=/data fstype=nfs opts=defaults state=mounted"

# 卸载,会直接删除/data目录,挂载的时候也不需要创建目标的/data目录
# ansible test -m mount -a "src=192.168.5.80:/data path=/data fstype=nfs opts=defaults state=absent"
```

## unarchive 解压模块

> 解压复制远程主机上的压缩文件

### 参数

- copy:默认为yes,当copy=yes,那么拷贝的文件是从ansible主机复制到远程主机上的,如果设置为copy=no,那么会在远程主机上寻找src源文件
- src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
- dest:远程主机上的目标路径
- mode:设置解压缩后的文件权限

### 案例

```bash
ansible db -m unarchive -a "src=node_exporter-1.1.2.linux-amd64.tar.gz dest=/opt/ mode=600 "
ansible db -m unarchive -a "src=/opt/prometheus-2.25.0.linux-amd64.tar.gz copy=no dest=/opt/ mode=600 "

# 在远程主机上解压文件并设置权限
ansible all -m unarchive -a 'src=/srv/tomcat8/apache-tomcat-8.0.29.tar.gz dest=/usr/local copy=no mode=0755'

# 解压ansible管理机上的压缩文件到远程主机并设置权限
ansible all -m unarchive -a "src=/tmp/install/zabbix-3.0.4.tar.gz dest=/tmp/ mode=0755 copy=yes"
```

 

## cron模块

> cron 模块可以帮助我们管理远程主机中的计划任务,功能相当于 crontab 命令。

### 参数

- minute参数:此参数用于设置计划任务中分钟设定位的值,比如,上述示例1中分钟设定位的值为5,即 minute=5,当不使用此参数时,分钟设定位的值默认为”*”。*
- *hour参数:此参数用于设置计划任务中小时设定位的值,比如,上述示例1中小时设定位的值为1,即 hour=1,当不使用此参数时,小时设定位的值默认为”*”。
- day参数:此参数用于设置计划任务中日设定位的值,当不使用此参数时,日设定位的值默认为”*”。*
- *month参数:此参数用于设置计划任务中月设定位的值,当不使用此参数时,月设定位的值默认为”*”。
- weekday参数:此参数用于设置计划任务中周几设定位的值,当不使用此参数时,周几设定位的值默认为”*”。
- user参数:此参数用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户。
- job参数:此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的 “echo test” 命令。
- name参数:此参数用于设置计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible 会默认为计划任务加入注释,注释的内容为 #Ansible: None,假设指定计划任务的名称为 test,那么注释的内容为#Ansible: test,在一台机器中,计划任务的名称应该具有唯一性,方便我们以后根据名称修改或删除计划任务。
- special_time参数:在上述示例3与示例4中,计划任务的时间设定格式为 @reboot 或者@hourly。@reboot 表示重启时执行,@hourly 表示每小时执行一次,相当于设置成”0 0 * * *” ,这种@开头的时间设定格式则需要使用 special_time 参数进行设置,special_time 参数的可用值有 reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。
- state参数:当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将 state 的值设置为 absent。
- backup参数:如果此参数的值设置为 yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron 模块会在远程主机的 /tmp 目录下创建备份文件,以 crontab 开头并且随机加入一些字符,具体的备份文件名称会在返回信息的 backup_file 字段中看到,推荐将此此参数设置为 yes。

### 案例

```bash
[root@master ~]# ansible db -m cron -a "minute=5 hour=3 day=3 month=5 user=root job='echo Hello' name=job_test state=present "

[root@master ~]# ansible db -m cron -a "minute=5 hour=3 day=3 month=5 user=root job='echo World' name=job_test state=present backup=yes"
[root@master ~]# ansible db -m cron -a "minute=5 hour=*/2 day=3 month=5 user=root job='echo World' name=job_test state=present backup=yes"

[root@master ~]# ansible db -m cron -a "special_time=reboot user=root job='echo World' name=job_test state=present backup=yes"

[root@ansible-manager ~]# ansible ansible-demo3 -m cron -a " name='special time test' state=absent backup=yes "
ansible-demo3 | SUCCESS => {
"backup_file": "/tmp/crontabiaObgL",
"changed": true,
"envs": [],
"jobs": [
"crontab test",
"crontab day test"
]
}
[root@ansible-manager ~]# ansible ansible-demo3 -m cron -a " name='special time test' special_time=reboot job='echo test' "
ansible-demo3 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"crontab test",
"crontab day test",
"special time test"
]
}
```

## selinux模块

> 配置 SELINUX 的策略, 需要重启机器

### 参数

- state :状态
- enforcing : 启用
- permissive : 临时关闭
- disabled : 禁用

### 案例

```bash
ansible all -m selinux -a 'state=disabled'
192.168.179.99 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"configfile": "/etc/selinux/config",
"msg": "",
"policy": "targeted",
"reboot_required": false,
"state": "disabled"
}
```

 

posted @ 2023-05-17 00:23  甜甜de微笑  阅读(20)  评论(0编辑  收藏  举报