- [defaults]
- inventory = /etc/ansible/hosts
- forks = 5
- sudo_user = root
其中 [defaults] 叫做配置组(section), 而 inventory,forks 是配置参数(options).
主机清单
ansible 主机清单就是记录被控制的机器的清单, 可分为动态主机清单和静态主机清单. 静态主机清单通过配置文件 ansible.cfg 的 inventory 选项指定文件路径, 用于定义多个被管控主机. 支持域名, IP, 并可对主机分组, 如下:
- [Web] #分组
- 10.1.210.53 #使用 IP 地址
- 10.1.210.51
- www.example.com #使用域名
- [db]
- 10.1.210.68
使用主机清单时候可以使用通配符, 切片, 逻辑表达式来使用. 例如:
- ansible 10.1.210.* -m ping #10.1.210.x 网段的所有主机
- ansible Web[0:3] -m ping #属于组 Web 的第 1 到 4 台主机
- ansible web1&web2 -m ping #属于组 web1 又属于 web2 的主机
三, Ansible 常用命令
ansible 常用命令比较多, 通常我们常用的就三个: ansible,ansible-doc,ansible-playbook. 以下是相关命令以及作用:
- /usr/bin/ansible #Ansibe AD-Hoc 临时命令执行工具, 常用于临时命令的执行
- /usr/bin/ansible-doc #Ansible 模块功能查看工具
- /usr/bin/ansible-galaxy #网络 roles 管理工具, 可在网站 (https://galaxy.ansible.com) 上传或下载比较优秀的 roles 代码
- /usr/bin/ansible-playbook #Ansible 定制自动化的任务集编排工具
- /usr/bin/ansible-pull #支持直接从 Git 下载 playbook 执行, 需要遵循其规定的目录格式通常在配置大批量机器的场景下会使用
- /usr/bin/ansible-vault #Ansible 文件加密工具
- /usr/bin/ansible-console #与用户交互的命令执行工具
- ansible-doc
ansible-doc 用于查看模块的使用方法, 常用方式如下:
- ansible-doc -l #获取全部模块的信息
- ansible-doc -s MOD_NAME #获取指定模块的使用帮助
示例查看 cron 模块参数:
ansible
ad-hoc 模式工具, 用于执行一次行命令使用语法:
ansible <host-pattern> <-m 模块> [-a args] [options]
options 常用选项:
- -a MODULE_ARGS #模块的参数, 如果执行默认 COMMAND 的模块, 即是命令参数, 如: "date","pwd" 等等
- -k,--ask-pass #ask for SSH password. 登录密码, 提示输入 SSH 密码而不是假设基于密钥的验证
- --ask-su-pass #ask for su password.su 切换密码
- -K,--ask-sudo-pass #ask for sudo password. 提示密码使用 sudo,sudo 表示提权操作
- --ask-vault-pass #ask for vault password. 假设我们设定了加密的密码, 则用该选项进行访问
- -B SECONDS #后台运行超时时间
- -C #模拟运行环境并进行预运行, 可以进行查错测试
- -c CONNECTION #连接类型使用
- -f FORKS #并行任务数, 默认为 5
- -i INVENTORY #指定主机清单的路径, 默认为 / etc/ansible/hosts
- --list-hosts #查看有哪些主机组
- -m MODULE_NAME #执行模块的名字, 默认使用 command 模块, 所以如果是只执行单一命令可以不用 -m 参数
- -o #压缩输出, 尝试将所有结果在一行输出, 一般针对收集工具使用
- -S #用 su 命令
- -R SU_USER #指定 su 的用户, 默认为 root 用户
- -s #用 sudo 命令
- -U SUDO_USER #指定 sudo 到哪个用户, 默认为 root 用户
- -T TIMEOUT #指定 SSH 默认超时时间, 默认为 10s, 也可在配置文件中修改
- -u REMOTE_USER #远程用户, 默认为 root 用户
- -v #查看详细信息, 同时支持 - vvv,-vvvv 可查看更详细信息
host-pattern: 在主机清单定义的目标主机, 可支持以下几种方式:
all: 表示主机清单中所有的主机
groupname: 表示组中的所有主机
host: 指定某台主机, 但是此主机必须在主机清单中
支持通配符 (*), 逻辑与(:&) 或(:)非 (:!) 和正则表达式(~)
示例:
- ansible all -m ping #所有默认 inventory 文件中的机器
- ansible "*" -m ping #同上
- ansible 10.1.210.* -m ping #所有 122.28.13.X 机器
- ansible web1:web2 -m ping #所有属于组 web1 或属于 web2 的机器
- ansible web1:!web2 -m ping #属于组 web1, 但不属于 web2 的机器
- ansible web1&web2 -m ping #属于组 web1 又属于 web2 的机器
- ansible webserver[0] -m ping #属于组 webserver 的第 1 台机器
- ansible webserver[0:5] -m ping #属于组 webserver 的第 1 到 4 台机器
- ansible-playbook
ansible-playbook 用于执行剧本命令, 语法:
ansible-playbook [options] playbook.YAML [playbook2 ...]
常用选项:
- -u REMOTE_USER, --user=REMOTE_USER #SSH 连接的用户名
- -k, --ask-pass #SSH 登录认证密码
- -s, --sudo #sudo 到 root 用户, 相当于 Linux 系统下的 sudo 命令
- -U SUDO_USER, --sudo-user=SUDO_USER #sudo 到对应的用户
- -K, --ask-sudo-pass #用户的密码(-sudo 时使用)
- -T TIMEOUT, --timeout=TIMEOUT #SSH 连接超时, 默认 10 秒
- -C, --check #指定该参数后, 执行 playbook 文件不会真正去执行, 而是模拟执行一遍, 然后输出本次执行会对远程主机造成的修改
- -e EXTRA_VARS, --extra-vars=EXTRA_VARS #设置额外的变量如: key=value 形式 或者 YAML or JSON, 以空格分隔变量, 或用多个 - e
- -f FORKS, --forks=FORKS #进程并发处理, 默认 5
- -i INVENTORY, --inventory-file=INVENTORY #指定 hosts 文件路径, 默认 default=/etc/ansible/hosts
- -l SUBSET, --limit=SUBSET #指定一个 pattern, 对 - hosts: 匹配到的主机再过滤一次
- --list-hosts #只打印有哪些主机会执行这个 playbook 文件, 不是实际执行该 playbook
- --list-tasks #列出该 playbook 中会被执行的 task
- --private-key=PRIVATE_KEY_FILE #私钥路径
- --step #同一时间只执行一个 task, 每个 task 执行前都会提示确认一遍
- --syntax-check #只检测 playbook 文件语法是否有问题, 不会执行该 playbook
- -t TAGS, --tags=TAGS #当 play 和 task 的 tag 为该参数指定的值时才执行, 多个 tag 以逗号分隔
- --skip-tags=SKIP_TAGS #当 play 和 task 的 tag 不匹配该参数指定的值时, 才执行
- -v, --verbose #输出更详细的执行过程信息,-vvv 可得到所有执行过程信息.
三, 快速开始
编写配置文件
前面提到了 ansible 在运行时候配置文件的读取顺序, 这里我们定义 / etc/ansible/ansible.cfg
- vi /etc/ansible/ansible.cfg
- [defaults]
- inventory = /etc/ansible/hosts
- forks = 5
- remote_port = 22
- host_key_checking = False
- timeout = 20
- remote_user = root
- log_path =/tmp/ansible.log
定义主机清单
配置完成 ansible 配置文件以后需要定义主机清单, 由于我们在配置文件中指明了 inventory 文件是 / etc/ansible/hosts, 所以需要在该路径下编辑主机清单:
- vi /etc/ansible/hosts
- [test]
- 10.1.210.51
- 10.1.210.53
以上定义了一个 test 组含有两个主机 10.1.210.51,10.1.210.53, 最基本的主机清单就定义完毕了, 当然主机清单中还运行定义 SSH 连接的一些参数, 如用户, 端口等:
- 10.1.210.51 ansible_ssh_user=root ansible_ssh_port=522
- 10.1.210.53 ansible_ssh_user=admin ansible_ssh_port=522
配置 SSH 免密钥
ansible 运行时基于 SSH, 你也可以选择不配置免密码, 但是这样每次运行 ansible 都需要输入密码, 这样比较麻烦, 这也不是推荐的方式, 更好的方式是是通过公私钥方式免密码登录.
首先生成密钥对:
- [root@app52 ~]# SSH-keygen -t rsa
- Generating public/private rsa key pair.
- Enter file in which to save the key (/root/.SSH/id_rsa):
- Created directory '/root/.ssh'.
- Enter passphrase (empty for no passphrase):
- Enter same passphrase again:
- Your identification has been saved in /root/.SSH/id_rsa.
- Your public key has been saved in /root/.SSH/id_rsa.pub.
- The key fingerprint is:
- SHA256:P7AbPwaKH0sPweOtmd8MJ3xevSIlrQx4zTtulxurMZI root@app52
- The key's randomart image is:
- +---[RSA 2048]----+
- | |
- | |
- | |
- | . |
- | +.So . |
- | ..=+=+ o. |
- | .=oE+B=o.. |
- | ...O &X=+o . |
- | .*.++B*oo. |
- +----[SHA256]-----+
拷贝公钥到两台目标主机:
- [root@app52 ~]# SSH-copy-id root@10.1.210.51
- /usr/bin/SSH-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
- The authenticity of host '10.1.210.51 (10.1.210.51)' can't be established.
- ECDSA key fingerprint is SHA256:nT15Ecx6eQNSmfpYlkMTAA13/P4povudxMzQiUgfYqo.
- ECDSA key fingerprint is MD5:da:f1:53:9e:33:22:40:f8:52:a5:9a:1c:5d:d8:64:e8.
- Are you sure you want to continue connecting (yes/no)? yes
- /usr/bin/SSH-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
- /usr/bin/SSH-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
- root@10.1.210.51's password:
- Number of key(s) added: 1
- Now try logging into the machine, with: "ssh'root@10.1.210.51'"
- and check to make sure that only the key(s) you wanted were added.
- [root@app52 ~]# SSH-copy-id root@10.1.210.53
- /usr/bin/SSH-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
- The authenticity of host '10.1.210.53 (10.1.210.53)' can't be established.
- ECDSA key fingerprint is SHA256:xgZWILH5LuqmfjXe6rM9TaMQ8nlrnZl1f+qa8QnlaeY.
- ECDSA key fingerprint is MD5:9a:fd:9a:0e:33:c4:0e:4b:6c:17:24:70:ad:f1:7a:f7.
- Are you sure you want to continue connecting (yes/no)? yes
- /usr/bin/SSH-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
- /usr/bin/SSH-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
- root@10.1.210.53's password:
- Number of key(s) added: 1
测试免密码登录:
- [root@app52 ~]# SSH 10.1.210.51
- Last login: Sun Mar 10 18:59:27 2019 from 10.1.201.30
- [root@app51 ~]#
运行模块
这里使用 ping 模块可以判断主机是否连通.
- [root@app52 ~]# ansible test -m ping
- 10.1.210.53 | SUCCESS => {
- "changed": false,
- "ping": "pong"
- }
- 10.1.210.51 | SUCCESS => {
- "changed": false,
- "ping": "pong"
- }
以上 ansible 就可以正常使用了, 下面介绍常用模块.
四, 常用模块
所用常用模块都遵循以下语法, 这里将介绍常用模块以及相关参数.
ansible <host-pattern> <-m 模块> [-a args] [options]
1. authorized_key 模块
该模块用于添加或推送密钥到远程主机, 在配置 ansible 无密码方式非常有用, 常用参数:
- key #公钥路径, 可以是本地文件, 可以是 url 地址, 本地文件时使用{
- {
- lookup('file','~/.ssh/id_rsa.pub')
- }
- },# url 使用 https://example.com/username.keys.
- manage_dir #是否创建或修改目标 authorized_keys 所在目录的所有者和权限. 默认为 yes. 使用自定义的目标路径时, 必须设置为 no
- path #authorized_keys 所在的目录, 默认为家目录下的. SSH 目录中
- state #是否将密钥添加到目标 authorized_keys 文件中, present 表示添加, absent 表示删除,
- user #指明添加到那个用户下的 authorized_keys 文件
演示:
推送 root 用户的公钥到目标主机
- [root@app52 ~]# ansible 10.1.210.53 -m authorized_key -a "user=root key={{lookup('file','~/.ssh/id_rsa.pub')}} state=present" -k
- SSH password:
- 10.1.210.53 | SUCCESS => {
- "changed": false,
- "comment": null,
- "exclusive": false,
- "follow": false,
- "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVlq85BhjzI9pTKBMW3h4Ntoto8FoBicifvhpZ4V2DhNr5nacKzIFTjcq/asFZ+VKJKoInRQkozRBnSrB1Rf5BbpOABK22ROgZUwkHX1H/emuuFm75s1o5y6/4Xkvfcwjczb0ZIzXSuSwSpXk66BaPRVSSVia4XLr6ZBzrZoGrTrwV1jK4phWI/cJTqdC9PSH24HfLyyPS1CMB9UWEQXGUMwem9Y9USOeAgrlVqFl3aoWx58SA6xnmm2hAefIKpDzIyuQaxCM7Yr5JdeXWlV4qE8ibBdPR3ltmZ7O2opZBRig+eMZmZoo0XpTKLbkDRHu3CxpECQAZ+nENG3apc9Yl root@app52",
- "key_options": null,
- "keyfile": "/root/.ssh/authorized_keys",
- "manage_dir": true,
- "path": null,
- "state": "present",
- "unique": false,
- "user": "root",
- "validate_certs": true
- }
- # 测试免密码登录
- [root@app52 ~]# SSH 10.1.210.53
- Last login: Wed Mar 20 21:38:57 2019 from 10.1.210.52
- [root@app53 ~]# exit
登出
Connection to 10.1.210.53 closed
示例中使用 - k 选择在 SSH 时候询问密码, 若要无秘钥推送需在主机清单文件指定 ansible_ssh_pass 参数配置密码:
- [test]
- 10.1.210.51 ansible_ssh_pass=1234qwer
- 10.1.210.53 ansible_ssh_pass=1234qwer
2. 命令模块 command
该模块用于直接在远程主机执行命令, 但不不支持 |(管道),$,& 等 shell 操作符, 这也是和 shell 模块的区别. 常用参数:
- chdir # 在执行命令之前, 先切换到该目录
- executable # 切换 shell 来执行命令, 需要使用命令的绝对路径
- free_form # 要执行的 Linux 指令, 一般使用 Ansible 的 - a 参数代替.
- creates # 文件路径, 当这个文件存在, 则该命令不执行, 可以用来做判断
- removes # 文件路径, 这个文件不存在, 则该命令不执行
演示:
使用 command 命令查看远程目录文件
- [root@app52 ~]# ansible test -m command -a 'ls -l'
- 10.1.210.53 | CHANGED | rc=0>>
总用量 8
-rw-------. 1 root root 1258 1 月 16 01:03 anaconda-ks.cfg
-rw-r--r-- 1 root root 521 1 月 16 10:50 rs.sh
10.1.210.51 | CHANGED | rc=0>>
总用量 220332
-rw-------. 1 root root 1258 1 月 16 00:15 anaconda-ks.cfg
-rw-r--r-- 1 root root 7 2 月 27 10:25 a.txt
-rw-r--r-- 1 root root 10240 3 月 1 15:42 backup.tar
drwxr-xr-x 6 root root 47 3 月 4 19:38 demo
-rw-r--r-- 1 root root 76 2 月 27 19:14 Dockerfile
-rw-r--r-- 1 root root 578 1 月 16 10:41 dr.sh
-rw-r--r-- 1 root root 559 1 月 16 14:53 nat.sh
-rw------- 1 root root 114356736 2 月 24 10:56 nginx-bus.tar.gz
-rw------- 1 root root 111224320 2 月 23 19:18 nginx.tar
同样的命令, 使用 creates 判断本次任务是否需要运行:
- [root@app52 ~]# ansible test -m command -a 'ls -l creates=/root/a.txt'
- 10.1.210.51 | SUCCESS | rc=0>>
- skipped, since /root/a.txt exists #由于 / root 目录下存在 a.txt 该条命令跳过
- 10.1.210.53 | CHANGED | rc=0>>
总用量 8
-rw-------. 1 root root 1258 1 月 16 01:03 anaconda-ks.cfg
-rw-r--r-- 1 root root 521 1 月 16 10:50 rs.sh
3. 命令模块 shell
shell 模块用于远程主机调用 shell 环境执行命令, 实际上是利用 / bin/sh 来执行命令的, 该模式下可以使用 shell 环境, 如 $,|,& 等, 其参数于 command 模块相差不大.
演示:
- [root@app52 ~]# ansible test -m shell -a 'cat /etc/passwd |grep root'
- 10.1.210.51 | CHANGED | rc=0>>
- root:x:0:0:root:/root:/bin/bash
- operator:x:11:0:operator:/root:/sbin/nologin
- 10.1.210.53 | CHANGED | rc=0>>
- root:x:0:0:root:/root:/bin/bash
- operator:x:11:0:operator:/root:/sbin/nologin
4. 文件管理 file 模块
文件模块用于管理文件或目录属性, 也可以创建文件或者目录. 常用参数:
- group # file/directory 的所属组
- owner # file/directory 的所有者
- mode # 修改权限, 格式可以是 0644,'u+rwx'或'u=rw,g=r,o=r'等
- path # 指定待操作的文件, 可使用别名'dest'或'name'来替代 path
- recurse # (默认 no)递归修改文件的属性信息, 要求 state=directory
- src # 创建链接时使用, 指定链接的源文件
- state # 创建状态, 对应以下参数:
- # directory: 如果目录不存在则递归创建
- # file: 文件不存在时, 不会被创建(默认值)
- # touch:touch 由 path 指定的文件, 即创建一个新文件, 或修改其 mtime 和 atime
- # link: 修改或创建软链接
- # hard: 修改或创建硬链接
- # absent: 目录和其中的文件会被递归删除, 文件或链接将取消链接状态
演示:
创建文件
- [root@app52 ~]# ansible 10.1.210.51 -m file -a 'path=/tmp/b.txt state=touch'
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "dest": "/tmp/b.txt",
- "gid": 0,
- "group": "root",
- "mode": "0644",
- "owner": "root",
- "size": 0,
- "state": "file",
- "uid": 0
- }
创建目录
- [root@app52 ~]# ansible 10.1.210.51 -m file -a 'path=/tmp/test state=directory'
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "gid": 0,
- "group": "root",
- "mode": "0755",
- "owner": "root",
- "path": "/tmp/test",
- "size": 6,
- "state": "directory",
- "uid": 0
- }
创建软连接文件
- [root@app52 ~]# ansible 10.1.210.51 -m file -a 'path=/tmp/link.txt src=/tmp/b.txt state=link'
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "dest": "/tmp/link.txt",
- "gid": 0,
- "group": "root",
- "mode": "0777",
- "owner": "root",
- "size": 10,
- "src": "/tmp/b.txt",
- "state": "link",
- "uid": 0
- }
- # 查看软连接文件
- [root@app52 ~]# ansible 10.1.210.51 -m command -a 'ls /tmp/link.txt -l'
- 10.1.210.51 | CHANGED | rc=0>>
lrwxrwxrwx 1 root root 10 3 月 19 19:54 /tmp/link.txt -> /tmp/b.txt
5. 文件复制 copy 模块
copy 模块用于拷贝文件到远程主机上. 默认情况下, ansible copy 会检查文件 md5 查看是否需要拷贝, 相同则不会拷贝, 否则会拷贝. 设置 force=yes(默认), 则当文件 md5 不同时 (即文件内容不同) 才覆盖拷贝, 设置 force=no 时, 则只拷贝对方没有的文件. 常用参数:
- src #被复制到远程主机的本地文件. 可以是绝对路径, 也可以是相对路径. 如果路径是一个目录, 则会递归复制, 用法类似于 "rsync"
- content #直接以 content 给定的字符串或变量值作为文件内容保存到远程主机上, 它会替代 src 选项
- dest #必选项, 将源文件复制到的远程主机的绝对路径
- backup #当文件内容发生改变后, 在覆盖之前把源文件备份, 备份文件包含时间信息
- directory_mode #递归设定目录的权限, 默认为系统默认权限
- follow=[yes|no] #是否追踪到链接的文件
- force #当目标主机包含该文件, 但内容不同时, 设为 "yes", 表示强制覆盖; 设为 "no", 表示目标主机的目标位置不存在该文件才复制. 默认为 "yes"
- group #设置远程文件的组
- owner #设置远程文件的所有者
- mode #设置远程文件的权限
演示:
复制文件
- [root@app52 ~]# ansible 10.1.210.51 -m copy -a 'src=/tmp/ansible.log dest=/root/'
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "checksum": "195af61477099d1334f7b2749f93707d367f00a4",
- "dest": "/root/ansible.log",
- "gid": 0,
- "group": "root",
- "md5sum": "5fc43e79e4af07c52a44817f29dc8a3d",
- "mode": "0644",
- "owner": "root",
- "size": 4343,
- "src": "/root/.ansible/tmp/ansible-tmp-1553067283.66-49657624579833/source",
- "state": "file",
- "uid": 0
- }
复制文件添加内容, 指定用户和权限
- [root@app52 ~]# ansible 10.1.210.51 -m copy -a "content='this is wd'dest=/root/name.txt mode=644 owner=admin group=admin"
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "checksum": "3fd0fcff54aa1995f1b40a93a99b8708768a5e37",
- "dest": "/root/name.txt",
- "gid": 1000,
- "group": "admin",
- "md5sum": "f5b049c476514533b2cd5de017687f8f",
- "mode": "0644",
- "owner": "admin",
- "size": 10,
- "src": "/root/.ansible/tmp/ansible-tmp-1553067559.26-33339680488448/source",
- "state": "file",
- "uid": 1000
- }
- # 查看文件
- [root@app52 ~]# ansible 10.1.210.51 -m shell -a 'ls /root/name.txt -l'
- 10.1.210.51 | CHANGED | rc=0>>
-rw-r--r-- 1 admin admin 10 3 月 20 15:39 /root/name.txt
覆盖文件并备份
- [root@app52 ~]# ansible 10.1.210.51 -m copy -a "content='this is jack'dest=/root/name.txt backup=yes"
- 10.1.210.51 | CHANGED => {
- "backup_file": "/root/name.txt.19514.2019-03-20@15:47:45~",
- "changed": true,
- "checksum": "32ed47aa1178639f3012ac6c28dafb80045328a3",
- "dest": "/root/name.txt",
- "gid": 1000,
- "group": "admin",
- "md5sum": "ab8d83c62bbb601c81166dce3b1e0a90",
- "mode": "0644",
- "owner": "admin",
- "size": 12,
- "src": "/root/.ansible/tmp/ansible-tmp-1553068064.26-211248349931283/source",
- "state": "file",
- "uid": 1000
- }
- # 查看文件内容
- [root@app52 ~]# ansible 10.1.210.51 -m shell -a 'cat /root/name.txt'
- 10.1.210.51 | CHANGED | rc=0>>
- this is jack
- # 备份文件为文件名 + 时间
- [root@app52 ~]# ansible 10.1.210.51 -m shell -a 'ls /root/name.* -l'
- 10.1.210.51 | CHANGED | rc=0>>
-rw-r--r-- 1 admin admin 12 3 月 20 15:47 /root/name.txt
-rw-r--r-- 1 admin admin 10 3 月 20 15:39 /root/name.txt.19514.2019-03-20@15:47:45~
6. 文件获取 fetch
该模块用于从远程主机上获取文件到本地, 常用参数:
- src #远程文件路径
- dest #本次存放的文件的目录, 如果不存在会创建
- validate_checksum #获取到文件到本地后检查文件的 md5 是否一致
- fail_on_missing #当文件不存在是标记为失败, 默认 yes
演示:
从 10.1.210.51 上拉去 name.txt
- [root@app52 ~]# ansible 10.1.210.51 -m fetch -a 'src=/root/name.txt dest=/root validate_checksum=yes'
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "checksum": "32ed47aa1178639f3012ac6c28dafb80045328a3",
- "dest": "/root/10.1.210.51/root/name.txt",
- "md5sum": "ab8d83c62bbb601c81166dce3b1e0a90",
- "remote_checksum": "32ed47aa1178639f3012ac6c28dafb80045328a3",
- "remote_md5sum": null
- }
- # 注意其保存文件路径是目录是以远程节点的 ip 地址为目录的一个文件夹, 这样做为了防止相同文件重复和覆盖
- # 查看刚才获取的文件
- [root@app52 ~]# cat /root/10.1.210.51/root/name.txt
- this is jack
7. 包管理 yum 模块
该模块用于软件包的安装, 卸载, 升级等. 常用参数:
- disable_gpg_check #安装包时禁止 gpgcheck, 仅在 state=present 或 latest 时生效.
- disablerepo #禁用指定的仓库, 多个仓库使用逗号分隔.
- enablerepo #指定使用那个仓库
- exclude #排除哪些包不安装, 仅在 state=present 或 latest 时生效.
- list #列出可安装的包类似于 yum list.
- name #指定安装的包名, 可带上版本号. 多个包可使用逗号分隔.
- update_cache #强制更新 yum 的缓存
- state #安装或卸载包, present,installed,latest 用于安装包, absent,removed 用于移除已安装包.
- # 说明
- #name 需要配合 state 来使用, 如果 state 指定为 present/installed/latest 将安装包, 其中 latest 是安装最新包, 默认为 present. 如果指定为 absent/removed 则用于卸载包.
- # 在 ansible 中, 很多地方都会出现 present 和 absent 的状态, 一般都表示目标资源的创建和删除.
演示:
列出包:
- [root@app52 ~]# ansible 10.1.210.51 -m yum -a 'list=httpd'
- 10.1.210.51 | SUCCESS => {
- "ansible_facts": {
- "pkg_mgr": "yum"
- },
- "changed": false,
- "results": [
- {
- "arch": "x86_64",
- "envra": "0:httpd-2.4.6-88.el7.centos.x86_64",
- "epoch": "0",
- "name": "httpd",
- "release": "88.el7.centos",
- "repo": "base",
- "version": "2.4.6",
- "yumstate": "available"
- }
- ]
- }
安装 httpd 服务
- [root@app52 ~]# ansible 10.1.210.51 -m yum -a 'name=httpd state=present'
- 10.1.210.51 | CHANGED => {
- "ansible_facts": {
- "pkg_mgr": "yum"
- },
- "changed": true,
- "msg": "",
- "rc": 0,
- "results": [
- "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirrors.huaweicloud.com\n * extras: mirrors.tuna.tsinghua.edu.cn\n * updates: mirrors.tuna.tsinghua.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.4.6-88.el7.centos will be installed\n--> Processing Dependency: httpd-tools = 2.4.6-88.el7.centos for package: httpd-2.4.6-88.el7.centos.x86_64\n--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-88.el7.centos.x86_64\n--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-88.el7.centos.x86_64\n--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-88.el7.centos.x86_64\n--> Running transaction check\n---> Package apr.x86_64 0:1.4.8-3.el7_4.1 will be installed\n---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed\n---> Package httpd-tools.x86_64 0:2.4.6-88.el7.centos will be installed\n---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n httpd x86_64 2.4.6-88.el7.centos base 2.7 M\nInstalling for dependencies:\n apr x86_64 1.4.8-3.el7_4.1 base 103 k\n apr-util x86_64 1.5.2-6.el7 base 92 k\n httpd-tools x86_64 2.4.6-88.el7.centos base 90 k\n mailcap noarch 2.1.41-2.el7 base 31 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package (+4 Dependent packages)\n\nTotal download size: 3.0 M\nInstalled size: 10 M\nDownloading packages:\n--------------------------------------------------------------------------------\nTotal 2.2 MB/s | 3.0 MB 00:01 \nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : apr-1.4.8-3.el7_4.1.x86_64 1/5 \n Installing : apr-util-1.5.2-6.el7.x86_64 2/5 \n Installing : httpd-tools-2.4.6-88.el7.centos.x86_64 3/5 \n Installing : mailcap-2.1.41-2.el7.noarch 4/5 \n Installing : httpd-2.4.6-88.el7.centos.x86_64 5/5 \n Verifying : httpd-tools-2.4.6-88.el7.centos.x86_64 1/5 \n Verifying : apr-1.4.8-3.el7_4.1.x86_64 2/5 \n Verifying : mailcap-2.1.41-2.el7.noarch 3/5 \n Verifying : httpd-2.4.6-88.el7.centos.x86_64 4/5 \n Verifying : apr-util-1.5.2-6.el7.x86_64 5/5 \n\nInstalled:\n httpd.x86_64 0:2.4.6-88.el7.centos \n\nDependency Installed:\n apr.x86_64 0:1.4.8-3.el7_4.1 apr-util.x86_64 0:1.5.2-6.el7 \n httpd-tools.x86_64 0:2.4.6-88.el7.centos mailcap.noarch 0:2.1.41-2.el7 \n\nComplete!\n"
- ]
- }
卸载包
- [root@app52 ~]# ansible 10.1.210.51 -m yum -a 'name=httpd state=absent'
- 10.1.210.51 | CHANGED => {
- "ansible_facts": {
- "pkg_mgr": "yum"
- },
- "changed": true,
- "msg": "",
- "rc": 0,
- "results": [
- "已加载插件: fastestmirror\n 正在解决依赖关系 \ n--> 正在检查事务 \ n---> 软件包 httpd.x86_64.0.2.4.6-88.el7.centos 将被 删除 \ n--> 解决依赖关系完成 \ n\n 依赖关系解决 \ n\n================================================================================\n Package 架构 版本 源 大小 \ n================================================================================\n 正在删除:\n httpd x86_64 2.4.6-88.el7.centos @base 9.4 M\n\n 事务概要 \ n================================================================================\n 移除 1 软件包 \ n\n 安装大小: 9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n 正在删除 : httpd-2.4.6-88.el7.centos.x86_64 1/1 \n 验证中 : httpd-2.4.6-88.el7.centos.x86_64 1/1 \n\n 删除:\n httpd.x86_64 0:2.4.6-88.el7.centos \n\n 完毕!\n"
- ]
- }
8. 服务管理 service 模块
service 模块用于管理 service 服务, 常用参数:
- enabled #是否开机自启动
- name #服务名称
- arguments #提供额外的参数
- runlevel #启动级别
- sleep #服务重启的等待时间, 通常指服务关闭后启动等待的时间.
- state #管理服务发生的行为, 四种行为 started(启动), stopped(停止), restarted(重启),reloaded(重载)
演示:
重启 sshd 服务
- [root@app52 ~]# ansible 10.1.210.51 -m service -a 'name=sshd state=restarted'
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "name": "sshd",
- "state": "started",
- "status": {
- "ActiveEnterTimestamp": "五 2019-02-01 10:08:56 CST",
- "ActiveEnterTimestampMonotonic": "5276411",
- "ActiveExitTimestampMonotonic": "0",
- "ActiveState": "active",
- "After": "basic.target network.target system.slice systemd-journald.socket sshd-keygen.service",
- "AllowIsolate": "no",
设置 sshd 服务为开机自启动
- root@app52 ~]# ansible 10.1.210.51 -m service -a 'name=sshd enabled=yes'
- 10.1.210.51 | SUCCESS => {
- "changed": false,
- "enabled": true,
- "name": "sshd",
- "status": {
"ActiveEnterTimestamp": " 三 2019-03-20 17:24:11 CS
9. systemd 模块
该模块用于管理 systemd 所管理的服务, 该模块类似于 service 模块, 由于 centos7.x 系统服务受 systemd 控制, 所以 ansible 提供与之对应的模块管理, 常用参数:
- daemon_reload #是否进行 systemctl daemon-reload 操作
- enabled #设置是否服务开机自启动
- masked #是否将此 unit 做 mask(隐藏, 掩盖)处理. mask 后的 unit 将无法启动
- name #服务名称
- state #service 模块, 四种状态: started,stopped,restarted,reloaded
演示:
启动 httpd 服务(前提已经安装)
- [root@app52 ~]# ansible 10.1.210.51 -m systemd -a 'name=httpd state=started'
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "name": "httpd",
- "state": "started",
- "status": {
- "ActiveEnterTimestampMonotonic": "0",
- "ActiveExitTimestampMonotonic": "0",
- "ActiveState": "inactive",
- "After": "remote-fs.target basic.target systemd-journald.socket tmp.mount network.target nss-lookup.target -.mount system.slice",
- "AllowIsolate": "no",
- "AmbientCapabilities": "0",
10. 用户管理 user 模块
该模块用于管理远程主机的用户. 常用参数:
- comment #用户描述信息
- createhome #是否穿件家目录, 默认创建(需要 ansible 版本大于 2.5)
- force # 强制删除用户, 在使用 state=absent 时, 行为与 userdel -force 一致.
- group #指定该用户的组
- groups #指定该用户的附加组
- home #指定用户家目录
- move_home #移动家目录到某个目录
- name #用户名称
- uid #设置用户 uid
- password #设置用户密码
- remove #删除用户时 (state=absent) 移除与之关联的目录, 行为与 userdel -remove 一致
- shell #指定默认 shell, 默认是 / bin/bash
- state #创建还是删除用户, present 创建, absent 删除
- system #标记为系统用户, 该操作不能对已经存在的用户生效
- update_password #密码修改策略, always 总是修改, 无论当前用户是否存在, on_create 代表只有新建才修改
演示:
创建一个 zabbix 用户, 指定 shell, 并指定家目录
- [root@app52 ~]# ansible 10.1.210.51 -m user -a 'name=zabbix state=present shell=/sbin/nologin home=/home/zabbix'
- 10.1.210.51 | CHANGED => {
- "append": false,
- "changed": true,
- "comment": "",
- "group": 1001,
- "home": "/home/zabbix",
- "move_home": false,
- "name": "zabbix",
- "shell": "/sbin/nologin",
- "state": "present",
- "uid": 1001
- }
修改刚才创建 zabbix 用户的家目录
- [root@app52 ~]# ansible 10.1.210.51 -m user -a 'name=zabbix state=present home=/home/myhome'
- 10.1.210.51 | CHANGED => {
- "append": false,
- "changed": true,
- "comment": "",
- "group": 1001,
- "home": "/home/myhome",
- "move_home": false,
- "name": "zabbix",
- "shell": "/sbin/nologin",
- "state": "present",
- "uid": 1001
- }
- ### 查看修改的用户
- [root@app52 ~]# ansible 10.1.210.51 -m shell -a 'cat /etc/passwd |grep zabbix'
- 10.1.210.51 | CHANGED | rc=0>>
- zabbix:x:1001:1001::/home/myhome:/sbin/nologin
删除用户
- [root@app52 ~]# ansible 10.1.210.51 -m user -a 'name=zabbix state=absent'
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "force": false,
- "name": "zabbix",
- "remove": false,
- "state": "absent"
- }
11. 定时任务 cron 模块
cron 模块用于管理 unix 定时任务, 常用参数:
- inute #分钟, 指定默认是 *, 数字范围 0-59
- hour #小时, 不指定默认是 *, 范围 0-23, 支持 unix 语法, 如(0-23, *, */2)
- day #日, 不指定默认为 *, 范围 1-31
- month #月, 不指定默认为 *, 范围 1-12
- weekday #周, 不指定默认为 *, 范围 0-6
- name #计划任务名称
- user #指定运行计划任务的用户
- job #指定运行计划任务的命令
- state #计划任务状态, present 表示创建, absent 表示删除
- disabled #禁止或开启计划任务, yes 代表禁止, no 代表开启, 使用该参数时候需要指定计划任务 name 和 job
- reboot #主机重启时候是否需要执行, yes/no
- backup #yes/no 如果设置了, 则会在修改远程 cron_file 前备份这些文件
- Special_time #特定时间运行, 可选值 reboot(重启后),yearly(每年),annually(每年, 与 yearly 相同),monthly(每月),weekly(每周),daily(每天),hourly(每时).
演示:
创建一个每天 6 点半执行的计划任务
- [root@app52 ~]# ansible 10.1.210.51 -m cron -a "name='test crontab'hour=6 minute=30 job='echo this is wd'state=present"
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "envs": [],
- "jobs": [
- "test crontab"
- ]
- }
- # 查看计划任务
- [root@app52 ~]# ansible 10.1.210.51 -m shell -a 'crontab -l'
- 10.1.210.51 | CHANGED | rc=0>>
- #Ansible: test crontab
- 30 6 * * * echo this is wd
禁用计划任务
- [root@app52 ~]# ansible 10.1.210.51 -m cron -a "name='test crontab'job='echo this is wd'disabled=yes"
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "envs": [],
- "jobs": [
- "test crontab"
- ]
- }
- # 查看禁用的计划任务
- [root@app52 ~]# ansible 10.1.210.51 -m shell -a 'crontab -l'
- 10.1.210.51 | CHANGED | rc=0>>
- #Ansible: test crontab
- #* * * * * echo this is wd
删除计划任务
- [root@app52 ~]# ansible 10.1.210.51 -m cron -a "name='test crontab'state=absent"
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "envs": [],
- "jobs": []
- }
- # 查看已经没有了
- [root@app52 ~]# ansible 10.1.210.51 -m shell -a 'crontab -l'
- 10.1.210.51 | CHANGED | rc=0>>
12. 运行脚本 script 模块
该模块用于将本地的脚本在远程主机上运行, 使用的是远程主机的 shell 环境, 常用参数如下:
- chdir # 运行脚本前先切换目录
- creates # 远程主机上的文件路径, 用于判断, 当文件存在时候, 本次任务不会运行
- executable: # 可执行文件, 调用脚本的
- removes # 远程主机上的文件路径, 也用于判断, 当文件不存在时候, 本次任务不会执行
演示:
切换目录运行一个脚本
创建脚本
- vi test.sh
- #!/bin/sh
- touch ab.txt
- echo "test script">> ab.txt
- # 添加执行权限
- [root@app52 ~]# chmod a+x test.sh
- # 远程主机上运行脚本
- [root@app52 ~]# ansible 10.1.210.51 -m script -a "chdir=/tmp /root/test.sh"
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "rc": 0,
- "stderr": "Shared connection to 10.1.210.51 closed.\r\n",
- "stderr_lines": [
- "Shared connection to 10.1.210.51 closed."
- ],
- "stdout": "",
- "stdout_lines": []
- }
- # 查看创建的文件
- [root@app52 ~]# ansible 10.1.210.51 -m shell -a 'cat /tmp/ab.txt'
- 10.1.210.51 | CHANGED | rc=0>>
- test script
13. 目录同步 synchronize 模块
该模块用于文件或者目录同步, 实现了简单的 rsync 命令功能, 没有 Linux 中的 rsync 功能完整, 但是对于一些目录同步功能已经够用了. 常用参数:
- src #指定待传输的源文件. 可以是相对路径, 也可以是绝对路径.
- dest #目标路径. 可以是绝对路径, 也可以是相对路径.
- mode #指定推 (push) 还是拉 (pull) 的传输模式.
- archive #等价于 rsync 的 "-a" 选项, 即使用归档模式. 它等价于 rsync 的 "-rtopgDl" 选项. 值为 yes/no.
- times #保留 mtime 属性.
- group #保留所属组属性.
- owner #保留所有者属性.
- links #拷贝链接文件自身.
- perms #保留权限属性.
- recursive #递归到目录中的文件.
- compress #传输过程中压缩传输. 应该总是开启, 除非遇到问题. 即 rsync 的 "-z" 选项.
- copy_links #拷贝软链接的文件名和其指向的文件的内容. 即 a 指向 b 文件时, 将在目标端生成 a 普通文件, 但此文件中的内容是 b 中的内容.
- dirs #非递归方式传输目录.
- delete #目标端如果比源端文件多, 则删除这些多出来的文件, 要求 recursive=yes.
- checksum #等价于 "-c" 选项, 将基于文件的 checksum 来判断是否同步, 而不是默认的 quick check
- existing_only #接收端没有的文件不同步. 但仍会传输, 只是临时文件重组后不重命名而已.
- partial #等价于 "--partial" 选项. 默认 rsync 在传输中断时会删除传输了一半的文件, 指定该选项将保留这部分不完整的文件, 使得下次传输时可以直接从未完成的数据块开始传输.
- dest_port #远程主机 SSH 的连接端口.
- rsync_opts #指定额外的 rsync 选项. 使用数组的方式传递这些选项.
- rsync_path #当不指定 rsync 路径时, 默认为 / usr/bin/rysnc.
- rsync_timeout #指定超时时间, rsync 在多久时间内还没有数据传输就超时退出.
- verify_host #对目标主机进行 SSH 的 host key 验证.
演示:
将本地 / tmp 目录同步到 10.1.210.51/tmp / 目录下
- [root@app52 tmp]# ansible 10.1.210.51 -m synchronize -a 'src=/tmp dest=/tmp archive=yes'
- 10.1.210.51 | CHANGED => {
- "changed": true,
- "cmd": "/usr/bin/rsync --delay-updates -F --compress --archive --rsh=/usr/bin/ssh -S none -o Port=22 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null --out-format=<<CHANGED>>%i %n%L /tmp root@10.1.210.51:/tmp",
- "msg": "cd+++++++++ tmp/\n<f+++++++++ tmp/ansible.log\n<f+++++++++ tmp/yum_save_tx.2019-03-11.11-15.DZcIkr.yumtx\n<f+++++++++ tmp/yum_save_tx.2019-03-11.11-19.Qc5Kc3.yumtx\ncd+++++++++ tmp/.ICE-unix/\ncd+++++++++ tmp/.Test-unix/\ncd+++++++++ tmp/.X11-unix/\ncd+++++++++ tmp/.XIM-unix/\ncd+++++++++ tmp/.font-unix/\ncd+++++++++ tmp/ansible_synchronize_payload_EWJueH/\n<f+++++++++ tmp/ansible_synchronize_payload_EWJueH/__main__.py\n<f+++++++++ tmp/ansible_synchronize_payload_EWJueH/__main__.pyc\n<f+++++++++ tmp/ansible_synchronize_payload_EWJueH/ansible_synchronize_payload.zip\ncd+++++++++ tmp/systemd-private-7f85d6b12aa643b4bc7c7563e118eb6f-chronyd.service-v9nL5T/\ncd+++++++++ tmp/systemd-private-7f85d6b12aa643b4bc7c7563e118eb6f-chronyd.service-v9nL5T/tmp/\n",
- "rc": 0,
- "stdout_lines": [
- "cd+++++++++ tmp/",
- "<f+++++++++ tmp/ansible.log",
- "<f+++++++++ tmp/yum_save_tx.2019-03-11.11-15.DZcIkr.yumtx",
- "<f+++++++++ tmp/yum_save_tx.2019-03-11.11-19.Qc5Kc3.yumtx",
- "cd+++++++++ tmp/.ICE-unix/",
- "cd+++++++++ tmp/.Test-unix/",
- "cd+++++++++ tmp/.X11-unix/",
14. 信息采集 setup 模块
setup 模块用于手机远程主机的设备信息, 包括操作系统版本, CPU,IP 地址, 内存等重要信息. 默认情况下, 当 ansible 执行 playbook 时会先使用该模块收集远程主机信息, 可通过 gather_facts :False 参数来指定不收集 facts 信息来加快 playbook 运行速度. 常用参数:
- filter #过滤收集的主机信息, 支持通配符
- gather_subset #收集指定类型的信息, 可选的有 all(所有),min(精简),hardware(硬件),network(网络)等, 多个使用逗号隔开, 可以使用操作符号!, 代表去反
- gather_timeout #设置收集超时时间
演示:
收集主机信息, 并存放在本地
- [root@app52 action]# ansible test -m setup --tree /tmp/facts
- # 保存形式是每一个 IP 一个文件
- [root@app52 action]# ls /tmp/facts/
- 10.1.210.32 10.1.210.33 10.1.210.51 10.1.210.53
- # 查看信息
- [root@app52 action]# cat /tmp/facts/10.1.210.32
- {
- "ansible_facts": {"ansible_all_ipv4_addresses": ["10.0.0.125", "10.0.0.1", "10.0.0...
过滤收集的信息
- [root@app52 action]# ansible 10.1.210.51 -m setup -a 'filter=ansible_*_mb'
- 10.1.210.51 | SUCCESS => {
- "ansible_facts": {
- "ansible_memfree_mb": 218,
- "ansible_memory_mb": {
- "nocache": {
- "free": 7407,
- "used": 415
- },
- "real": {
- "free": 218,
- "total": 7822,
- "used": 7604
- },
- "swap": {
- "cached": 3,
- "free": 8043,
- "total": 8063,
- "used": 20
- }
- },
- "ansible_memtotal_mb": 7822,
- "ansible_swapfree_mb": 8043,
- "ansible_swaptotal_mb": 8063
- },
- "changed": false
- }
收集指定类型的信息, 这里只收集硬件和网络的信息:
- [root@app52 action]# ansible 10.1.210.51 -m setup -a 'gather_subset=network,hardware' |Less
- 10.1.210.51 | SUCCESS => {
- "ansible_facts": {
- "ansible_all_ipv4_addresses": [
- "10.1.210.51",
- "172.17.0.1"
- ],
- "ansible_all_ipv6_addresses": [
- "fe80::1caa:6cff:fe84:e466",
- "fe80::7828:2fff:fec8:5251",
- "fe80::38ab:99ff:fe54:dd71",
- "fe80::1496:77ff:fe7d:ee8b",
- "fe80::d80d:90ff:fe2b:1c3f",
- "fe80::dbc9:8e18:ea5e:fc02",
- "fe80::42:31ff:febb:2858",
- "fe80::60b8:daff:fe5f:356d",
- "fe80::7083:f1ff:fe03:78d3"
- ],
- "ansible_apparmor": {
- "status": "disabled"
- },
- "ansible_architecture": "x86_64",
- "ansible_bios_date": "04/05/2016",
- "ansible_bios_version": "6.00",
- "ansible_cmdline": {
- "BOOT_IMAGE": "/vmlinuz-3.10.0-693.el7.x86_64",
- "LANG": "zh_CN.UTF-8",
总结
本文详细了介绍了 ansible 的基本使用方法, 并将常用模块也做了一一介绍, 这些模块涵盖了日常运维操作的大部分操作, 不难发现通过 ansible 批量操作主机非常的方便, 但是也具有一定的危险性比如一旦操作失误将影响大批主机, 使用时候应该小心. 此外, 当有一些复杂的运维操作时(比如源码安装 nginx,MySQL 等),ansible-doc 模式还是有局限性, 而 ansible 为我们提供了 playbook 以及 role 管理, 让这复杂操作都变得简单和有条理, 下一篇文章将介绍 playbook 和 role 的使用.
来源: https://www.cnblogs.com/wdliu/p/10572532.html