Ansible—— 30. playbook 任务间的流程控制

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]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章