Ansible 模块命令讲解、剧本 原文链接:https://blog.csdn.net/MssGuo/article/details/125794132
Ansible 的颜色 Ansible 的返回结果非常友好,一般会用三种颜色来表示执行结果:
颜色
是否成功
说明
绿色
成功
没有对目标机器做修改
橘黄色
成功
执行后目标机器有状态变化
红色
失败
执行过程出现异常
Ansible 语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD] [--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts] [-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE] [-k] [--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER] [-c CONNECTION] [-T TIMEOUT] [--ssh-common-args SSH_COMMON_ARGS] [--sftp-extra-args SFTP_EXTRA_ARGS] [--scp-extra-args SCP_EXTRA_ARGS] [--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D] [-e EXTRA_VARS] [--vault-id VAULT_IDS] [--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES] [-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR] [-a MODULE_ARGS] [-m MODULE_NAME] pattern
1 2 3 4 5 6 7 8 9 10 11 12 -i :指定主机清单,不指定默认是 /etc/ansible/hosts; --list-hosts: 列出指定组里有哪些主机; -o :简化输出,显示为一行; -u,--user=REMOTE_USER : 远程执行时受控主机的用户; -k, --ask-pass :提示输入 ssh 密码,默认 key 验证; -K, --ask-become-pass : 提示输入 sudo 时的密码口令; -b,--become:特权方式运行命令; -T,--timeout=TIMEOUT : 执行命令时的超时时间,默认 10s; -f 10 :指定 ansible 并行线程数,在高并发场景下可以指定 ansible 的线程数,可以让 ansible 执行时启动多个线程发送命令到受控主机从而提高效率。默认是 5 个线程; -m: 指定模块,m 是 module 的缩写,不指定模块缺省值默认是 command,可以在 ansible.cfg 配置文件中配置默认模块。 -a:指定模块所要执行的命令,参数等。 -l,--limit: 指只针对某个组的某些主机执行。
演示示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 查看 /etc/ansible/hosts 主机清单的 node 组有哪些主机 ansible -i /etc/ansible/hosts node --list-hosts # 查看默认主机文件 /etc/ansible/hosts 主机清单的全部受控主机 ansible all --list-hosts # -u 指定远程执行的用户为 guo, # -b 指定以 root 特权方式运行命令, # -k 表示输入 ssh 登陆密码, # -K 表示特权方式时输入 sudo 密码, # -T 指定命令超时时间, # -m 指定要使用模块是 shell 模块, # -a 指定要运行的命令. ansible -i /etc/ansible/hosts node -u guo -b -k -K -T 20 -m shell -a 'ls -l /root' # 针对全部主机里的 192.168.118.133 执行 ansible all -m ping --limit 192.168.118.133 # 针对node组里的192.168.118.133执行 ansible node -m ping -l 192.168.118.133
Ansible 的 Host-pattern all: 表示主机清单所有的主机,如下所示:
1 2 # all 表示主机清单所有的主机 ansible -i /etc/ansible/hosts all -m ping
指定主机清单的某个组,如指定 node 组,如下所示:
1 2 # 指定 node 组 ansible -i /etc/ansible/hosts node -m ping
指定主机清单的某个主机 IP,如下所示:
1 2 # 指定主机清单里面的 192.168.118.132 这台受控主机 ansible -i /etc/ansible/hosts 192.168.118.132 -m ping
*使用通配符模糊匹配组,如下所示:
1 2 # 模糊匹配带有 web 后缀的组 ansible -i /etc/ansible/hosts *web -m ping
或关系,表示在 A 组或 B 组中的主机,如下所示:
1 2 3 4 5 # 表示在 node 组或 web 组中的主机 ansible -i /etc/ansible/hosts 'node:web' -m ping # 也表示或关系 ansible '192.168.118.132:192.168.118.133' -m ping
逻辑与:表示同时在 A 组和 B 组中的主机,如下所示:
1 2 # 同时在 node 组和 web 组中的主机 ansible -i /etc/ansible/hosts 'node:&web' -m ping
逻辑非:表示在 A 组,但不在 B 组中的主机,如下所示:
1 2 3 4 5 # 同时在 node 组但不在 web 组中的主机 ansible -i /etc/ansible/hosts 'node:!web' -m ping # 同上,表示在 node 组但不在 web 组中的主机 ansible -i /etc/ansible/hosts '!web:node' -m ping
综合逻辑:可以把上面的逻辑组合起来形成综合逻辑,如下所示:
1 2 # 表示在 web 组或 node 组同时又在 redis 组但不在 db 组中的主机 ansible -i /etc/ansible/hosts 'web:node:&redis!db:' -m ping
正则表达式:
1 2 # 表示匹配以 web 或 node 开头 servers 结尾的组中的主机 ansible -i /etc/ansible/hosts '~(web|node)servers' -m ping
file 模块 作用:主要用于在目标受控主机上创建文件,目录,删除文件等操作。
参数:
1 2 3 4 5 6 path:指定路径,path 的别名是 dest, name state:表示状态,absent 删除文件或目录, directory 创建目录, file, hard 创建硬链接, link 创建软链接, touch 创建普通文件,默认是:file owner:属主 group:属组 mode:设置权限 src:表示创建的是软硬链接时链接到的源文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 查看 file 模块帮助文档 ansible-doc file # 创建一个普通文件 ansible -i /etc/ansible/hosts all -m file -a 'path=/root/test.txt state=touch' # 创建一个目录 ansible -i /etc/ansible/hosts all -m file -a 'path=/root/k8s state=directory' # 创建一个可执行文件属组是 root,属组也是 root,权限是 755 ansible -i /etc/ansible/hosts all -m file -a 'path=/root/run.sh state=touch mode=755 owner=root group=root' # 删除文件或目录(会级联删除) ansible -i /etc/ansible/hosts all -m file -a 'name=/root/k8s state=absent'
copy 模块 作用:主要用于复制 ansible
主控端的文件到受控端上
1 2 3 4 5 6 7 8 9 10 11 # 查看 copy 模块帮助文档 ansible-doc cppy # src 指定源文件,dest 指定目标路径 ansible -i /etc/ansible/hosts node -m copy -a 'src=/root/test_file1 dest=/root/' # src 指定源文件,dest 指定目标路径,owner group mode 等参数可以指定文件属性 ansible -i /etc/ansible/hosts node -m copy -a 'src=/root/test_file2 dest=/root/ owner=root group=fuji mode=755' # backu=yes 表示当 src 源文件改变了,目标机器上具有同名文件时,备份同名的目标文件,默认 backup=no 不备份直接覆盖目标主机上同名文件,备份的文件名会加上年月日时分秒 ansible -i /etc/ansible/hosts node -m copy -a 'src=/root/test_file2 dest=/root/ owner=root group=fuji mode=755 backup=yes'
fetch 模块 作用:从远程主机上抓取文件到主控端上。fetch
模块功能与 copy
模块功能整好相反。
1 2 3 # 从远程主机上抓取 /var/log/messages 文件到 /root/logs/ 目录下 # src 参数表示远程文件,必须是一个文件,不能是目录;dest 是本地目录 ansible all -m fetch -a 'src=/var/log/messages dest=/root/logs/'
1 2 3 4 5 6 7 8 9 10 11 # 抓取后的文件,其实是用主机地址为目录做了区分,同时被抓取的文件连同绝对路径也一起抓取过来了,如下所示: [root@master ~]# tree logs/ # 查看抓取后的文件 logs/ ├── 192.168.118.132 # 以远程主机 IP 为目录做了区分 │ └── var # 被抓取的文件连同绝对路径也一起抓取过来 │ └── log # 被抓取的文件连同绝对路径也一起抓取过来 │ └── messages # 被抓取的文件名 └── 192.168.118.133 # 以远程主机 IP 为目录做了区分 └── var # 被抓取的文件连同绝对路径也一起抓取过来 └── log # 被抓取的文件连同绝对路径也一起抓取过来 └── messages # 被抓取的文件名
cron 模块 作用:添加、删除 Linux
的定时计划任务。
参数:
1 2 3 4 5 6 name :指定计划任务的名称; minute、hour、day、month、weekday:分时日月周,默认是* job:表示计划任务要执行的命令 state:状态,状态有两种,present 表示添加计划任务含义,absent 表示删除计划任务; user:表示计划任务的所属的用户,默认是 root; disabled:disabled=true 表示禁用计划任务,disabled=false 表示启用计划任务,默认是 false 表示启用计划任务;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # 每十分钟执行 ansible node -m cron -a 'name="sync-date" minute=/10 user=root job="/usr/sbin/ntpdate ntp1.aliyun.com" state=present'#每小时执行ansible node -m cron -a 'name="sync-date" hour=/1 user=root job="/usr/sbin/ntpdate ntp1.aliyun.com" state=present' # 每天一点执行 ansible node -m cron -a 'name="sync-date" minute=00 hour=1 user=root job="/usr/sbin/ntpdate ntp1.aliyun.com" state=present ' # 每周一凌晨两点整执行 ansible node -m cron -a 'name="sync-date" minute=00 hour=2 weekday=1 user=root job="/usr/sbin/ntpdate ntp1.aliyun.com" state=present' # 在远程主机上查看第一条的计划任务 [root@node1 ~]# crontab -l # Ansible: sync-date */10 * * * * /usr/sbin/ntpdate ntp1.aliyun.com # 使用 disabled=no 重新启用计划任务,必须指明 name 和 job 才能唯一标识一个计划任务,user 不指定默认就是 root ansible node -m cron -a 'name="sync-date" user=root job="/usr/sbin/ntpdate ntp1.aliyun.com" disabled=no' # 查看远程主机,计划任务已经重启启用了 [root@node1 ~]# crontab -l #Ansible: sync-date * * * * * /usr/sbin/ntpdate ntp1.aliyun.com # 删除计划任务 ansible node -m cron -a 'name="sync-date" user=root job="/usr/sbin/ntpdate ntp1.aliyun.com" state=absent'
user 模块 作用:主要用于用户信息管理,包括用户创建,密码修改,组等基本操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 查看 `user` 模块的帮助文档 ansible-doc user # 在所有主机组上创建一个 xiaoming 用户 ansible -i /etc/ansible/hosts all -m user -a 'name=xiaoming' # 在所有主机组上创建一个 xiaoming 用户 # 如果创建的用户需要密码,则密码需要使用 openssl 命令和 passwd 命令从标准输入中先加密,然后再 ansible 使用 password 指定,如下所示: # -1是密码加密的复杂度 echo "123456" | openssl passwd -1 -stdin $1$v9/AfSPE$Ojk8HUwrbeEQ5jdtw9aYy0 ansible -i /etc/ansible/hosts all -m user -a 'name=xiaoming group=root uid=1009 shell=/usr/bin/bash comment="I am xiaoming,I am new." password="$1$v9/AfSPE$Ojk8HUwrbeEQ5jdtw9aYy0"' # 删除 xiaoming 用户,家目录也一起删除 ansible -i /etc/ansible/hosts all -m user -a 'name=xiaoming state=absent remove=yes'
yum 模块 作用:yum
模块主要用于包管理,如安装、升级、卸载包等操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 更新 nginx,state 参数:present、installed 都可以表示安装,latest 表示更新、removed、absent 表示卸载 ansible -i /etc/ansible/hosts node -m yum -a 'name=nginx state=latest' # 同时安装多个,使用道号隔开 ansible -i /etc/ansible/hosts node -m yum -a 'name=nginx,vsftpd state=present' # 安装本地的包,首先需要把包上传到远程目标主机上才能安装 ansible -i /etc/ansible/hosts node -m copy -a 'src=/root/grafana-8.3.3-1.x86_64.rpm dest=/root/' ansible -i /etc/ansible/hosts node -m yum -a 'name=/root/grafana-8.3.3-1.x86_64.rpm state=present' # 卸载 nginx,同时卸载多个的话也要使用道号隔开 ansible -i /etc/ansible/hosts node -m yum -a 'name=nginx state=absent' # 仅下载 nginx,不安装 ansible -i /etc/ansible/hosts node -m yum -a 'name=nginx download_only=true'
service 模块 作用:用于管理服务,包括启动服务,停止服务,设置服务开机自启等操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 查看 service 模块的帮助文档 ansible-doc service # 启动 nginx 服务 # state 参数可选值:reloaded 重新加载, restarted 重启, started 启动, stopped 停止 ansible -i /etc/ansible/hosts all -m service -a 'name=nginx state=started' # 停止服务,state=stopped 表示停止 ansible -i /etc/ansible/hosts all -m service -a 'name=nginx state=stopped' # 设置服务开机自启 ansible -i /etc/ansible/hosts all -m service -a 'name=nginx enabled=yes' # 启动 ntpd 服务,并设置服务开机自启 ansible -i /etc/ansible/hosts all -m service -a 'name=ntpd state=started enabled=yes'
setup 模块 作用:收集指定目标受控主机的基本信息
1 2 3 4 5 6 7 8 # 查看 setup 模块帮助文档 ansible-doc setup # 查看基本信息,会输出所有信息 ansible -i /etc/ansible/hosts all -m setup # 查看主机的总内存信息,通过使用 filter 参数过滤 ansible -i /etc/ansible/hosts all -m setup -a 'filter=ansible_memtotal_mb'
command 模块 作用:command
模块用于执行一些简单的命令,command
不能识别特殊字符,使用 shell
模块能识别特殊字符。
1 2 3 4 5 6 7 8 # 查看 command 模快帮助文档 ansible-doc command # 查看主机名 ansible -i /etc/ansible/hosts node -m command -a 'hostname' # 查看用户信息,但是由于有管道符,所以会报错,command 模块不能识别不了特殊字符 ansible all -m shell -a 'cat /etc/passwd | grep ssh'
shell 模块 作用:shell模块能实现平时Linux全部操作,即shell模块能实现上面所讲的各个模块全部功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 查看 shell 帮助文档 ansible-doc shell # 查看 ntpd 服务状态 ansible -i /etc/ansible/hosts node -m shell -a 'systemctl status ntpd' # 重启 ntpd 服务状态 ansible -i /etc/ansible/hosts node -m shell -a 'systemctl restart ntpd' # 查看 Linux 版本和内核版本 ansible -i /etc/ansible/hosts node -m shell -a 'cat /etc/redhat-release ;uname -a' # 查看系统启动时间和系统负载,以及登陆用户数 ansible -i /etc/ansible/hosts node -m shell -a 'uptime'
playbook 剧本 ansible-playbook 命令常用参数:
1 2 3 4 5 --list-hosts :列出剧本的主机 --list-tags :列出剧本的 tags --syntax-check :语法检查,检查剧本的语法有无错误 -l SUBSET, --limit SUBSET :指定主机组里哪些主机执行剧本 -t TAGS, --tags TAGS:只执行指定 tags 的步骤
palybook 特性:
1 2 3 4 5 6 7 8 9 # 号表注释 --- 表示文件的开始 区别大小写 一个 name 只能写一个 task,不能一个 nginx 下写多个 task,不然只会应用最后的一个 task; 文件名后缀通常是 .yaml 或 .yml hosts:执行的远程主机列表 tasks:任务集 template:模板 handlers: 与 notify 结合使用,有特定条件触发执行操作,满足条件执行,不满足不执行。
编写一个 playbook
剧本,剧本是以 yaml
格式语法进行编写的,并在 ansible
服务器上创建一个 /root/httpd.conf
配置文件,端口是 8000,然编写剧本,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 --- # 指定主机 - hosts: node # 任务 tasks: # 名字,可自定义 - name: install httpd # yum 模块,安装 httpd 服务 yum: name=httpd state=present # 名字,可自定义 - name: copy apache conf file # copy 模块,复制 httpd.conf 去替换远程主机的 httpd.conf copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf # 名字,可自定义 - name: start apache running # service 模块,启动 httpd 服务 service: name=httpd state=started enabled=yes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # 剧本语法检查,没有报错输出说明剧本语法 ok [root@master ~]# ansible-playbook install_httpd.yaml --syntax-check playbook: install_httpd.yaml # 列出剧本要运行的主机 [root@master ~]# ansible-playbook install_httpd.yaml --list-hosts playbook: install_httpd.yaml play #1 (node): node TAGS: [] pattern: [u'node'] hosts (2): 192.168.118.132 192.168.118.133 # 执行剧本,没有报错,远程主机上已经运行起来了 httpd 服务 [root@master ~]# ansible-playbook install_httpd.yaml # 在 node1 节点上查看,8000 端口起来了,说明我们的剧本 copy 模块复制式成功的 [root@node1 local]# lsof -i:8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 53560 root 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) httpd 53561 apache 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) httpd 53562 apache 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) httpd 53563 apache 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) httpd 53564 apache 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) httpd 53565 apache 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN)
我们修改本地的 /root/httpd.conf 文件端口为 8111。然后重新执行 ansible-playbook install_httpd.yaml,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 修改 /root/httpd.conf 文件端口为 8111,然后重新执行剧本 [root@master ~]# ansible-playbook install_httpd.yaml # 查看远程受控主机上查看,还是之前的 8000 端口 [root@node1 local]# lsof -i:8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 53560 root 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) httpd 53561 apache 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) httpd 53562 apache 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) httpd 53563 apache 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) httpd 53564 apache 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) httpd 53565 apache 4u IPv6 1602043 0t0 TCP *:irdmi (LISTEN) # 没有 8111 端口 [root@node1 local]# lsof -i:8111 [root@node1 local]# grep 8111 /etc/httpd/ conf/ conf.d/ conf.modules.d/ logs/ modules/ run/ # 查看配置文件,配置问价已经是 8111 端口了 [root@node1 local]# grep 8111 /etc/httpd/conf/httpd.conf Listen 8111
handlers 的使用 细心的网友会发现问题所在,我们的剧本中,当文件发生改变了,copy
会重新复制 httpd.conf
文件到远程主机,但是 httpd
服务并没有重启,如果在剧本后面写上重启 httpd
视乎是可行的,但是每执行一次剧本都重启一次 httpd
服务,视乎有点不合理。此时,我们引入一个 handlers
来监听某个事件然后触发某种操作,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 --- - hosts: node tasks: - name: install httpd yum: name=httpd state=present - name: copy apache conf file copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf # notify 定义当 copy 模块的文件发生了改变时去执行对应名字的 handlers, # 注意,这里的 "restart httpd service" 要与 handlers 的 name 的内容一样,不然对应不上 notify: restart httpd service - name: start apache running service: name=httpd state=started enabled=yes # 引入一个 handlers handlers: # 定义一个 name - name: restart httpd service # 操作是,使用 service 模块,重启 httpd 服务 service: name=httpd state=restarted
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 修改端口为 8222 [root@master ~]# vim httpd.conf # 执行剧本 [root@master ~]# ansible-playbook install_httpd.yaml # 查看受控主机,端口 8222 已经启动了 [root@node1 local]# lsof -i:8222 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 60105 root 4u IPv6 1621895 0t0 TCP *:8222 (LISTEN) httpd 60106 apache 4u IPv6 1621895 0t0 TCP *:8222 (LISTEN) httpd 60107 apache 4u IPv6 1621895 0t0 TCP *:8222 (LISTEN) httpd 60108 apache 4u IPv6 1621895 0t0 TCP *:8222 (LISTEN) httpd 60109 apache 4u IPv6 1621895 0t0 TCP *:8222 (LISTEN) httpd 60110 apache 4u IPv6 1621895 0t0 TCP *:8222 (LISTEN)
tags
其实相当于一个标签,在为某个 tasks
打上一个 tags
,然后执行剧本时可以指定 tags
名字,这样就能单独执行 tags
那行的任务,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --- - hosts: node tasks: - name: install httpd yum: name=httpd state=present - name: copy apache conf file copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: restart httpd service - name: start apache running service: name=httpd state=started enabled=yes # 定义一个名叫start apache的tags tags: start apache handlers: - name: restart httpd service service: name=httpd state=restarted
1 2 3 4 5 6 7 8 # 列出剧本有哪些 tags ansible-playbook install_httpd.yaml --list-tags # 指定tags执行剧本(假设剧本已经执行过,现在要启动 nginx,那么可以指定 tags 来执行剧本) ansible-playbook -t "start apache" install_httpd.yaml # 注意:可以将一个 tags 放在不同的 task 下,这样执行剧本的时候就会执行多个 task; # 同时,执行剧本时指定 tag 也可以指定多个 tags,使用道号间隔即可。
ansible-vault 加密 yaml 文件 ansible-vault
命令主要用于加密 yaml
文件,当我们的 yaml
文件有敏感信息时,可以使用使用 ansible-vault
命令加密 yaml
文件,加密过的 yaml
文件,直接 cat
vim
看到的会是一串乱码,所以还是要使用 ansible-vault
命令进行编辑,查看,解密等操作。
注意:加密后的 yaml
文件,需要解密后才能正常执行。
常用参数:
1 2 3 4 5 6 7 8 9 encrypt :加密文件 {create,decrypt,edit,view,encrypt,encrypt_string,rekey} create 创建一个加密的yaml文件 decrypt 解密一个加密文件 edit 编辑加密文件 view 查看加密文件 encrypt 加密一个yaml文件 encrypt_string 加密一个字符串 rekey Re-key a vault encrypted file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 创建一个秘文,创建的时候需要输入密码,然后 ansible 就直接打开文件可以写剧本了 ansible-vault create vault.yml # 解密一个加密过的文件,需要输入正确密码才能解密 ansible-vault decrypt vault.yml # 加密 install_httpd.yaml 文件,加密后的文件就变成了密文,vim 打开看到的是一串乱码 ansible-vault encrypt install_httpd.yaml # rekey 更换口令密码 ansible-vault rekey install_httpd.yaml # 解密加密install_httpd.yaml ,加密后的文件就变成了密文,vim打开看到的是一串乱码 ansible-vault encrypt install_httpd.yaml # 查看加密后的文件,只能这样看,cat install_httpd.yaml 看还是乱码 ansible-vault view install_httpd.yaml # 编辑加密文件,只能这样编辑,vim install_httpd.yaml 看的话会显示一串乱码 ansible-vault edit install_httpd.yaml
vars 的使用 剧本中可以定义变量,变量的定义使用 vars 定义,变量的引用使用 {{ variable }}
,中间有空格,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 --- - hosts: node # 定义变量,及其赋值 vars: # 定义了一个 pkname1 变量,并赋值 httpd - pkname1: httpd # 定义了一个 pkname2 变量,并赋值 vsftpd - pkname2: vsftpd tasks: - name: install httpd # 定义一个 pkname1 变量 yum: name={{ pkname1 }} state=present - name: install vsftpd # 定义一个 pkname2 变量 yum: name={{ pkname2 }} state=present - name: start httpd service: name=httpd state=started enabled=yes - name: start vsftpd service: name=vsftpd state=started enabled=yes
1 2 # 如果基本里面没有定义变量,也没有给变量赋值,那么可以在命令行使用 -e 参数给变量赋值,如下: ansible-playbook -e 'pkname1=httpd,pkname2=vsftpd' install_soft.yaml