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 这种比较适合配置文件发生更改后(如果配置成功),就会启动重启服务的操作。
希望看过的童鞋多多指教,谢谢!