Erlo

Ansible Ad-Hoc与常用模块

时间:2020-03-19 17:30   阅读:18次   来源:博客园
页面报错
点赞

 

ansible 执行结果信息–各颜色说明;ansible Ad-Hoc 说明;ansible 如何查看帮助文档与常用模块详解

主机规划

 

添加用户账号

说明:

1、 运维人员使用的登录账号;

2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;

3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。

1 # 使用一个专门的用户,避免直接使用root用户
2 # 添加用户、指定家目录并指定用户密码
3 # sudo提权
4 # 让其它普通用户可以进入该目录查看信息
5 useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun
6 echo "yun  ALL=(ALL)       NOPASSWD: ALL" >>  /etc/sudoers
7 chmod 755 /app/

 

Ansible 配置清单Inventory

之后文章都是如下主机配置清单

 1 [yun@ansi-manager ansible_info]$ pwd
 2 /app/ansible_info
 3 [yun@ansi-manager ansible_info]$ cat hosts_key 
 4 # 方式1、主机 + 端口 + 密钥
 5 [manageservers]
 6 172.16.1.180:22
 7 
 8 [proxyservers]
 9 172.16.1.18[1:2]:22
10 
11 # 方式2:别名 + 主机 + 端口 + 密码
12 [webservers]
13 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22
14 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22
15 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22

 

Ansible执行返回 => 颜色信息说明

黄色:成功执行并且伴随着状态的改变

ansible proxyservers -m command -a 'cat /etc/hosts' -i hosts_key

 

绿色:成功执行并且没有发生状态的改变,或者只是对远程节点状态信息进行查看

ansible proxyservers -m ping -i hosts_key

 

红色:操作执行命令有异常

ansible proxyservers -m command -a 'll /tmp' -i hosts_key

 

紫色:表示对命令执行发出警告信息(可能存在的问题,给你一下建议)

1 # 其中 hosts_kkk 文件不存在
2 ansible proxyservers -m command -a 'll /tmp' -i hosts_kkk

 

Ansible 之 Ad-Hoc

Ansible中有两种模式, 分别是 Ad-Hoc 模式和 Playbooks 模式。

ad-hoc简而言之,就是“临时命令”,不会保存。

ad-hoc模式的使用场景

场景一,在多台机器上,查看某个进程是否启动

场景二,在多台机器上,拷贝指定日志文件到本地,等等

ad-hoc模式的命令使用

 

Ansible查看帮助方法

1 [yun@ansi-manager ~]$ ansible-doc -l       # 查看所有模块与简要说明
2 [yun@ansi-manager ~]$ ansible-doc copy     # 查看指定模块方法「可优先查看 EXAMPLES 信息」★★★★★
3 [yun@ansi-manager ~]$ ansible-doc -s copy  # 查看指定模块的 Playbooks 代码段

 

Ansible常用模块

工作目录与主机清单

当前所在的工作目录和主机清单

 1 [yun@ansi-manager ansible_info]$ pwd
 2 /app/ansible_info
 3 [yun@ansi-manager ansible_info]$ ll
 4 total 4
 5 -rw-rw-r-- 1 yun yun 226 Oct  8 16:07 hosts_key
 6 [yun@ansi-manager ansible_info]$ cat hosts_key 
 7 # 方式1、主机 + 端口 + 密钥
 8 [manageservers]
 9 172.16.1.180:22
10 
11 [proxyservers]
12 172.16.1.18[1:2]:22
13 
14 # 方式2:别名 + 主机 + 端口 + 密码
15 [webservers]
16 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22
17 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22
18 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22

 

command 命令模块

默认模块, 用于执行命令。但不支持管道或重定向。

正常示例

1 [yun@ansi-manager ansible_info]$ ansible proxyservers -a 'df -h' -i hosts_key
2 # 或者
3 [yun@ansi-manager ansible_info]$ ansible proxyservers -m command -a 'df -h' -i hosts_key

 

异常示例

1 # 重定向不支持
2 ansible proxyservers -m command -a 'df -h > /tmp/df.info' -i hosts_key
3 # 管道不支持
4 ansible proxyservers -m command -a "df -h | grep 'boot'" -i hosts_key

 

shell 命令模块

功能和 command 相同,且支持管道和重定向。与 command 相比,优先使用该模块。

示例

1 ansible proxyservers -m shell -a "df -h | grep 'boot'" -i hosts_key
2 ansible proxyservers -m shell -a "df -h > /tmp/df.info" -i hosts_key

 

script 脚本模块

在本地运行模块,等同于在远程执行。且不需要将脚本文件推送到目标主机进行执行。

示例

脚本中有 sudo 提权

