1 ansible安装包和管理服务

安装包操作如下:

[root@chy ~]# ansible chy01 -m yum -a "name=httpd"//安装一个包
chy01 | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "httpd-2.4.6-67.el7.centos.6.x86_64 providing httpd is already installed"
    ]
}
[root@chy ~]# ansible chy01 -m yum -a "name=httpd state=removed" //卸载一个包直接后面增加state=removed
chy01 | SUCCESS => {
    "changed": true, 
    "failed": false, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "已加载插件:fastestmirror\n正在解决依赖关系\n--> 正在检查事务\n---> 软件包 httpd.x86_64.0.2.4.6-67.el7.centos.6 将被 删除\n--> 正在处理依赖关系 httpd = 2.4.6-67.el7.centos.6,它被软件包 httpd-devel-2.4.6-67.el7.centos.6.x86_64 需要\n--> 正在检查事务\n---> 软件包 httpd-devel.x86_64.0.2.4.6-67.el7.centos.6 将被 删除\n--> 解决依赖关系完成\n\n依赖关系解决\n\n================================================================================\n Package          架构        版本                          源             大小\n================================================================================\n正在删除:\n httpd            x86_64      2.4.6-67.el7.centos.6         @updates      9.4 M\n为依赖而移除:\n httpd-devel      x86_64      2.4.6-67.el7.centos.6         @updates      749 k\n\n事务概要\n================================================================================\n移除  1 软件包 (+1 依赖软件包)\n\n安装大小:10 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  正在删除    : httpd-devel-2.4.6-67.el7.centos.6.x86_64                    1/2 \n  正在删除    : httpd-2.4.6-67.el7.centos.6.x86_64                          2/2 \n  验证中      : httpd-2.4.6-67.el7.centos.6.x86_64                          1/2 \n  验证中      : httpd-devel-2.4.6-67.el7.centos.6.x86_64                    2/2 \n\n删除:\n  httpd.x86_64 0:2.4.6-67.el7.centos.6                                          \n\n作为依赖被删除:\n  httpd-devel.x86_64 0:2.4.6-67.el7.centos.6                                    \n\n完毕!\n"
    ]
}
[root@chy ~]# ansible chy01 -m service -a "name=httpd state=started enabled=no" 
//启动一个服务,state=后面是启动, enabled后跟是否开机启动
[root@chy01 ~]# ps aux |grep httpd //查看已经开机启动
root       4588  0.0  0.3 221936  4984 ?        Ss   02:28   0:00 /usr/sbin/httpd -DFOREGROUND
apache     4589  0.0  0.1 221936  2960 ?        S    02:28   0:00 /usr/sbin/httpd -DFOREGROUND
apache     4590  0.0  0.1 221936  2960 ?        S    02:28   0:00 /usr/sbin/httpd -DFOREGROUND
apache     4591  0.0  0.1 221936  2960 ?        S    02:28   0:00 /usr/sbin/httpd -DFOREGROUND
apache     4592  0.0  0.1 221936  2960 ?        S    02:28   0:00 /usr/sbin/httpd -DFOREGROUND
apache     4593  0.0  0.1 221936  2960 ?        S    02:28   0:00 /usr/sbin/httpd -DFOREGROUND
root       4617  0.0  0.0 112648   960 pts/0    R+   02:30   0:00 grep --color=auto httpd

Ansible文档的使用

[root@chy ~]# ansible-doc -l //查看所有的模块
[root@chy ~]# ansible-doc service //针对一个模块做一个查询

2 使用ansible playbook

- playbook是把模块写入到配置文件里

操作如下

[root@chy ~]# cd /etc/ansible/
[root@chy ansible]# vi test.yml
---
- hosts: chy01
  remote_user: root
  tasks:
    - name: test_playbook
      shell: touch /tmp/lishiming.txt
语法解释:
---   //第一行需要有三个杠
- hosts: chy01 //指定了对哪些主机进行参作,如果是多台机器可以用逗号作为分隔,也可以使用主机组,在/etc/ansible/hosts里定义
  remote_user: root //指定了使用什么用户登录远程主机操作(remote_user有4个空格
  tasks://指定了一个任务
    - name: test_playbook //是对任务的描述,在执行过程中会打印出来(-name之前有4个空格)
      shell: touch /tmp/lishiming.txt //shell是ansible模块名字
(空格要注意)
[root@chy01 ~]# ls -l /tmp/lishiming.txt //在另一台机器上查看成功
-rw-r--r-- 1 root root 0 Nov  9 05:12 /tmp/lishiming.txt

3 playbook里的变量

playbook的创建用户操作

