1. 任务委托
默认情况下,ansible所有任务都是在我们指定的机器上面运行的,当在一个独立的集群环境配置时,这并没有什么问题。而在有些情况下,比如给某台服务器发送通知或者向监控服务器中添加被监控的主机,这个时候任务就需要在特定的主机上运行,而非一开始指定的所有主机,此时就需要ansible的委托任务。
使用delegate_to关键字可以配置任务在指定的服务器上执行,而其他任务还是在hosts关键字配置的所有机器上执行,当到了这个关键字所在的任务时,就使用委托的机器运行。
查看MySQL是否在运行状态,因此在检查之前首先关掉162上的mysql服务。
[root@test2 playbook]# cat test.yml
---
- hosts: all
remote_user: root
tasks:
- name: stop the db server
service: name=mysqld state=stopped
delegate_to: 10.0.102.162 #这里使用了委托,仅关闭162这台服务器上,这个play仅在162这台服务器上执行。
- name: check mysql status
service: name=mysqld state=running
[root@test2 playbook]# cat test.yml
---
- hosts: all
remote_user: root
tasks:
- name: create the test file
local_action: shell touch test1111 #在本地创建一个测试文件
- name: check mysql status
service: name=mysqld state=running
2. 任务暂停
有些情况下,一些任务的运行需要等待一些状态的恢复,比如某一台主机或者应用刚刚重启,我们需要等待它上面的某个端口开启,此时我们就不得不将正在运行的任务暂停,直到其状态满足我们的需求。
- name: wait for webserver to start
local_action:
module: wait_for
host: webserver1
port: 80
delay: 10
timeout: 300
state: startted
#这个实例中,这个任务将会每10s检查一次主机webserver1上面的80端口是否开启,如果超过了300s,80端口仍未开启,将会返回失败信息。
3. 交互式提示
在少数情况下,ansible任务运行的过程中需要用户输入一些数据,这些数据要么比较秘密不方便,或者数据是动态的,不同的用户有不同的需求,比如输入用户自己的账户和密码或者输入不同的版本号会触发不同的后续操作等。ansible的vars_prompt关键字就是用来处理上述这种与用户交互的情况的。
---
- hosts: localhost
remote_user: root
vars_prompt:
- name: share_user
prompt: "what is your network username?"
private: no
- name: share_pass
prompt: "what is your network password"
private: no
tasks:
- name: out
command: echo {{ share_user }} {{ share_pass }}
[root@test2 playbook]# ansible-playbook test.yml --limit 10.0.102.162
手动输入的变量值,在后面的play中仍然可以用{{ var_name }}的形式调用。
关键字vars_prompt几个常用的选项总结如下:
private: 默认值为yes,表示用户输入的值在命令行不可见;将值设为no时,用户输入可见。
default:为变量设置默认值,以节省用户输入时间。
confirm:特别适合输入密码的情况,如果将其设置为yes,则会要求用户输入两次,以增加输入的安全性。
vars_prompt:
- name: "solution"
prompt: "Choose the solution you want \n
A: solutionA\n
B: solutionB\n
C: solutionC\n"
private: no
default: A
---
- hosts: test70
remote_user: root
vars_prompt:
- name: "user_name"
prompt: "Enter user name"
private: no
- name: "user_password"
prompt: "Enter user password"
tasks:
- name: create user
user:
name: "{{user_name}}"
password: "{{user_password}}"
此时输入的密码不对,因为需要加密,才能登录,但需要安装pip install passlib,安装pip ,安装passlib库,所以改进如下:
---
- hosts: test70
remote_user: root
vars_prompt:
- name: "hash_string"
prompt: "Enter something"
private: no
encrypt: "sha512_crypt"
tasks:
- name: Output the string after hash
debug:
msg: "{{hash_string}}"
使用confirm
---
- hosts: test70
remote_user: root
vars_prompt:
- name: "user_name"
prompt: "Enter user name"
private: no
- name: "user_password"
prompt: "Enter user password"
encrypt: "sha512_crypt"
confirm: yes
tasks:
- name: create user
user:
name: "{{user_name}}"
password: "{{user_password}}"
————Blueicex 2020/03/26 19:12 [email protected]