24.21 ansible安装包和管理服务
24.22 使用ansible playbook
24.23 playbook里的变量
24.24 playbook里的循环
24.25 playbook里的条件判断
24.26 playbook中的handlers
24.21 ansible安装包和管理服务
1.ansible testhost -m yum -a "name=httpd"
#yum模块
在name后面还可以加上state=installed(安装,可以不加,默认就是安装)/removed (卸载)
2.ansible testhost -m service -a "name=httpd state=started enabled=yes"
#运行httpd并开机启动
这里的name是centos系统里的服务名,可以通过chkconfig --list查到。
3.Ansible文档的使用 #如果忘记选项可以查询
ansible-doc -l 列出所有的模块
ansible-doc cron 查看指定模块的文档
实例:
[root@axinlinux-01 ~]# ansible axinlinux-02 -m yum -a "name=httpd"
axinlinux-02 | SUCCESS => {
"ansible_facts": {
"pkg_mgr": "yum"
},
"changed": false,
"msg": "",
"rc": 0,
"results": [
"httpd-2.4.6-88.el7.centos.x86_64 providing httpd is already installed"
]
}
[root@axinlinux-01 ~]# ansible axinlinux-02 -m yum -a "name=httpd state=removed" #卸载httpd
[root@axinlinux-02 ~]# rpm -qa httpd #02上看一下就没有了
[root@axinlinux-01 ~]# ansible axinlinux-02 -m service -a "name=httpd state=started enabled=no" #开启httpd并不开启启动
[root@axinlinux-02 ~]# ps aux |grep httpd #查看是否启动
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24.22 使用ansible playbook
就是把所有的配置搞到一个配置文件里去,这样直接执行配置文件就行了。而不是用命令行一行一行的去执行。就像以上几节,执行命令要敲很长的命令,很麻烦
1.相当于把模块写入到配置文件里面,例:
vi /etc/ansible/test.yml //加入如下内容 #后缀名是.yml的
--- #固定格式,表示开头(顶格)
- hosts: aming-02 #针对那些机器去操作(也是顶格),也可以写主机组,如testhost
remote_user: root #用哪个用户的身份去做
tasks: #具体的任务是什么
- name: test_playbook #注意空格(四个)
shell: touch /tmp/lishiming.txt #用到的shell模块
说明: 第一行需要有三个杠,hosts参数指定了对哪些主机进行参作,如果是多台机器可以用逗号作为分隔,也可以使用主机组,在/etc/ansible/hosts里定义;
user参数指定了使用什么用户登录远程主机操作;
tasks指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来,shell是ansible模块名字
2.执行:ansible-playbook test.yml
实例:
[root@axinlinux-01 ~]# cd /etc/ansible/
[root@axinlinux-01 ansible]# vim test.yml
---
- hosts: axinlinux-02
remote_user: root
tasks:
- name: test_playbook
shell: touch /tmp/lishiming.txt
[root@axinlinux-01 ansible]# ansible-playbook test.yml #执行这个文件就可以了
[root@axinlinux-02 ~]# ls -l /tmp/lishiming.txt #查看一下
-rw-r--r-- 1 root root 0 12月 10 15:04 /tmp/lishiming.txt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24.23 playbook里的变量
再来一个创建用户的例子:
vi /etc/ansible/create_user.yml //加入如下内容
---
- name: create_user
hosts: aming-02
user: root
gather_facts: false #负责收集客户机的属性,类似于saltstack的grains(ip、版本等等)
vars: #变量
- user: "test" #user变量的值是test
tasks:
- name: create user
user: name="{
{ user }}" #user模块,相当于直接创建用户。user等于test,在这引用他说明:name参数对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;vars参数,指定了变量,这里指字一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;user提定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。
实例:
[root@axinlinux-01 ansible]# vim create_user.yml
---
- name: create_user
hosts: axinlinux-02
user: root
gather_facts: false
vars:
- user: "test"
tasks:
- name: create user
user: name="{
{ user }}"[root@axinlinux-01 ansible]# ansible-playbook create_user.yml
[root@axinlinux-02 ~]# id test
uid=1003(test) gid=1003(test) 组=1003(test)
[root@axinlinux-01 ansible]# ansible-playbook create_user.yml
axinlinux-02 : ok=1 changed=0 unreachable=0 failed=0 #再次执行就代表有这个用户了,就会提示changed=0,没有改变
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24.24 playbook里的循环
vi /etc/ansible/while.yml //加入如下内容
---
- hosts: testhost
user: root
tasks:
- name: change mode for files
file: path=/tmp/{
{ item }} mode=600 #files模块。变量item,包含1、2、3.txt。相当于循环了三次,把这个三个文件改成600with_items: #先写上面的变量{
{ item }} ,再在这些with_items:,也就是这个变量是什么。注意空格- 1.txt
- 2.txt
- 3.txt
说明: with_items为循环的对象
因为他回去收集其他机器的属性,如果机器很多的情况下,可以加一行gather_facts: false,把它禁掉就可以了
执行 ansible-playbook while.yml
实例:
[root@axinlinux-01 ansible]# vim while.yml
---
- hosts: axinlinux-02
user: root
tasks:
- name: change mode for files
file: path=/tmp/{
{ item }} state=touch mode=600 #因为02机器上没有这三个文件,所以加了state=touch创建with_items:
- 1.txt
- 2.txt
- 3.txt
[root@axinlinux-01 ansible]# ansible-playbook while.yml #执行这个文件就可以了
[root@axinlinux-02 ~]# ls -l /tmp/*.txt #检查一下
-rw------- 1 root root 2374 12月 10 16:03 /tmp/1.txt
-rw------- 1 root root 0 12月 10 16:03 /tmp/2.txt
-rw------- 1 root root 0 12月 10 16:03 /tmp/3.txt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24.25 playbook里的条件判断
当出现什么情况的时候,才会怎么样
vi /etc/ansible/when.yml //加入如下内容
---
- hosts: testhost #这里为testhost,因为下面判断语句,要在所有的机器里去判断是否符合
user: root
gather_facts: True #True表示要去收集信息。当然默认就是收集,也可以删掉这行
tasks:
- name: use when
shell: touch /tmp/when.txt #创建这个文件。也就是当下面一行的条件成立的时候,才回去创建
when: ansible_ens33.ipv4.address == "192,168,208.130"
#条件判断。实例中讲解
说明:ansible aming-02 -m setup 可以查看到所有的facter信息 #上面为True,所收集到的什么信息。我们上面用ip作为判断,都是在这里面找的
when判断不仅仅针对gather_facts,也可针对其他的。比如这个机器上的文件或目录是否存在、文件属性等等
实例:
[root@axinlinux-01 ansible]# vim when.yml
---
- hosts: axinlinux-02
user: root
gather_facts: True
tasks:
- name: use when
shell: touch /tmp/when.txt
when: ansible_ens33.ipv4.address == "192,168,208.130"
[root@axinlinux-01 ansible]# ansible -m setup axinlinux-02 #查看02机器的gather_facts内容,因为我们的判断条件就在这里面判断的。用到了setup模块
"ansible_ens33": { #判断语句的最上一级
"active": true,
"device": "ens33",
"features": {
!!!中间的数据省略了!!!
},
"hw_timestamp_filters": [],
"ipv4": { #判断语句的下一级
"address": "192.168.208.130", #判断语句的在下一级。只能这样一级一级的写才能得出这个ip
"broadcast": "192.168.208.255",
"netmask": "255.255.255.0",
"network": "192.168.208.0"
},
条件判断中,when: ansible_ens33.ipv4.address == "192,168,208.130" ,ansible_ens33为一级。而后面的ipv4为一级,address为一级。也就是ansible_ens33的下面是是ipv4,在下面是address。所以我们想要得出这个ip,就要这么写。这是分级的,用 点 (.)来分隔。
因为我们使用这个ip来作为判断的。然后用其他的作为判断,比如"active": true, 就得这样写when:ansible_ens33.active。判断他是不是分级的,看他的空格是不是在上一级的后面!!
[root@axinlinux-01 ansible]# ansible-playbook when.yml #运行
[root@axinlinux-02 ~]# ls -l /tmp/*.txt
-rw-r--r-- 1 root root 0 12月 10 16:52 /tmp/when.txt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24.26 playbook中的handlers
相当于shell里面的&&。执行成功以后在执行下一个命令
应用场景:可以使用在修改nginx等配置文件,然后重启或加载的时候
以下就是,当tasks执行成功以后再去执行handlers。用notify,将他们关联起来!!!
执行task之后,服务器发生变化之后要执行的一些操作,比如我们修改了配置文件后,需要重启一下服务 vi /etc/ansible/handlers.yml//加入如下内容
---
- name: handlers test
hosts: aming-02
user: root
tasks:
- name: copy file
copy: src=/etc/passwd dest=/tmp/aaa.txt #用到的copy模块。来源地址和目标地址
notify: test handlers #就是copy模块执行成功以后,我要在运行一个handlers,可以多个handlers
handlers:
- name: test handlers #这里的名字就是上面notify定义的名字
shell: echo "111111" >> /tmp/aaa.txt #用到的shell模块
说明,只有copy模块真正执行后,才会去调用下面的handlers相关的操作。也就是说如果1.txt和2.txt内容是一样的,并不会去执行handlers里面的shell相关命令。 这种比较适合配置文件发生更改后,重启服务的操作。
实例:
[root@axinlinux-01 ansible]# vim handlers.yml
---
- name: handlers test
hosts: axinlinux-02
user: root
tasks:
- name: copy file
copy: src=/etc/passwd dest=/tmp/aaa.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "111111" >> /tmp/aaa.txt
[root@axinlinux-01 ansible]# ansible-playbook handlers.yml
[root@axinlinux-02 ~]# tail /tmp/aaa.txt
mongod:x:993:989:mongod:/var/lib/mongo:/bin/false
gitlab-www:x:992:988::/var/opt/gitlab/nginx:/bin/false
git:x:991:987::/var/opt/gitlab:/bin/sh
gitlab-redis:x:990:986::/var/opt/gitlab/redis:/bin/false
gitlab-psql:x:989:985::/var/opt/gitlab/postgresql:/bin/sh
gitlab-prometheus:x:988:984::/var/opt/gitlab/prometheus:/bin/sh
zhangsan:x:1011:1011::/home/jail/./home/zhangsan:/usr/sbin/jk_chrootsh
redis:x:987:983:Redis Database Server:/var/lib/redis:/sbin/nologin
dockerroot:x:986:982:Docker User:/var/lib/docker:/sbin/nologin
111111