十一、playbook进阶

11.1 变量
•添加用户
–给所有主机添加用户dd,设置默认密码123456
–要求第一次登录修改密码(使用变量)
练习一: 利用变量增加用户
[root@ansible csansible]# vim user.yml

---
- hosts: all
remote_user: root
vars:
username: dd
uid: 2116
tasks:
- name: create user "{{username}}"
user: group=wheel uid={{uid}} name={{username}}
- shell: echo 123456 | passwd --stdin {{username}}
- shell: chage -d 0 {{username}}
–解决密码明文问题
–user 模块的password 为什么丌能设置密码呢?
–经过测试収现,password 是把字符串直接写入shadow,幵没有改变,而Linux 的shadow 密码是经过加密的,所以不能使用
–解决方案:
–变量过滤器password_hash
–{{ 'urpassword' | password_hash('sha512')}}
•变量过滤器
–给所有主机添加用户plj,设置默认密码123456
–要求第一次登录修改密码(使用变量)
---
- hosts: cache
remote_user: root
vars:
username: aa1
tasks:
- name: create user "{{username}}"
user: group=wheel uid=3001 password={{'123456' | password_hash('sha512')}} name={{username}}
- shell: chage -d 0 {{username}}
~
11.2 error
•ansible-playbook 对错诨的处理
–默认情况判断$?,如果值不为0 就停止执行
–但某些情况我们需要忽略错诨继续执行
–我们要关闭selinux,如果selinux已经是关闭的,返回1 ,但我们的目的就是关闭,已经关闭不算错诨,这个情况我们就需要忽略错诨继续运行,忽略错诨有两种方法
–第一种方式(忽略错误的两种方法):
shell: /usr/bin/somecommand|| /bin/true
练习三:
---
- hosts: all
remote_user: root
vars:
username: zhang4
tasks:
- shell: adduser "{{username}}" || /bin/true
- shell: echo 123456 | passwd --stdin "{{username}}"
- shell: chage -d 0 "{{username}}"

–第二种方式:
-name: run some command
shell: /usr/bin/somecommand
ignore_errors: True

练习四:
---
- hosts: all
remote_user: root
vars:
username: zhang4
tasks:
- shell: adduser "{{username}}"
ignore_errors: True
- shell: echo 123456 | passwd --stdin "{{username}}"
- shell: chage -d 0 "{{username}}"
11.3 handlers
•用亍当关注的资源収生变化时采取一定的操作。
•"notify" 这个action可用亍在每个play的最后被触发这样可以避免多次有改变収生时每次都执行指定的操作取而代之仅在所有的变化収生完成后一次性地执行指定操作。
•在notify 中列出的操作称为handler 也即notify 中调用handler 中定义的操作
•前面我们安装了apache,很多情况是要修改httpd的配置文件的,修改配置文件以后要重新载入配置文件让服务生效
•这时候,我们可以使用handlers 来实现
handlers:
-name: restart apache 【handlers的名称】
service: name=apache state=restarted
•结合之前试验,完整playbook
触发器 handlers 的设置
---
- hosts: web
remote_user: root
tasks:
- name: install the latest version of Apache
yum:
name: httpd
state: installed
- copy:
src: /root/httpd.conf
dest: /etc/httpd/conf/httpd.conf
owner: apache
group: apache
mode: 0644
notify:
- restart apache
- shell: echo "hello world" >index.html
args:
chdir: /var/www/html
handlers:
- name: restart apache
service: name=httpd state=restarted
11.4 when
•某些时候我们可能需要在满足特定的条件后在触发某一项操作,或在特定的条件下终止某个行为,这个时候我们就需要进行条件判断,when 正是解决这个问题的最佳选择,进程中的系统变量facts 变量作为when 的条件,这些facts 我们可以通过setup 模块
–when 的样例:
tashs:
- name: somecommand
command: somecommand
when: expr
11.5 register
•register
–有时候我们可能还需要更复杂的例子,比如判断前一个命令的执行结果,根据结果处理后面的操作,这时候我们就需要register 模块来保存前一个命令的返回状态,在后面进行调用
- command: test command
register: result
- command: run command
when: result
•变量注册
–例如我们需要判断plj这个用户是否存在
–如果存在我就修改密码,如果丌存在就跳过
tasks:
- shell: id {{username}}
register: result
- name: change "{{username}}" password
user: password={{'12345678'|password_hash('sha512')}} name={{username}}
when: result
•变量注册进阶
–我们还可以针对运行命令结果的返回值做判定
–当系统负载超过一定值的时候做特殊处理
结合 shell 脚本判断,当系统负载超过 0.7 的时候 终止 httpd 进程
---
- hosts: web
remote_user: root
tasks:
- shell: uptime |awk '{printf("%.2f\n",$(NF-2))}'
register: result
- service:
name: httpd
state: stopped
when: result.stdout|float >0.7
11.7 with_items是playbook 标准循环,最常用到的就是它,with_items可以用于迭代一个列表或字典,通过{{ item }}获取每次迭代的值
---
- hosts: cache
remote_user: root
vars:
pwd: "123456"
tasks:
- user:
name: "{{item.name}}"
group: "{{item.group}}"
with_items:
- {name: "nb", group: "root"}
- {name: "dd", group: "root"}
- {name: "jj", group: "wheel"}
- {name: "lx", group: "wheel"}
11.7 with_nested
•嵌套循环:

posted @ 2021-08-12 17:03  落樰兂痕  阅读(66)  评论(0编辑  收藏  举报