1 # 在 ansible 管理机操作
2 [yun@ansi-manager ansible_info]$ cat /app/yunwei/yum_test.sh 
3 #!/bin/sh
4 # 由于使用的是 yun 用户,而不是 root 用户,因此需要 sudo 提权
5 sudo yum install -y iftop
6 [yun@ansi-manager ansible_info]$ ansible proxyservers -m script -a "/app/yunwei/yum_test.sh" -i hosts_key

 

脚本中无 sudo 提权

1 # 在 ansible 管理机操作
2 [yun@ansi-manager ansible_info]$ cat /app/yunwei/yum_test.sh 
3 #!/bin/sh 
4 yum install -y iftop
5 #######################################
6 # 由于我们使用的是 yun 普通用户
7 # 因此这里需要使用 -b 选择进行提权,这样在远程会以 root 用户执行
8 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m script -a "/app/yunwei/yum_test.sh" -i hosts_key

 

在目标机器查看是否在 yum 安装 iftop

1 [root@ansi-haproxy01 ~]# ps -ef | grep 'iftop'
2 root       3867   3866  0 23:25 pts/1    00:00:00 sudo yum install -y iftop
3 root       3868   3867 48 23:25 pts/1    00:00:12 /usr/bin/python /bin/yum install -y iftop
4 root       4144   3155  0 23:25 pts/0    00:00:00 grep --color=auto iftop

 

yum 安装软件模块

在目标机器实现 yum 安装软件

1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
2 [yun@ansi-manager ansible_info]$ ansible-doc yum 
3 # 由于我们使用的是 yun 普通用户
4 # 因此必须使用 -b 选择进行提权
5 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m yum -a 'name=httpd state=present' -i ./hosts_key

 

相关选项说明:

name:要安装软件包的名称

state:状态说明

     ‘present’ 和 ‘installed’ 简单地确保安装了所需的包。「优先使用 present」

     ‘latest’ 将更新指定的软件包,如果它不是最新可用的版本。

     ‘absent’ and ‘removed’ 将删除指定的包【慎用!!!】。「如要使用优先使用 absent」

download_only:只下载包,不安装

copy 文件拷贝模块「本地到远端」

将控制机的文件或目录拷贝到受控机,并且可以指定目标文件/目录的属性信息。

控制机操作

 1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
 2 [yun@ansi-manager ansible_info]$ ansible-doc copy 
 3 # 由于我们使用的是 yun 普通用户
 4 # 因此有时需要使用 -b 选择进行提权
 5 # 将 content 中的内容直接写入目标文件中
 6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m copy -a "content='123n' dest=/tmp/copy_test2 owner=root group=root mode=0644 backup=yes" -i ./hosts_key 
 7 ## 拷贝文件
 8 [yun@ansi-manager ansible_info]$ cat /tmp/copy_test 
 9 111111
10 222222
11 333333
12 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m copy -a "src=/tmp/copy_test dest=/tmp/ owner=root group=root mode=0644 backup=yes" -i ./hosts_key
13 ## 拷贝目录
14 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m copy -a "src=/app/yunwei dest=/tmp/ owner=root group=root mode=0644 backup=yes" -i ./hosts_key

 

被控端查看

1 [yun@ansi-haproxy01 tmp]$ cat copy_test2
2 123
3 [yun@ansi-haproxy01 tmp]$ cat /tmp/copy_test 
4 111111
5 222222
6 333333

 

相关选项说明:

src:源文件「可以是绝对路径或相对路径」

remote_src:为 False「默认」,则源文件在本地;为 True ,则源文件在远端「了解」

dest:推送数据的目标路径或目标文件

owner:指定远端文件的属主

group:指定远端文件的属组

mode:指定远端文件的权限

backup:如果推送的目标文件存在且与源文件内容不同,那么会对目标文件进行备份「通过 checksum 校验」

content:将 content 中的内容直接写入目标文件中

注意事项:

1、同一个源文件,如果源文件内容没有任何修改,那么进行第二次相同的操作时,检测到要拷贝的文件和目标文件内容相同「通过 checksum 校验」,且目标文件属性前后未发生改变,那么就不会进行拷贝。由于目标文件属性未发生改变,所以返回数据颜色为绿色。如下图所示。

 

 

2、同一个源文件,如果源文件内容没有任何修改,那么进行第二次相同的操作时,如果源文件和目标文件内容相同「通过 checksum 校验」,但目标文件属性前后要求发生改变「属主、属组、权限」,那样也不会进行拷贝。但由于目标文件属性发生改变,所以返回数据颜色为黄色。

fetch 文件拷贝模块「远端到本地」

