Ansible - 模块 - shell
概述
- ansible 的 shell 模块
准别
ansible 控制节点
- ansible
- 2.8.1
- ansible
远程节点
- OS
- CentOS 7.5
- 无密码登录
- 已经打通
- OS
1. 模块
概述
- ansible 功能的具体实现
模块
- 本质
- ansible 携带的 功能模块 lib
- 不同的 模块, 实现了不同的功能
- 模块通常的作用
- 操作系统资源
- 执行系统命令
- 操作系统文件
- 如果没有理想的模块, 当然可以自己写
- 本质
2. shell
- 概述
- 执行 shell 命令的模块
- 比较基础
- 有些缺点
- 建议用 command 模块替代
- 但还是值得一讲
1. 基本
概述
- 最基本的命令
命令1: pwd
命令
# -m 使用的是 shell
# -a 是要被执行的命令
> ansible -i hosts demo -m shell -a 'pwd'
结果
demo | CHANGED | rc=0 >>
/root
疑问
默认位置
- 默认的 pwd, 是 默认用户的 home 目录
- 默认的 用户, 是 root
- 默认的 pwd, 是 默认用户的 home 目录
我想要换目录, 那该怎么办呢?
playbook
# playbook02.yml
---
# 测试 shell
# ansible -i hosts demo -m shell -a 'pwd'
# ansible-playbook -i hosts playbook02.yml
- hosts: servers
# 关闭 采集
gather_facts: false
tasks:
- name: shell test pwd
shell: pwd
命令2: 尝试换个目录
命令
> ansible -i hosts demo -m shell -a 'cd /etc'
结果
# 貌似没有任何返回啊...
demo | CHANGED | rc=0 >>疑问
- 如果地址输错了, 会怎么样
结果
demo | FAILED | rc=1 >>
/bin/sh: line 0: cd: /etcd: No such file or directorynon-zero return code
- 如果地址输错了, 会怎么样
playbook
playbook03.yml
---
# 测试 shell
# ansible -i hosts demo -m shell -a 'cd /etc'
# ansible-playbook -i hosts playbook03.yml
- hosts: servers
gather_facts: false
tasks:
- name: shell test cd
shell: cd /etc
命令3: 换个目录再查看
命令
# ; 可以分割命令
> ansible -i hosts demo -m shell -a 'cd /etc; pwd'
结果
demo | CHANGED | rc=0 >>
/etc
疑问
- 如果换目录错了, 会怎么样呢
结果
# 前面的命令报错了, 后面的命令还是在执行
# 这个就有点考验人了
demo | CHANGED | rc=0 >>
/root/bin/sh: line 0: cd: /etcd: No such file or directory
- 如果换目录错了, 会怎么样呢
playbook
# 这个 tasks 下面, 有两个 shell 任务
playbook04.yml
---
# 测试 shell
# ansible -i hosts demo -m shell -a 'cd /etc; pwd'
# ansible-playbook -i hosts playbook04.yml
- hosts: servers
gather_facts: false
tasks:
- name: shell test cd
shell: cd /etc
- name: pwd
shell: pwd
命令4: 另一种换目录的方式
命令
> ansible -i hosts demo -m shell -a 'chdir=/etc pwd'
结果
demo | CHANGED | rc=0 >>
/etc
playbook
playbook05.yml
---
# 测试 shell
# ansible -i hosts demo -m shell -a 'chdir=/etc pwd'
# ansible-playbook -i hosts playbook05.yml
- hosts: servers
gather_facts: false
tasks:
- name: shell test cd
shell: pwd
args:
chdir: /etc
疑问
如果换目录错了, 会怎么样呢
结果
# 会有报错, 后面代码不会执行
# 建议使用这种方式来切换目录
demo | FAILED! => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"module_stderr": "Shared connection to 192.168.2.xxx closed.\r\n",
"module_stdout": "Traceback (most recent call last):\r\n File \"/root/.ansible/tmp/ansible-tmp-1569235278.83-13414444200011/AnsiballZ_command.py\", line 114, in <module>\r\n _ansiballz_main()\r\n File \"/root/.ansible/tmp/ansible-tmp-1569235278.83-13414444200011/AnsiballZ_command.py\", line 106, in _ansiballz_main\r\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n File \"/root/.ansible/tmp/ansible-tmp-1569235278.83-13414444200011/AnsiballZ_command.py\", line 49, in invoke_module\r\n imp.load_module('__main__', mod, module, MOD_DESC)\r\n File \"/tmp/ansible_command_payload_dCXTDZ/__main__.py\", line 327, in <module>\r\n File \"/tmp/ansible_command_payload_dCXTDZ/__main__.py\", line 263, in main\r\nOSError: [Errno 2] No such file or directory: '/etcd'\r\n",
"msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
"rc": 1
}
```又有一个新问题
- 如果可以这样
- ansible 发现目录不存在, 就不执行了
- 这个真的有
- ansible 发现目录不存在, 就不执行了
- 如果可以这样
命令6: removes
命令
# 如果没有 /etcd, 就不执行命令了
> ansible -i hosts demo -m shell -a 'removes=/etcd pwd'
结果
demo | SUCCESS | rc=0 >>
skipped, since /etcd does not exist
playbook
playbook06.yml
---
# 测试 shell
# ansible -i hosts demo -m shell -a 'removes=/etcd pwd'
# ansible-playbook -i hosts playbook06.yml
- hosts: servers
gather_facts: false
tasks:
- name: shell test cd
shell: cd /etc
args:
removes: /etcd
疑问
如果同时使用 removes 和 chdir 两个参数会如何呢
目录存在
> ansible -i hosts demo -m shell -a 'removes=/etcd chdir=/etc pwd'
demo | SUCCESS | rc=0 >>
skipped, since /etcd does not exist目录不存在
# 不存在还是会有问题啊...
> ansible -i hosts demo -m shell -a 'removes=/etcd chdir=/etcd pwd'
demo | FAILED! => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"module_stderr": "Shared connection to 192.168.2.135 closed.\r\n",
"module_stdout": "Traceback (most recent call last):\r\n File \"/root/.ansible/tmp/ansible-tmp-1569236237.29-269825187752078/AnsiballZ_command.py\", line 114, in <module>\r\n _ansiballz_main()\r\n File \"/root/.ansible/tmp/ansible-tmp-1569236237.29-269825187752078/AnsiballZ_command.py\", line 106, in _ansiballz_main\r\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n File \"/root/.ansible/tmp/ansible-tmp-1569236237.29-269825187752078/AnsiballZ_command.py\", line 49, in invoke_module\r\n imp.load_module('__main__', mod, module, MOD_DESC)\r\n File \"/tmp/ansible_command_payload_YsMUPL/__main__.py\", line 327, in <module>\r\n File \"/tmp/ansible_command_payload_YsMUPL/__main__.py\", line 263, in main\r\nOSError: [Errno 2] No such file or directory: '/etcd'\r\n",
"msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
"rc": 1
}
有 目录 存在不执行 的参数吗
- 有的
命令7: creates
命令
> ansible -i hosts demo -m shell -a 'creates=/etcd pwd'
结果
demo | CHANGED | rc=0 >>
/root
playbook
playbook07.yml
---
# 测试 shell
# ansible -i hosts demo -m shell -a 'creates=/etcd pwd'
# ansible-playbook -i hosts playbook07.yml
- hosts: servers
gather_facts: false
tasks:
- name: shell test cd
shell: cd /etc
args:
creates: /etcd
疑问
- 如果放多个参数, 会是怎么样的关系
- 简单试了试, 貌似是 与 的关系
- 想做 或 操作, 但是我没有找到
- 如果放多个参数, 会是怎么样的关系
其他
- shell 还有其他的属性, 这里就不在多说了
- command 模块其实更加适合执行命令, 有更多的有点
- 如果你使用 shell 命令, 做 rpm 操作时
- ansible 会提示使用 yum, dnf 或者 zypper
- 其他的模块, 也了解下吧
ps
Ansible - 模块 - shell的更多相关文章
- ansible执行shell模块和command模块报错| FAILED | rc=127 >> /bin/sh: lsof: command not found和| rc=2 >> [Errno 2] No such file or directory
命令: ansible -i hosts_20 st -m shell -a 'service zabbix_agentd star' -K --become ansible -i hosts_2 ...
- ansible模块command、shell、raw、script
简介 环境: ansible端: ip:192.168.100.129 hostname:node1.lansgg.com client端: ip:192.168.100.131 hostname:v ...
- ansible使用shell模块在受控机上执行命令(ansible2.9.5)
一,ansible的shell模块和command模块的区别? shell模块:在远程主机上执行主控端发出的shell/python脚本 command模块:不能调用shell指令,没有bash的环境 ...
- ansible模块
ansible模块: 模块(Modules),类似于 "任务插件"("task plugins")或"库插件"("library ...
- 第4天:Ansible模块
Ansible对远程服务器的实际操作实际是通过模块完成的,其工作原理如下: 1)将模块拷贝到远程服务器 2)执行模块定义的操做,完成对服务器的修改 3)在远程服务器中删除模块 需要说明的是,Ansib ...
- ansible笔记(3):ansible模块的基本使用
ansible笔记():ansible模块的基本使用 在前文的基础上,我们已经知道,当我们使用ansible完成实际任务时,需要依靠ansible的各个模块,比如,我们想要去ping某主机,则需要使用 ...
- win10的pycharm中安装ansible模块过程
前面的安装报错信息 ansible模块安装报错:Could not install packages due to an OSError: [Errno 2] No such file or dire ...
- ansible模块之command、shell、script、file、copy、fetch
前戏 ansible 批量在远程主机上执行命令 openpyxl 操作excel表格 puppet ansible slatstack ansible epel源 第一步: 下载epel源 wget ...
- ansible基本模块-shell
ansible XXX -m shell -a "XXX"
随机推荐
- 在SQL中怎么把一列字符串拆分为多列
--首先,你是按什么规则拆? 我举个例子 你要按字段中的逗号拆开,假设字段名叫text --用charindex和substring这2个函数 select substring(text,1,c ...
- 记录 shell学习过程(10 ) shell 对文件的操作
0.sed 常用内部命令 a 在匹配后面添加 i 在匹配前面添加 p 打印 d 删除 s 查找替换 c 更改 y 转换 N D P 下面用a来演示 1.sed 'a 追加内容' 文件 # sed 'a ...
- model_Flask
虚拟环境 新建一个虚拟环境:mkvirtualenv 环境名 删除一个虚拟环境:rmvirtualenv 环境名 退出:deactivate win10下安装 1. 打开cmd 安装虚拟环境包 pip ...
- 常用UrlEncode编码结果
空格 ! # $ % + @ : = ? %20 %21 %23 %24 %25 %2B %40 %3A %3D %3F
- 更新centos本地仓库(换源)
/etc/yum.repos.d/CentOS-Base.repo 1,首先进行备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cen ...
- 动态规划 ---- 最长公共子序列(Longest Common Subsequence, LCS)
分析: 完整代码: // 最长公共子序列 #include <stdio.h> #include <algorithm> using namespace std; ; char ...
- two pointers思想 ---- 利用两个i, j两个下标,同时对序列进行扫描,以O(n)复杂度解决问题的一种思想
two pointers思想 ---- 利用两个i, j两个下标,同时对序列进行扫描,以O(n)复杂度解决问题的一种思想, 如果能用这种思想解决问题,那么会大大降低程序的复杂度. 两个利用这个思想的例 ...
- 解决报错Failed to start LSB: Bring up/down networking:MAC地址导致
1.场景描述,我在电脑里装好的虚拟机,今天突然就网络无法打开,并出现如下报错: [root@ansible-control ~]# systemctl start networkJob for net ...
- 【Python】循环控制保留字
- PCB主线布线规范—高速线之DDR2
一.DDR2时钟线走线规则a)时钟线包括 MEM_CLKOUT#0.MEM_CLKOUT0.MEM_CLKOUT#1.MEM_CLKOUT1,MEM_CLKOUT#2.MEM_CLKOUT2: MEM ...