前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >command 模块

command 模块

作者头像
大江小浪
发布2022-05-06 16:01:05
5270
发布2022-05-06 16:01:05
举报
文章被收录于专栏:小狼的世界小狼的世界

给 Ansible 下一个完整的定义很难,官方的宣传是 Ansible is Simple IT Automation 看出来还是主打自动化。

Ansible delivers simple IT automation that ends repetitive tasks and frees up DevOps teams for more strategic work.

也有资料介绍 Ansible 是模型驱动的配置管理器,个人觉得这个描述不是很恰当。从 Ansible 的使用方式来看,默认使用 push 的方式更像自动化。而 Puppet 默认使用 pull 的方式,则更像是配置驱动。

Ansible 的使用有两种模式,一种是直接在命令行调用模块批量执行单个命令,这种称为 AD HOC 模式。

代码语言:javascript
复制
$ ansible [host_inventory] -m command -a 'hostname'

也可以通过编写 yaml 文件,来编排一组操作,这种方式称为 playbook 模式。看一个简单的配置。

代码语言:javascript
复制
# test.yaml
---
- hosts: 192.168.1.31
  remote_user: root
  tasks: 
    - name: run df -h
      remote_user: test
      shell: name=df -h

使用方式是这样,AD HOC 模式无法持久化,playbook 方式可以通过 yaml 文件实现持久化和重复执行。

代码语言:javascript
复制
$ ansible-playbook test.yaml

今天我们来熟悉几个最常用的模块:

command 模块

在远程节点上执行命令,使用方式如下:

代码语言:javascript
复制
$ ansible [host_list] -m command -a "hostname"

但这种方式并不是调用 shell 环境去执行命令,所以无法获取环境变量,也不能使用管道符、重定向等。

支持 chdir 参数,即执行命令前先切换到指定目录。

代码语言:javascript
复制
$ ansible [host_list] -m command -a "ls -l chdir=/etc/yum.repos.d"
# command 是 ansible 的默认模块,可以省略
$ ansible [host_list] -a "ls -l chdir=/etc/yum.repos.d"

shell 模块

如果需要在远程的 shell 下执行命令,则需要使用 shell 模块。使用方法与 command 相同,但是命令执行时调用的 /bin/sh

代码语言:javascript
复制
$ ansible [host_list] -m command -a 'echo $LOGNAME'
# 该命令可以打印当前登录的用户名
$ ansible [host_list] -m command -a 'ps -ef | grep java | wc -l'
# 该命令可以统计服务器上运行的 java 程序数量

copy 模块

复制文件,支持从本地复制到服务端。

代码语言:javascript
复制
# 从服务端向被管机拷贝文件
$ ansible [host_list] -m copy -a 'src=/etc/hosts dest=/tmp owner=root mode=0755'

# 将内容存为远端文件
$ ansible [host_list] -m copy -a 'content=Hello World! desc/tmp/test.txt owner=root force=yes mode=0755'

fetch 模块

从远端获取文件,如果 dest 指定为文件夹时,默认为以每台服务器的IP为名称创建文件夹,相关的文件保存在对应的文件夹下。

代码语言:javascript
复制
# 从远端服务器获取文件
$ ansible [host_list] -m fetch -a 'src=/etc/hosts dest=/home/path owner=root mode=0755'

参数列表

  • dest :存储目标的目录。如果获取 /etc/hosts 目标存放在 /home 下,最终保存路径是 /home/host.example.com/etc/hosts,主机名的依据是 /etc/ansible/hosts 的配置。
  • src :目前只能是文件。

普通用户执行 Ansible 遇到的问题

场景如下,管理机的 root 账号被上收了,我只能使用普通用户 shiqiang 执行 ansible 命令。此时,如果主机列表配置如下:

代码语言:javascript
复制
$ cat /etc/ansible/hosts
[testhost]
128.128.128.128
$ ansible testhost -m ping

会报 Permission Denied 的错误。原因是使用 shiqiang 这个账号执行 ansible 命令时,默认会使用当前用户尝试免密登录目标主机。因为 testhost 主机与管理机做了 root 账号的互信,,这时需要在配置文件中明确指明使用 root 用户,同时需要把管理机 shiqiang 用户的 id_rsa.pub 拷贝到testhost 的 .ssh/authorized_keys 文件中。

代码语言:javascript
复制
$ cat /etc/ansible/hosts
[testhost]
128.128.128.128 ansible_ssh_user=root 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • command 模块
  • shell 模块
  • copy 模块
  • fetch 模块
  • 普通用户执行 Ansible 遇到的问题
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档