该模块功能类似于 copy 模块,但是是反向的。将远端的文件拷贝到本地。备注:当前仅支持文件,暂不支持递归拷贝。

由于ansible使用的是 yun 用户,因此从远端拷贝过来的文件属主、属组都是 yun。

控制机操作

1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
2 [yun@ansi-manager ansible_info]$ ansible-doc fetch 
3 # 由于我们使用的是 yun 普通用户
4 # 因此有时需要使用 -b 选择进行提权

 

被控端文件准备1

1 [test1@ansi-haproxy01 tmp]$ ll /tmp/test1 
2 -rw-rw-r-- 1 test1 test1 20 Nov  2 11:04 /tmp/test1
3 [test1@ansi-haproxy01 tmp]$ cat /tmp/test1 
4 111
5 222
6 333
7 aaa
8 bbb

 

被控端文件准备2

1 [test1@ansi-haproxy02 tmp]$ ll /tmp/test1 
2 -rw-rw-r-- 1 test1 test1 20 Nov  2 11:04 /tmp/test1
3 [test1@ansi-haproxy02 tmp]$ cat /tmp/test1 
4 1111

 

拷贝方式1

 1 [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -b -m fetch -a "src=/tmp/test1 dest=/tmp/" -i ./hosts_key  # 拷贝 172.16.1.181 主机的
 2 或者
 3 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m fetch -a "src=/tmp/test1 dest=/tmp/" -i ./hosts_key  # 拷贝 proxyservers 主机组的
 4 ## 查看拷贝结果「注意目录层次」
 5 [yun@ansi-manager ansible_info]$ ll /tmp/
 6 total 4
 7 drwxrwxr-x 3 yun  yun  17 Nov  2 11:21 172.16.1.181
 8 drwxrwxr-x 3 yun  yun  17 Nov  2 11:23 172.16.1.182
 9 [yun@ansi-manager ansible_info]$ tree /tmp/172.16.1.18*
10 /tmp/172.16.1.181
11 └── tmp
12     └── test1
13 /tmp/172.16.1.182
14 └── tmp
15     └── test1
16 
17 2 directories, 2 files

 

拷贝方式2

 1 # 如果使用 flat=yes,那么最好只拷贝一台远端主机的文件,如果是多台那么后面执行的结果,会把前面的覆盖掉。
 2 # dest 路径有 / 结尾
 3 [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -b -m fetch -a "src=/tmp/test1 dest=/tmp/kkk2/ flat=yes" -i ./hosts_key # 推荐,只拷贝一台
 4 # dest 路径无 / 结尾
 5 [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -b -m fetch -a "src=/tmp/test1 dest=/tmp/kkk flat=yes" -i ./hosts_key  # 推荐,只拷贝一台
 6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m fetch -a "src=/tmp/test1 dest=/tmp/kkk flat=yes" -i ./hosts_key  # 不推荐,会产生覆盖
 7 ## 查看拷贝结果
 8 [yun@ansi-manager ansible_info]$ cat /tmp/kkk2/test1 
 9 111
10 222
11 333
12 aaa
13 bbb
14 [yun@ansi-manager ansible_info]$ ll /tmp/kkk 
15 -rw-rw-r-- 1 yun yun 20 Nov  2 11:25 /tmp/kkk
16 [yun@ansi-manager ansible_info]$ cat /tmp/kkk   # 该文件没有 "11111"信息; 产生了覆盖效应
17 111
18 222
19 333
20 aaa
21 bbb

 

相关选项说明:

src:源文件,当前仅支持文件,不支持目录

dest:推送数据的目标路径,默认为:dest[路径]/hostname/src[路径]。参见上面示例

flat: 默认 False。当为 yes/True 时,那么拷贝效果类似于本地的 copy。

template 模板使用

该模块功能类似于 copy 模块,但 copy 模块不支持变量,不支持模板。

template 模块支持变量,支持 Jinja 模板。因此如果生成中的配置文件涉及变量,那么请使用 template 模块。

涉及到 playbook、变量和 Jinja ,这些在后面的文章会有详解。

 1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
 2 [yun@ansi-manager ansible_info]$ ansible-doc template 
 3 # 由于我们使用的是 yun 普通用户
 4 # 因此有时需要使用 -b 选择进行提权
 5 # palybook
 6 [yun@ansi-manager ansible_info]$ pwd
 7 /app/ansible_info
 8 [yun@ansi-manager ansible_info]$ ll
 9 total 16
10 drwxrwxr-x 2 yun yun  35 Oct 11 11:23 file
11 -rw-rw-r-- 1 yun yun 226 Oct  8 16:07 hosts_key
12 -rw-rw-r-- 1 yun yun 304 Oct 11 11:40 test_template.yml
13 [yun@ansi-manager ansible_info]$ ll file/  # 涉及的文件
14 total 4
15 -rw-rw-r-- 1 yun yun 175 Oct 11 11:23 test_template.conf.j2
16 [yun@ansi-manager ansible_info]$ cat file/test_template.conf.j2 
17 # facts 变量
18 dns_info={{ ansible_dns['nameservers'][0] }}
19 mem_total={{ ansible_memtotal_mb }}
20 # 自定义变量
21 listen_port={{ listen_port }}
22 access_addr={{ access_addr }}
23 
24 [yun@ansi-manager ansible_info]$ 
25 [yun@ansi-manager ansible_info]$ cat test_template.yml  # 涉及的 playbook
26 ---
27 # template 示例
28 - hosts: proxyservers
29   vars:
30     - listen_port: 8080
31     - access_addr: zhangblog.com
32 
33   tasks:
34     - name: "template conf"
35       template:
36         src: ./file/test_template.conf.j2
37         dest: /tmp/test_template.conf
38         owner: root
39         group: yun
40         mode: '0600'
41 [yun@ansi-manager ansible_info]$ ansible-playbook -b -i ./hosts_key test_template.yml  # 执行

 

目标机器查看

1 [root@ansi-haproxy01 tmp]# pwd
2 /tmp
3 [root@ansi-haproxy01 tmp]# cat test_template.conf 
4 # facts 变量
5 dns_info=223.5.5.5
6 mem_total=1821
7 # 自定义变量
8 listen_port=8080
9 access_addr=zhangblog.com

 

相关选项说明:

src:源文件「可以是绝对路径或相对路径」

dest:推送数据的目标路径或目标文件

owner:指定远端文件的属主

group:指定远端文件的属组

mode:指定远端文件的权限

backup:如果推送的目标文件存在且与源文件内容不同,那么会对目标文件进行备份

file 文件配置模块

在受控机创建文件或目录,或修改属性信息「如:属主、属组、权限」

 1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
 2 [yun@ansi-manager ansible_info]$ ansible-doc file 
 3 # 由于我们使用的是 yun 普通用户
 4 # 因此有时需要使用 -b 选择进行提权
 5 ## 在受控机改变目标文件的属性【该文件是已存在的】
 6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/yum_test.sh owner=yun group=yun mode=0600" -i ./hosts_key 
 7 ## 在受控机创建软连接
 8 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "src=/tmp/yum_test.sh dest=/tmp/yum_link.sh owner=yun group=yun state=link" -i ./hosts_key
 9 ## 在受控机创建硬链接
10 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "src=/tmp/yum_test.sh dest=/tmp/yum_hard.sh owner=yun group=root state=hard" -i ./hosts_key
11 ## 在受控机,如果目标文件不存在则创建
12 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/dest_file owner=yun group=yun state=touch" -i ./hosts_key
13 ## 在控制机,如果目标目录不存在则创建「可创建多级目录」
14 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/desc_dir/aaa/bbb owner=yun group=root mode=700 state=directory" -i ./hosts_key
15 ## 在控制机,改变目标目录和目录下所有目录或文件的属性信息「递归修改」
16 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/desc_dir owner=yun group=zhang mode=766 state=directory recurse=yes" -i ./hosts_key
17 ## 在受控机,如果目标文件或目录存在,则删除「慎用!!!」
18 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/desc_dir state=absent " -i ./hosts_key

 

相关选项说明:

path:指定目标文件或目录

owner:指定目标文件的属主

group:指定目标文件的属组

mode:指定目标文件的权限

state:状态说明

    file:默认值,指定文件

    link:创建软连接

    hard:创建硬链接

    touch:如果文件不存在则创建

    directory:如果目录不存在则创建

    absent:如果目标文件或目录存在,则删除「慎用!!!」

recurse:递归授权

lineinfile 行编辑模块

此模块确保文件中有特定的行,或者使用反向引用的正则表达式替换现有的行。当您只想更改文件中的一行时,这非常有用。

如果您想要更改多个相似的行,请查看[replace]模块。如果你想要插入/更新/删除文件中的一个行块,请查看[blockinfile]模块。对于其他情况,请参见[copy]或[template]模块。

<

评论留言

还没有评论留言,赶紧来抢楼吧~~

吐槽小黑屋()

* 这里是“吐槽小黑屋”,所有人可看,只保留当天信息。

  • Erlo.vip2020-04-04 10:35:54Hello、欢迎使用吐槽小黑屋,这就是个吐槽的地方。
  • 返回顶部