ansible 模块
Ansible playbook 常用模块
service /systemd 模块 服务器状态
# service centos6
- name: restart XXX
service:
name: iptables
state: started/stoped/restarted/reloaded
enabled:no
when: ansible_os_family == 'RedHat'
# systemd centos7
- name: stop CentOS Firewall
systemd:
name: firewalld
state: stopped
enabled: no
when: ansible_os_family == 'RedHat'
- name: stop Ubuntu Firewall
systemd:
name: ufw
state: stopped
enabled: no
when: ansible_os_family == 'Debian'
- name: disable SELinux #临时关闭selinux
selinux:
state: disabled
lineinfile 模块 行文件 行替换
path: 指定要操作的文件对象
regexp: 匹配条件
line: 想要替换成的行
insertbefore: 在某行之前插入
insertafter: 在某行之后插入
state:
present 插入
absent 删除
- name: Disable SELinux #永久关闭selinux
lineinfile:
dest: /etc/selinux/config
regexp: '^SELINUX='
line: 'SELINUX=disabled'
state: present
replace 模块 替换字符串 类似 sed命令
path: 指定要操作的文件对象
regexp: 正则表达式
replace: 要替换成的字符串
backup: 修改前是否备份原文件
#实例
- name: Set_selinux_disabled_centos7
- name: Disable SELinux disabled centos7
replace:
path: /etc/selinux/config
regexp: 'SELINUX=(enforcing|permissive)'
replace: 'SELINUX=disabled'
backup: yes
copy 模块
src 管理主机文件默认是从files里拷贝
dest 远程节点文件路径
owner 属主
group 属组
mode 拷贝到远程主机文件的权限 =0755
remote_src=yes 表示将远程主机上的数据进行移动操作
remote_src=no 表示将管理主机上的数据进行分发操作
content 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容
force 已经存在同名文件 强制覆盖 force=yes or force=no
backup 已经存在同名文件 强制备份 backup=yes or backup=no
when 模块 判断
1 简单条件判断
- name: 判断其系统是否是centos7
debug:
msg: "is OS CentOS"
when:
- ansible_distribution == "CentOS"
- ansible_distribution_major_version == "7"
2 条件判断
== :相等为真
!= :不等为真
> :大于为真
< :小于为真
>= :大于等于等为真
<= :小于等于等为真为真
and :逻辑与
or :逻辑或
not :取反
# 实例: 根据shell执行的返回成功失败执行下面的语句
- name: task1
shell: "ls test/s"
register: returnmsg #执行了命令后的结果返回给一个变量,这个变量的值在playbook的task之间相互传递变量
ignore_errors: true #忽略错误
- name: task2
debug: msg="run ok"
when: returnmsg.rc == 0
- name: task3
debug: msg="run no"
when: returnmsg.rc != 0
3 条件判断与 tests(exist)
4 判断变量的一些测试(defined,undefined,none)
5 判断执行结果的一些测试(成功,失败,更改,跳过)
6 判断路径的一些测试(file,directory,link,mount,exists)
7 判断字符串的一些测试(lower,upper)
8 判断整除的一些测试(偶数,奇数,整除)
9 版本 比较判断版本号
10 其他一些判断的测试 (subset,superset,string,number)
11 block模块 结合
12 fai模块 结合
13 failed_when
14 changed_when
package yum apt dnf pip 包管理模块
package:使用操作系统本机的自动检测软件包管理器管理软件包
yum:使用yum管理软件包
apt:使用APT管理软件包
dnf:使用dnf管理软件包
pip:从PyPI管理Python软件包
name:
要安装的软件包名,多个软件包以英文逗号隔开 state 对当前指定的软件安装、移除操作 支持的参数有:
present:
安装,但不升级
inistalled:
确认安装
latest:
安装且升级为最新
absent和removed:
移除
# 通过操作系统的自动监测软件包管理器管理软件(就是ubuntu 自动用apt centos7自动用yum rocky9 用 dnf)
- name: Install Update Remove pkg
package:
name: package_name
state: present/latest/absent/removed
# apt ubuntu系列 更新缓存
- name: apt update
apt:
update_cache: yes
# yum/dnf centos系列 清除缓存并更新
- name: Clean all Yum cache and Makecache
yum/dnf:
name: '*'
state: latest
clean_all: yes
update_cache: yes
file 模块
path 要操作的文件或目录
owner 属主
group 属组
mode 权限 =0755
state state=touch
touch 创建空文件
directory 创建空目录
absent 递归删除
file 查看指定目录信息是否存在
hard 硬链接
link 软连接
recurse =yes递归
### 模块实例
# 1 修改目录/data属性,属主root,属组root
file: path=/data owner=root group=root
# 2 创建/data2目录,并设置父目录、子目录属主属组都为root 权限为755
file: path=/data owner=root group=root mode=755 state=directory recurse=yes
# 3 创建文件aa.txt
file: name=/data/aa.txt state=touch
# 4 创建 软 链接文件
file: src=/data path=/tmp/data state=link
unarchive 解压模块
模式:
copy=yes 将ansible主机上的 压缩包解压到指定目录 remote_src=no
copy=no 将(被控主机)上的 压缩包解压到指定目录 remote_src=yes
src tar.gz包的原路径
dest 指定解压的绝对路径
exec 解压时需要排除的目录和文件
owner 属主
group 属组
mode 权限 =0755
src=jdk-8u351-linux-x64.tar.gz dest=/usr/local/ copy=yes owner=root group=root
cron 模块 计划任务
name 计划任务名称
job 指定计划的任务中需要实际执行的命令或者脚本
user 指定用户,默认是root用户
state 指定状态,prsent=添加(默认),absent=删除
backup 备份
minute 分钟,取值范围(0-59,*, */2)
hour 小时,取值范围(0-23,,/2)
day 天,取值范围(1-31,,/2)
mouth 月,取值范围(1-12,,/2)
weekday 周,取值范围(0-6 for Sunday-Saturday, *)
#实例:
name='ntpdate' minute=0 hour=4 job='/usr/bin/docker restart kcacp_gpu_0' user='root' state='prsent'
register 注册变量 引用变量
# 查看全部端口 并把输出定义到host_port变量名里
- name: "get host port info"
shell: netstat -lntp
register: host_port
# 打印输出端口
- name: "print host port"
debug:
msg: "{{host_port['stdout_lines']}}"
# 查看时间 并把输出定义到date_output变量名里
- name: echo date
command: date
register: date_output
# 使用 when 对关键字对分析后的进行判断 匹配测执行这个task()
- name: echo date_output
command: echo "30"
when: date_output.stdout.split(' ')[2] == "30"
# 因为 register 获取到的输出内容都是字符串,可以使用 python 字符串的方法对其做处理
# 比如本文中使用的 split,还可以使用 find 方法
uri 模块
uri
url
until 直到后面的条件满足为真
retries 重试时长
delay 重试间隔时长
- name: check service is health
uri:
url: "http://127.0.0.1:{{ APP_PORT}}/healthz"
register: result
until: result.status == 200
retries: 20 #(最长等待20*5=100s)
delay: 5
authorized_key 分发公钥到远程主机
name 用户
key 公钥文件
state 状态
present 添加key
absent 移除key
exclusive 是否移除authorized_keys文件中其它非指定key(默认no)
# 使用authorized_key 模块免密登录(没验证过)
- name: push ssh pub key
authorized_key:
name: "root"
key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}'"
state: present
debug 模块 调试模块,用于在调试中输出信息
msg 输出的消息
var 指定变量(任务执行的输出作为变量)直接将其打印输出
verbosity debug的级别 默认0
# 为每个主机打印回送地址和网关地址的示例
- debug:
msg: "System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}"
- debug:
msg: "System {{ inventory_hostname }} has gateway {{ ansible_default_ipv4.gateway }}"
when: ansible_default_ipv4.gateway is defined
# 运行uptime状态信息,并显示信息
- shell: /usr/bin/uptime
register: result
- debug:
var: result
verbosity: 2
# 输入hostname
- name: Display all variables/facts known for a host
debug:
var: hostvars[inventory_hostname]
verbosity: 4
command、shell、raw 和 script 这四个模块的作用和用法都类似都用于远程执行命令或脚本
# 区别
command 执行简单的远程 shell 命令,不支持特殊符号< > | ; &
shell 执行简单的远程 shell 命令,支持解析特殊 shell 符号< > | ; &
raw 执行底层 shell 命令, 在没有python的远程主机上执行命令
script 在远程主机上执行管理主机上的脚本,不要求目标主机上已经装好python
#### 如果要安全且可预测地执行命令,最好改用 command 或 shell 模块 ###
# 实例 command
- name: command uptime
command:uptime
args:
chdir: /root
# 实例 shell 带特殊符号 进入目录 指定解析器
- name: shell uptime
shell:uptime > /root/test.txt
args:
chdir: /root
executable: /bin/bash
# 实例 raw
- name: raw uptime
war:uptime
args:
executable: /bin/bash
# 实例 script 在远程主机上执行管理机器上的脚本
- name: raw uptime
script:"/bin/bash files/test.sh"
args:
executable: /bin/bash
expect 用于在给的的节点上执行一个命令并响应提示 (python 要安装pexpect模块才能执行)
command 命令模块执行命令运行
responses 期望的字符串/正则表达式和字符串的映射来响应。 如果响应是一个列表,则连续的匹配将返回连续的响应
# 修改密码: 匹配不区分大小写的搜索用前缀?i (?!)password": 输入"kc@123456"
- name: change kcadmin password
ansible.builtin.expect:
command: passwd kcadmin
responses:
(?i)password: "kc@123456"
# 多次交互
vim sc.sh
read -p "111: " name1
read -p "222: " name2
read -p "pass: " name3
echo $name1 $name2 $name3
- name: Test Script
expect:
command: sc.sh
responses:
enter one: 'one'
enter two: 'two'
enter three: 'three'
enter password: 'pass'
echo: yes
本文来自博客园,站在巨人的肩膀上,坚持开源精神,遵循开源协议:Apache Licene 2.0协议。
浙公网安备 33010602011771号