实验环境
一共四台虚拟机
ansbile主机:172.25.42.100 被控端 开启火墙
nod1:172.25.42.200 被控端 开启火墙
nod2:172.25.42.210 被控端 开启火墙
nod3:172.25.42.220 被控端 开启火墙
1、在ansbile主机端拥有ansbile用户ck,并且单独配置ansible环境,此主机的root用户分发公钥给全部被控端的devops用户,分发私钥使得此主机ck用户能免密连接。将全部被控端加入到资源清单。
2、在所有被控端建立控制用户devops,visodu下放权力给devops。
具体操作见我上篇博客:ansbile部署博客连接
一、循环
一、简单循环
赋值列表
{{item}} 迭代变量名称
loop:
- value1
- value2
- ...
二、循环散列或字典列表
建立用户和密码
生成加密的密码
建立yml文件,实现字典列表的循环
[ck@ansible ansible]$ cat create.yml
- name: create user
hosts: westos
tasks:
- name: create user
user:
name: "{{item.user}}"
password: "{{item.passwd}}"
state: present
loop:
- user: westos1
passwd: "$6$nPfGe/VMYhrQXBus$aSwAyjpbVEZ2AXbIfgxEGlWY4AXb9TjmwaqMF3fz9pGwTI2rUo7AhlRDg7EjFDOIwkpg/ExTKyDHRhZONrdHO1"
- user: westos2
passwd: "$6$.4xjbGZzc0MueOVC$B9a0unSsbn.t20U.TszdPdTvunsfIm3hIMgbs/I94PO45oQU0oddA6SlNq3jWJfy/Q8p.dqG0TvUYyv5akA2Z/"
- user: westos3
passwd: "$6$QqtxuRH6QiDac1oB$txijD1OMtYaQwgtqgULqhYikBBB4UJQ71bQUihNbGq9c0idjnOLLbZFuA6URaN4Nn7X/mEQ2cuHNPhYN0hixO0"
成功给清单用户列表里建立用户和密码
二、条件判定
一、when条件语句
此条件代表当两者都满足时
when:
- 条件1
- 条件2
1、为了更好的了解此部分的内容首先执行一个简单的yml文件
判断文件是否存,并查看输出值
[ck@ansible ansible]$ cat tiaojian.yml
---
- name: test
hosts: all
tasks:
- name: test
shell: test -e /mnt/file
ignore_errors: yes
register: OUTPUT
- name: show message
debug:
msg: "{{ OUTPUT }}"
得到结果,可以发现因为忽略了错误,所以每个被控端都能返回OUTPUT的值。文件不存在的OUTPUT.rc=1,文件存在的OUTPUT.rc=0
2、在明白了上图的结果之后我们可以进行条件语句的使用
[ck@ansible ansible]$ vim tiaojian.yml
/
---
- name: test
hosts: all
tasks:
- name: test
shell: test -e /mnt/file
ignore_errors: yes
register: OUTPUT
- name: show message
debug:
msg: /mnt/file is exit
when: OUTPUT.rc == 0
- name: show message
debug:
msg: /mnt/file is not exit
when: OUTPUT.rc == 1
///
二、条件判定
= | value == “字符串”,value == 数字 | 解释 |
---|---|---|
< | value < 数字 | |
> | value > 数字 | |
<= | value <= 数字 | |
>= | value >= 数字 | |
!= | value != 数字 | |
is defined value | value is defined | 变量存在 |
is not defined | value is not defined | 变量不存在 |
in | value is in value | 变量为 |
not in | value is not in value | 变量不为 |
bool变量 为true | value | value的值为true |
bool变量 false | not value | value的值为false |
例子:添加磁盘。利用条件语句对磁盘进行检测
nod2节点添加磁盘
能发现磁盘为/dev/vdb
因此用搜索vdb事实变量,便于我们采集信息
[ck@ansible ansible]$ ansible 172.25.42.200 -m setup |less
查看到的位置为ansible_facts 下的devices下的vdb
建立yml文件,判断条件存在为
[ck@ansible ansible]$ cat tiaojian.yml
///
- name: show message
debug:
msg: vdb is exit
when: ansible_facts['devices']['vdb'] is defined 条件存在时
- name: show message
debug:
msg: vdb is not exit
when: ansible_facts['devices']['vdb'] is not defined 条件不存在时
///
结果在ip为100,200主机成功查看到vdb的存在(100主机之前为也添加过磁盘)
2、添加ip进行控制,进行多重条件控制
查看到ip为ansible_facts下的all_ipv4_addresses下的ip
建立yml文件
[ck@ansible ansible]$ cat tiaojian.yml
---
- name: test
hosts: all
tasks:
- name: show message
debug:
msg: 100 vdb is exit
when:
- ansible_facts['devices']['vdb'] is defined
- ansible_facts['ens3']['ipv4']['address'] in "172.25.42.100" (可以使用魔法变量inventory_hostname去代替主机ip)
- name: show message
debug:
msg: vdb is not exit
when: ansible_facts['devices']['vdb'] is not defined
结果加上限制ip的条件后,只有ip为的100主机输出了结果
三、例题:
建立playbook ~/ansibles/lvm.yml要求如下:
(1)建立大小为1500M名为exam_lvm的lvm 在westos组中
(2)如果westos不存在请输出:
vg westos is not exist
(3)如果westos大小不足1500M请输出:
vg westos is less then 1500M
并建立800M大小的lvm
环境设置
nod1:172.25.42.200 被控端
先建立一块名为westos的vg格式的磁盘
[root@westos_nod1 ~] pvcreate /dev/vdb1
[root@westos_nod1 ~] vgcreate westos /dev/vdb1
[root@westos_nod1 ~] pvs
[root@westos_nod1 ~] vgs
查看到nod1主机的vdb1磁盘成功建立了westos的VG格式磁盘
1、查看ansible的lvm部署模块
查看看到lvs创造的具体的用法
2、查看pv的位置
[ck@ansible ansible]$ ansible all -m setup |less
3、设置yml文件
[ck@ansible ansible]$ cat vbd.yml
- name: create lvm
hosts: all
tasks:
- name: Create 1500M lvm
lvol:
lv: exam_lvm
vg: westos
size: 1500M
when: ansible_facts['lvm']['vgs']['westos'] is defined
ignore_errors: yes
register: OUTPUT
- name: debug size message
debug:
msg: vg is less than 1500M
when:
- ansible_facts['lvm']['vgs']['westos'] is defined
- OUTPUT.rc != 0
- name: Create 800M lvm
lvol:
lv: exam_lvm
vg: westos
size: 800M
when:
- ansible_facts['lvm']['vgs']['westos'] is defined
- OUTPUT.rc != 0
ignore_errors: yes
register: OUTPUT_800
- name: debug 800M message
debug:
msg: vg is less than 800M
when:
- ansible_facts['lvm']['vgs']['westos'] is defined
- OUTPUT.rc != 0
- OUTPUT_800 != 0
- name: debug exist message
debug:
msg: vg is not exit
when:
- ansible_facts['lvm']['vgs']['westos'] is not defined
写这个部分的时候,太多的血泪。
写这个思路和写shell的不一样,这个得先做操作,直接进行建立1500M和800M,建立主题部分,再加其他限制条件和输出。
一个是复制相同部分的时候,千万不能多复制空格,不然会报错,但是找不到原因
三、触发器
一、notify、和handlers触发器简介
notify: 触发器当遇到更改是触发handlers
handlers: 触发器触发后执行的动作
优点:当触发时才执行,比起每次都执行效率更高
二、例题
当执行这个结果时候,会安装下载vsftpd并能匿名用户的登陆
[ck@ansible ansible]$ ansible-playbook vsftpd.yml -e “state=YES”
[ck@ansible ansible]$ cat vsftpd.yml
//
---
- name: vsftpd service
hosts: 172.25.42.200
tasks:
- name: install vsftpd
dnf:
name: vsftpd
state: latest
notify:
- restart vsftp
- firewalld
- name: confiugre vsftp
lineinfile:
path: /etc/vsftpd/vsftpd.conf
line: "anonymous_enable={{ state }}" 注意连接紧密,不要空格
regexp: "^anonymous_enable"
Bbacker: yes 匹配到了对应行才更改(可以加,可以不加)
notify:
- restart vsftpd
handlers:
- name: restart vsftpd
service:
name: vsftpd
state: restarted
enabled: yes
- name: firewalld
firewalld:
service: ftp
state: enabled
permanent: yes
immediate: yes
///
图里面 line: “anonymous_enable={{ state }}” 这里不能空格,图中有错误请注意更改
成功用匿名用户登陆且查看到信息