[root@chy ansible]# vi create_user.yml 
---
- name: create_user 
  hosts: chy01
  user: root
  gather_facts: false //
  vars:
    - user: "test"
  tasks:
    - name: create user
      user: name="{{ user }}"
说明:说明:name参数对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;vars参数,指定了变量,这里指字一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;user提定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。
[root@chy ansible]# ansible-playbook create_user.yml //执行过程
PLAY [create_user] ***************************************************************************************************************

TASK [create user] ***************************************************************************************************************
changed: [chy01]

PLAY RECAP ***********************************************************************************************************************
chy01                      : ok=1    changed=1 (这里如果客户机没有用户则是1,如果是0则代表没有执行成功,就要考虑客户机是否创建了用户)  unreachable=0    failed=0

4 playbook循环

[root@chy ansible]# vi while.yml
---
- hosts: chy01
  user: root
  tasks:
    - name: change mode for files
      file: path=/tmp/{{ item }} mode=600
      with_items:
        - 1.txt
        - 2.txt
        - 3.txt
说明: with_items为循环的对象
[root@chy01 ~]# ls -l /tmp/ //查看执行的结果
total 44
-rw-r--r-- 1 root  root     0 Nov  7 05:33 111.txt
drwxr-xr-x 2 root  root  4096 Nov  7 05:30 123
drwxr-xr-x 2 root  root  4096 Nov  7 05:03 1233
-rw-r--r-- 1 root  root  2182 Nov  7 05:28 123.txt
-rw------- 1 root  root     0 Nov  9 06:06 1.txt
-rw------- 1 root  root     0 Nov  9 06:06 2.txt
-rw------- 1 root  root     0 Nov  9 06:06 3.txt

5 playbook中的条件判断

- 判断,类似于shell中的if语句,当满足情况才回去执行,不满足就输出报错,playbook也是这个道理。

[root@chy ansible]# vi when.yml
---
- hosts: chy01
  user: root
  gather_facts: True
  tasks:
    - name: use when
      shell: touch /tmp/when.txt
      when: ansible_ens33.ipv4.address == "192.168.212.11" //这个ip是客户机的ip地址
//以ansible_ens33.ipv4.address为判断对象(ansible_ens33是最上面一级,ipv4是第二级),且值为 "192.168.212.11" 的机器筛选出来。
说明:[root@chy ansible]# ansible chy01 -m setup //可以查看到所有的facter信息
[root@chy ansible]# ansible-playbook when.yml 
PLAY [testhost] ******************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [chy02]
ok: [chy01]

TASK [use when] ******************************************************************************************************************
skipping: [chy02]
 [WARNING]: Consider using file module with state=touch rather than running touch

changed: [chy01]
PLAY RECAP ***********************************************************************************************************************
chy01                      : ok=2    changed=1    unreachable=0    failed=0   
chy02                      : ok=1    changed=0    unreachable=0    failed=0   
如上一般用在的场合是:目录和文件是否在某台机器上面。

6 playbook中的handlers

执行task之后,服务器发生变化之后要执行的一些操作,比如我们修改了配置文件后,需要重启一下服务:

[root@chy ansible]# vi handlers.yml
---
- name: handlers test
  hosts: chy01
  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
说明,只有copy模块真正执行后,才会去调用下面的handlers相关的操作。
也就是说如果说假如/etc/passwd这个文件不存在 copy执行后是错误的,然后并不会去执行handlers里面的shell相关命令。
[root@chy ansible]# ansible-playbook handlers.yml 

PLAY [handlers test] *************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [chy01]

TASK [copy file] *****************************************************************************************************************
changed: [chy01]

RUNNING HANDLER [test handlers] **************************************************************************************************
changed: [chy01]
PLAY RECAP ***********************************************************************************************************************
chy01                      : ok=3    changed=2    unreachable=0    failed=0   
[root@chy01 ~]# tail /tmp/aaa.txt  //查看结果
gitlab-psql:x:991:988::/var/opt/gitlab/postgresql:/bin/sh
gitlab-prometheus:x:990:987::/var/opt/gitlab/prometheus:/bin/sh
lf:x:1003:1003::/home/lf:/bin/bash
jump:x:1004:1004::/home/jump:/bin/bash
chy:x:1005:1005::/home/chy:/bin/bash
chy1:x:1006:1006::/home/chy1:/bin/bash
aaa:x:1007:1007::/home/aaa:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
saslauth:x:989:76:Saslauthd user:/run/saslauthd:/sbin/nologin
111111
这种比较适合配置文件发生更改后(如果配置成功),就会启动重启服务的操作。

希望看过的童鞋多多指教,谢谢!j_0063.gifj_0063.gif