linux 学习笔记-097-自动化运维-ansible 安装包和管理服务,使用 playbook,playbook 里的变量,循环,条件判断,handlers

发布于 2018-05-29  210 次阅读


ansible 安装包和管理服务

ansible 批量为服务器安装包(这里只用 am-02 为例)

[root@am-01:~#] ansible am-02 -m yum -a "name=httpd"

am-02 | SUCCESS => {

    "changed": true,

    "msg": "",

    "rc": 0,

    "results": [

        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * epel: mirrors.ustc.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.4.6-80.el7.centos will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package       Arch           Version                        Repository    Size\n================================================================================\nInstalling:\n httpd         x86_64         2.4.6-80.el7.centos            base         2.7 M\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 2.7 M\nInstalled size: 9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : httpd-2.4.6-80.el7.centos.x86_64                             1/1 \n  Verifying  : httpd-2.4.6-80.el7.centos.x86_64                             1/1 \n\nInstalled:\n  httpd.x86_64 0:2.4.6-80.el7.centos                                            \n\nComplete!\n"

    ]

}

#使用 yum 模块为服务器安装 httpd 包,-m 指定模块,name 指定包名

#如果需要删除,可以这样写:"name=httpd state=remove"
[root@am-02:~#] rpm -qa httpd

httpd-2.4.6-80.el7.centos.x86_64

#am-02 上检查,已经安装成功

ansible 批量启动服务器的指定服务(这里只用 am-02 为例)

[root@am-01:~#] ansible am-02 -m service -a "name=httpd state=started enabled=no"

am-02 | SUCCESS => {

    "changed": true,

    "enabled": false,

    "name": "httpd",

    "state": "started",

    "status": {

        "ActiveEnterTimestampMonotonic": "0",

        "ActiveExitTimestampMonotonic": "0",

………………省略部分输出信息………………

        "WatchdogTimestampMonotonic": "0",

        "WatchdogUSec": "0"

    }

}

#-m 指定模块,服务操作的模块为 service,-a 指定动作,name 指定服务的名称,state 指定针对这个服务做得操作,enabled 可以指定是否设置为开机启动
[root@am-02:~#] ps aux | grep httpd

root      18983  0.1  0.4 223940  4972 ?        Ss   22:59   0:00 /usr/sbin/httpd -DFOREGROUND

apache    18984  0.0  0.2 223940  2964 ?        S    22:59   0:00 /usr/sbin/httpd -DFOREGROUND

apache    18985  0.0  0.2 223940  2964 ?        S    22:59   0:00 /usr/sbin/httpd -DFOREGROUND

apache    18986  0.0  0.2 223940  2964 ?        S    22:59   0:00 /usr/sbin/httpd -DFOREGROUND

apache    18987  0.0  0.2 223940  2964 ?        S    22:59   0:00 /usr/sbin/httpd -DFOREGROUND

apache    18988  0.0  0.2 223940  2964 ?        S    22:59   0:00 /usr/sbin/httpd -DFOREGROUND

#检查可见,已经正常启动

Ansible 文档的使用

ansible-doc -l   列出所有的模块

ansible-doc cron  查看指定模块的文档

使用 ansible playbook

相当于把模块、命令等一系列需要执行的命令写入到配置文件里面,这时要执行这一系列的命令时,就只需要执行这个配置文件即可

执行一个简单命令的 playbook 写法

[root@am-01:~#] cd /etc/ansible/

[root@am-01:/etc/ansible#] vim test.yml

---

- hosts: am-02

  remote_user: root

  tasks:

    - name: test_playbook

      shell: touch /tmp/am-02.txt

#第一行需要有三个杠

#hosts 参数指定了对哪些主机进行参作,如果是多台机器可以用逗号作为分隔,也可以使用主机组,在/etc/ansible/hosts 里定义

#user 参数指定了使用什么用户登录远程主机操作,这里使用 remote_user,一样效果的

#tasks 指定了一个任务,其下面的 name 参数同样是对任务的描述,在执行过程中会打印出来,shell 是 ansible 模块名字

#需要注意空格问题
[root@am-01:/etc/ansible#] ansible-playbook test.yml



PLAY [am-02] *********************************************************************************************************************



TASK [Gathering Facts] ***********************************************************************************************************

ok: [am-02]



TASK [test_playbook] *************************************************************************************************************

 [WARNING]: Consider using file module with state=touch rather than running touch



changed: [am-02]



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=2    changed=1    unreachable=0    failed=0  

#使用 ansible-playbook 执行一下这个配置文件
[root@am-02:~#] ls -l /tmp/am-02.txt

-rw-r--r-- 1 root root 0 5 月  29 23:30 /tmp/am-02.txt

#在 am-02 机器上检查可以见到 touch 成功

playbook 里的变量

创建用户的 playbook 写法

[root@am-01:/etc/ansible#] vim create_user.yml

---

- name: create_user

  hosts: am-02

  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@am-01:/etc/ansible#] ansible-playbook create_user.yml



PLAY [create_user] ***************************************************************************************************************



TASK [create user] ***************************************************************************************************************

changed: [am-02]



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=1    changed=1    unreachable=0    failed=0  

#执行这个配置文件
[root@am-02:~#] cat /etc/passwd |grep test

test:x:1014:1014::/home/test:/bin/bash

#在 am-02 可以见到,test 用户已经被创建了

那么,怎么删除用户呢?

[root@am-01:/etc/ansible#] vim deleted_user.yml

---

- name: delete_user

  hosts: am-02

  user: root

  gather_facts: false

  vars:

    - user: "test"

  tasks:

    - name: delete_user

      user: name="{{ user }}" state=absent remove=yes

#写法基本一样,主要是在最后增加了"state=absent remove=yes"
[root@am-01:/etc/ansible#] ansible-playbook deleted_user.yml



PLAY [delete_user] ***************************************************************************************************************



TASK [delete_user] ***************************************************************************************************************

changed: [am-02]



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=1    changed=1    unreachable=0    failed=0  

#执行一下这个配置文件
[root@am-02:~#] id test

id: test: no such user

#在 am-02 测试可以见到,test 用户已经删除

playbook 循环

使用循环修改指定的文件的权限

[root@am-01:/etc/ansible#] vim while.yml

---

- hosts: am-02

  user: root

  tasks:

    - name: change mode for files

      file: path=/tmp/{{ item }} mode=600

      with_items:

        - 1.txt

        - 2.txt

        - 3.txt

#使用 file 模块,path 指定需要做操作的文件或目录,item 可以以理解为变量,mode 指定修改的权限

#使用 with_items 来设置变量的值

#这个配置文件,其实就是循环修改指定的文件的权限
[root@am-01:/etc/ansible#] ansible-playbook while.yml



PLAY [am-02] *********************************************************************************************************************



TASK [Gathering Facts] ***********************************************************************************************************

ok: [am-02]



TASK [change mode for files] *****************************************************************************************************

changed: [am-02] => (item=1.txt)

failed: [am-02] (item=2.txt) => {"changed": false, "item": "2.txt", "msg": "file (/tmp/2.txt) is absent, cannot continue", "path": "/tmp/2.txt", "state": "absent"}

failed: [am-02] (item=3.txt) => {"changed": false, "item": "3.txt", "msg": "file (/tmp/3.txt) is absent, cannot continue", "path": "/tmp/3.txt", "state": "absent"}

to retry, use: --limit @/etc/ansible/while.retry



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=1    changed=0    unreachable=0    failed=1  

#执行一下这个配置文件,这里提示错误,这是因为 am-02 的/tmp 目录下并没有 2.txt 和 3.txt
[root@am-02:~#] ls -l /tmp/*.txt

-rw------- 1 root root 2673 5 月  28 23:09 /tmp/1.txt

-rw-r--r-- 1 root root    0 5 月  29 23:30 /tmp/am-02.txt

[root@am-02:~#] ls -l /tmp/1.txt

-rw------- 1 root root 2673 5 月  28 23:09 /tmp/1.txt

#到 am-02 下检查,可以见到,存在的 1.txt 文件的权限的已经被修改

在修改权限之前先创建这个文件

[root@am-01:/etc/ansible#] vim while.yml

---

- hosts: am-02

  user: root

  tasks:

    - name: change mode for files

      file: path=/tmp/{{ item }} state=touch mode=600

      with_items:

        - 1.txt

        - 2.txt

        - 3.txt

#增加一个"state=touch"参数,可以在修改权限前先创建这个文件,预防出错
[root@am-01:/etc/ansible#] ansible-playbook while.yml



PLAY [am-02] *********************************************************************************************************************



TASK [Gathering Facts] ***********************************************************************************************************

ok: [am-02]



TASK [change mode for files] *****************************************************************************************************

changed: [am-02] => (item=1.txt)

changed: [am-02] => (item=2.txt)

changed: [am-02] => (item=3.txt)



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=2    changed=1    unreachable=0    failed=0  

#执行这个配置文件能见到,这次没出错了
[root@am-02:~#] ls -l /tmp/*.txt

-rw------- 1 root root 2673 5 月  30 00:26 /tmp/1.txt

-rw------- 1 root root    0 5 月  30 00:26 /tmp/2.txt

-rw------- 1 root root    0 5 月  30 00:26 /tmp/3.txt

#在 am-02 上检查也能见到,2.txt 和 3.txt 已被创建,并且赋予了 600 的权限

playbook 中的条件判断

playbook 还能实现条件判断,当出现某种情况时,才会做某种操作

[root@am-01:/etc/ansible#] vim when.yml

---

- hosts: am-02

  user: root

  gather_facts: True

  tasks:

    - name: use when

      shell: touch /tmp/when.txt

      when: ansible_eno16777736.ipv4.address == "172.17.1.242"

#当检查到 ip 地址为 172.17.1.242 的时候,则使用 shell 模块创建/tmp/when.txt 文件

#这里需要注意的是,"gather_facts"需要设置为 true 或者不设置(默认为 true),因为下面的判断需要用到收集到的信息来做判断

#多层嵌套的时候可以使用点号(.)来做分割

#为了让这个配置文件是有意义的,在实际环境中,应该是不指定机器名的,而是指定主机组名称
[root@am-01:/etc/ansible#] ansible-playbook when.yml



PLAY [am-02] *********************************************************************************************************************



TASK [Gathering Facts] ***********************************************************************************************************

ok: [am-02]



TASK [use when] ******************************************************************************************************************

 [WARNING]: Consider using file module with state=touch rather than running touch



changed: [am-02]



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=2    changed=1    unreachable=0    failed=0  

#执行一下这个配置文件
[root@am-02:~#] ls -l /tmp/when.txt

-rw-r--r-- 1 root root 0 5 月  30 00:47 /tmp/when.txt

#am-02 上检查可以见到,文件已经创建

获取指定机器的信息("gather_facts"的功能)

[root@am-01:/etc/ansible#] ansible am-02 -m setup

am-02 | SUCCESS => {

    "ansible_facts": {

        "ansible_all_ipv4_addresses": [

            "172.17.1.242"

        ],

………………省略部分输出信息………………

        "module_setup": true

    },

    "changed": false

}

playbook 中的 handlers

handlers 的作用相当于 shell 中的&&符号

如:"command1 && command2",即 1 执行成功才会去执行 2

[root@am-01:/etc/ansible#] vim handlers.yml

---

- name: handlers test

  hosts: am-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

#tasks 中指定使用 copy 模块,把文件从 src(源机器)复制到 dest(目的机器),notify 定义了如果 copy 模块运行成功,则运行名称为 test handlers 的操作

#handlers 中定义了上面的 copy 模块运行成功的话就使用 shell 模块做一些操作

#handlers 很适合用在修改了配置文件后就执行重启服务的操作
[root@am-01:/etc/ansible#] ansible-playbook handlers.yml



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



TASK [Gathering Facts] ***********************************************************************************************************

ok: [am-02]



TASK [copy file] *****************************************************************************************************************

changed: [am-02]



RUNNING HANDLER [test handlers] **************************************************************************************************

changed: [am-02]



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=3    changed=2    unreachable=0    failed=0  

#执行一下这个配置文件
[root@am-02:~#] ls -l /tmp/aaa.txt

-rw-r--r-- 1 root root 2680 5 月  30 00:58 /tmp/aaa.txt

[root@am-02:~#] tail /tmp/aaa.txt

user_09:x:1030:1030::/home/user_09:/bin/bash

gitlab-www:x:996:993::/var/opt/gitlab/nginx:/bin/false

git:x:995:992::/var/opt/gitlab:/bin/sh

gitlab-redis:x:994:991::/var/opt/gitlab/redis:/bin/false

gitlab-psql:x:993:990::/var/opt/gitlab/postgresql:/bin/sh

gitlab-prometheus:x:992:989::/var/opt/gitlab/prometheus:/bin/sh

am:x:1031:1031::/home/jail/./home/am:/usr/sbin/jk_chrootsh

admin:x:1032:1032::/home/admin:/bin/bash

zhangsan:x:1033:1033::/home/zhangsan:/home/jumpserver/init.sh

111111

#在 am-02 上检查可以见到运行是成功的