Ansible

一、CentOS7.5模板机设置与systemctl命令等

1systemctl命令

systemctl stop iptables.service

systemctl stop firewalld

关闭firewalld   iptables生效

systemctl status firewalld 查看firewalld状态

 

systemctl start firewalld   启动服务

systemctl status firewalld  查看服务情况

 

1)、systemctl开机自启动命令

systemctl enable firewalld

 

2)、systemctl开机自启动关闭命令

systemctl disable firewalld

3)、关闭NetworkManager和自启动

这个服务用于管理网卡,权限高于网卡配置文件,所以会影响配置文件,在工作中我们也将它关闭

systemctl stop NetworkManager

systemctl disable NetworkManager

systemctl status NetworkManager

2、模板机的一些设置

1)安全设置

 

StrictHostKeyChecking ask   /etc/ssh/sshd_config

2)磁盘设置

7.5版本多余的yum源不需要放到bak目录里

磁盘缓存开启;

 

3、安装所有epel源和ansible

 

yum -y install epel-release ;安装所有与epel有关yum

yum -y install ansible ;安装ansible 捆绑带有sshpass

4、给普通用户sudo授权

visudo

 

1. #创建一个普通用户yunjisuan

2. [root@ansible ~]# useradd yunjisuan

3. [root@ansible ~]# echo "123123" | passwd --stdin yunjisuan

4. 更改用户 yunjisuan 的密码 

5. passwd:所有的身份验证令牌已经成功更新。

6. 

7. #以root账号授权普通用户yunjisuan所有权限并免输入密码

8. [root@ansible ~]# sed -n '93p' /etc/sudoers

9. yunjisuan ALL=(ALL) ALL

10. 

11. #切换到yunjisuan用户测试提权

12. [root@ansible ~]# su - yunjisuan

13. [yunjisuan@ansible ~]$ sudo -l   查看sudo权限

14. 

15. 我们信任您已经从系统管理员那里了解了日常注意事项。

16. 总结起来无外乎这三点:

17. 

18. #1) 尊重别人的隐私。

19. #2) 输入前要先考虑(后果和风险)。

20. #3) 权力越大,责任越大。

21. 

22. [sudo] yunjisuan 的密码:

23. 匹配 %2$s  %1$s 的默认条目:

24. !visiblepw, always_set_home, match_group_by_gid, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",

25. env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",

26. env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",

27. secure_path=/sbin:/bin:/usr/sbin:/usr/bin

28. 

29. 用户 yunjisuan 可以在 ansible 上运行以下命令:

30. (ALL) ALL

31. 

32. #测试提权

33. [yunjisuan@ansible ~]$ ls /root

34. ls: 无法打开目录/root: 权限不够

35. [yunjisuan@ansible ~]$ sudo ls /root

36. anaconda-ks.cfg

5、开启、测试sudo日志(甩锅用的)重点!!!!

 

1.   #开启sudo日志

2. [root@ansible ~]# echo "local2.debug /var/log/sudo.log" >> /etc/rsyslog.conf

3. [root@ansible ~]# echo "Defaults logfile=/var/log/sudo.log" >> /etc/sudoers

4. [root@ansible ~]# systemctl restart rsyslog

5. 

6. #测试sudo日志记录

7. [root@ansible ~]# exit

8. 登出

9. [yunjisuan@ansible ~]$ sudo su -

10. [sudo] yunjisuan 的密码:

11. 上一次登录:日 9 9 21:40:11 CST 2018pts/0 

12. 

13. #查看/var/log/sudo.log日志

14. [root@ansible ~]# cat /var/log/sudo.log

15. Sep 9 21:49:12 : yunjisuan : TTY=pts/0 ; PWD=/home/yunjisuan ; USER=root ;

16. COMMAND=/bin/su -

6、批量管理工具

批量管理工具排名:

1、ansible     使用简单        用来管理500台以下服务器

2、saltstack    使用复杂        1000~4

3、puppet     使用超级复杂

二、配置Ansible

1/etc/ansible/hosts配置文件设置

/etc/ansible/hosts文件中可以定义被管理主机,Ansible通过读取/etc/ansible/hosts文件内定义的主机清单批量做一些操作。比如定义一个nginx组,包含一台主机Web01,再定义一个apache组,包含另一台主机Web02.

[root@ansible ~]# cat /etc/ansible/hosts

[nginx]

Web01 ansible_ssh_host=192.168.200.184

Web02 ansible_ssh_host=192.168.200.185

架构:#ansible 被管理范围 -m 模块 -a 具体命令

ansible WebA -m ping    

ping一下看是不是通的(这样只能用于密钥登陆,密码登陆的是连不通的)

只能用ansible_ssh_pass参数

 

#说明:

ansible_ssh_host:被管理主机IP

ansible_ssh_user:被管理主机用户名

ansible_ssh_pass:被管理主机用户的登陆密码

ansible_sudo_pass:被管理主机用户sudo时的密码

2设置SSH免密码登陆??

 

3/etc/hosts配置文件设置600权限

 

三、ping模块 与commond模块

1ping模块

 

#直接ping模块名就把模块里的所有服务器全部ping一遍

2ping所有的模块“all

ansible all -m ping

把里面的所有模块全部ping一遍

3commond模块(这玩意完犊子)

在远程主机执行命令,不支持管道符和重定向等复杂命令shell模块替代

[root@ansible ~]# ansible Web01 -m command -a 'uptime'

Web01 | SUCCESS | rc=0 >>

 22:14:43 up  9:43,  3 users,  load average: 0.00, 0.01, 0.05

分发command模块 -a指定命令“uptime”(指定范围远程服务器的平均负载值

#[root@ansible ~]# ansible Web01 -m command -a 'hostname -I'

获取对方IP地址

[root@ansible ~]# ansible Web01 -m command -a 'ls'

Web01 | SUCCESS | rc=0 >>

anaconda-ks.cfg

四、shell模块

Ansible中的shell模块可以在被管理主机上运行命令,并支持像管道符重定向这样的复杂命令。

#Web01上创建用户yunjisuan,并非交互方式设定密码

[root@ansible ~]# ansible Web01 -m shell -a 'useradd yunjisuan'

[root@ansible ~]# ansible Web01 -m shell -a 'echo 123123 | passwd --stdin yunjisuan'

更改用户 yunjisuan 的密码 。

passwd:所有的身份验证令牌已经成功更新。

查看yunjisuan用户的用户信息

[root@ansible ~]# ansible Web01 -m shell -a 'id yunjisuan'

Web01 | SUCCESS | rc=0 >>

uid=1000(yunjisuan) gid=1000(yunjisuan) =1000(yunjisuan)

查看用户配置目录详细信息

[root@ansible ~]# ansible Web01 -m shell -a 'tail -1 /etc/shadow'

Web01 | SUCCESS | rc=0 >>

yunjisuan:$6$4y7c1tkV$oPZW0psDdAzJp5RomBrOpSlTuvsdQ/5JaBYHU.LOPsYQ0o7EpPFRMuh/X9ruwcmBcZbN.l/glBTfDKm//jJP60:17782:0:99999:7:::

#在所有被管理的主机的/etc/hosts文件里添加Ansible管理服务器的IP地址映射

[root@ansible ~]# ansible all -m shell -a 'echo "ansible 192.168.200.183" >> /etc/hosts'

Web02 | SUCCESS | rc=0 >>

Web01 | SUCCESS | rc=0 >>

#查看所有配置目录/etc/hosts的最后一行信息

[root@ansible ~]# ansible all -m shell -a 'tail -1 /etc/hosts'

Web01 | SUCCESS | rc=0 >>

ansible 192.168.200.183

Web02 | SUCCESS | rc=0 >>

ansible 192.168.200.183

五、cron批量设置定时任务

1、参数描述

crontab时间周期:

minute:分钟   hour:小时  day:日期   month:月份   weekday:周期

crontab任务:

job:指明运行的命令是什么

crontab任务描述:

name:定时任务描述(定时任务清除的依据) (必须要写)

state状态:

present:表示添加(省略状态时默认使用);

absent:表示移除;

crontab任务的用户身份:

user:指定定时任务以哪个用户身份执行

2、添加定时任务计划

在所有被管理的主机里每十分钟输出hello字符串,定时任务描述为test cron job

[root@ansible ~]# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'

Web02 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": [

        "test cron job"

    ]

}

Web01 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": [

        "test cron job"

    ]

}

#给普通用户yunjisuan用户上设置这个定时任务##如果不指定用户,默认是给root用户上定时任务

[root@ansible ~]# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"' user=”yunjisuan”

[root@ansible ~]# ansible all -m shell -a 'crontab -l'

Web01 | SUCCESS | rc=0 >>

#Ansible: test cron job

*/10 * * * * /bin/echo hello

Web02 | SUCCESS | rc=0 >>

#Ansible: test cron job

*/10 * * * * /bin/echo hello

查看所有模块的定时任务

3删除名字为test cron job的定时任务

[root@ansible ~]# ansible all -m cron -a 'name="test cron job" user="benchi" state="absent"'

[root@localhost ~]# ansible all -m shell -a 'crontab -r'

删除yunjisuan用户的定时任务名字为test cron job的定时任务,不指定用户,默认是root

Web02 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": []

}

Web01 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": []

}

[root@ansible ~]# ansible all -m shell -a 'crontab -l'

Web02 | SUCCESS | rc=0 >>

Web01 | SUCCESS | rc=0 >>

#Web01服务器上的普通用户yunjisuan添加一个定时任务

[root@ansible ~]# ansible Web01 -m shell -a 'id yunjisuan'

Web01 | SUCCESS | rc=0 >>

uid=1000(yunjisuan) gid=1000(yunjisuan) =1000(yunjisuan)

[root@ansible ~]# ansible Web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="yunjisuan cron job" user="yunjisuan"'

Web01 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": [

        "yunjisuan cron job"

    ]

}

[root@ansible ~]# ansible Web01 -m shell -a 'crontab -u yunjisuan -l'

Web01 | SUCCESS | rc=0 >>

#Ansible: yunjisuan cron job

*/10 * * * * /bin/echo hello

[root@ansible ~]# ansible Web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="yunjisuan cron job" user="yunjisuan" state="absent"'

Web01 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": []

}

[root@ansible ~]# ansible Web01 -m shell -a 'crontab -u yunjisuan -l'

Web01 | SUCCESS | rc=0 >>

 

 

 

 

 

 

 

 

 

 

 

六、copy模块

1、复制的用法

Ansible中的copy模块用于实现文件复制和批量下发文件。其中使用src来定义本地源文件路径;使用dest定义被管理主机文件路径;使用content则是使用指定信息内容来生成目标文件。

从本机复制到指定服务器~~!!

ansible WebB -m copy -a ‘src=   dest= ’

#src是源     dest是目标,从哪里复制到哪里

ansible WebB -m copy -a ‘src=/tmp/test  dest=/root  backup=yes’

复制一个文件到一个目录里,如果重名,先备份后复制

2、其他参数

owner属主,mode权限,还有下面等一系列参数

1. ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts owner=root mode=640 backup=yes'

2. Web01 | SUCCESS => {

3. "backup_file": "/etc/hosts.13083.2018-09-09@00:38:35~", 

4. "changed": true, 

5. "checksum": "80244bc6f9638a3505aae1a2bcf2228e69a00420", 

6. "dest": "/etc/hosts", 

7. "gid": 0, 

8. "group": "root", 

9. "md5sum": "de48f3cf45d11215fa7cfd0d558be954", 

10. "mode": "0640", 

11. "owner": "root", 

12. "size": 180, 

13. "src": "/root/.ansible/tmp/ansible-tmp-1536424715.44-39054260112988/source", 

14. "state": "file", 

15. "uid": 0

16. }

3将本地/tmp/test.sh的脚本复制到远程主机上并远程激活

17. [root@ansible ~]# cat /tmp/test.sh

18. #!/bin/bash

19. echo "welcome to yunjisuan"

20. [root@ansible ~]# ansible all -m copy -a 'src=/tmp/test.sh dest=/tmp owner=root mode=500'

21. [root@ansible ~]# ansible all -m shell -a '/tmp/test.sh'

22. Web01 | SUCCESS | rc=0 >>

23. welcome to yunjisuan

24. 

25. Web02 | SUCCESS | rc=0 >>

26. welcome to yunjisuan

七、脚本script模块

Ansible中的script模块可以将本地脚本复制到被管理主机的内存中并运行,不会在被管理主机中留下脚本文件。

1. #编写一个脚本,然后通过ansible的script模块远程向被管理主机执行此脚本

2. [root@ansible ~]# echo 'echo "1111" >> /tmp/test' >> /tmp/test.sh

3. [root@ansible ~]# cat /tmp/test.sh

4. echo "1111" >> /tmp/test

5. 

6. 

7. [root@ansible ~]# ansible all -m script -a '/tmp/test.sh'

8. ##直接执行脚本,可以在管理服务器上执行,执行到目标集群所有服务中,存在与目标集群服务器的内存里,所以不用把脚本复制到目标集群服务器里,脚本不会留在对方电脑里。

9. [root@ansible ~]# ansible all -m shell -a 'cat /tmp/test'

10. Web02 | SUCCESS | rc=0 >>

11. 1111

12. Web01 | SUCCESS | rc=0 >>

13. 1111

八、yum模块

利用yum模块安装软件包,虽然能被shell模块替代
但是用yum模块更显专业一些

软件包名:

name:指定软件包的名字

state状态:

present:安装软件包(不写默认就是这个)

absent:卸载软件包

1. #安装nmap软件包

2. [root@ansible ~]# ansible all -m yum -a 'name=nmap'

3. 

4. #卸载nmap软件包

5. [root@ansible ~]# ansible all -m yum -a 'name=nmap state=absent'

九、service模块

利用service模块管理服务程序,虽然能被shell模块替代
但是用service模块更显专业一些

·服务名称:

name:指定服务的名字

·state状态:

started:启动服务

stopped:停止服务

restarted:重启服务

reloaded:平滑重载

·enabled开机自启动:

true:设置开机自启动

false:设置开启不启动

1. #启动firewalld并设置开机自启动

2. [root@ansible ~]# ansible Web01 -m service -a 'name=firewalld state=started enabled=true'

3. 

4. #关闭firewalld并设置开机不启动

5. [root@ansible ~]# ansible Web01 -m service -a 'name=firewalld state=stopped enabled=false'

十、user模块

1用户管理模块。管理用户账号

· 指定用户名

name:指定操作的用户的名字

· 用户描述

comment:指定用户的描述信息

· createhome:是否创建家目录

· uid:指定用户的uid

· groups:指定用户的附加组(默认创建和用户名相同的组)

· password:指定用户的密码

· update_password:更新用户的密码

· shell指定用户的登陆方式

/bin/bash:能登录系统

/sbin/nologin:不能登录系统

· home:指定用户的家目录路径

· state状态:

present:创建用户(默认就是这个)

absent:删除用户

· remove:当指定state=absent时,确认是否删除用户家目录

true

false

ansible all -m user -a ‘name=yunjisuan comment=”welcome to yunjisuan” uid=2222 password=123123 shell=/bin/bash home=/home/yunjisuan’

但是这么创建用户,密码是明文的;是无效的!!!

另一个例子:

1. #在Web02上创建一个普通用户yunjisuan,并设置用户的密码为123123

2. [root@ansible ~]# ansible Web02 -m user -a 'name=yunjisuan comment="welcom to yunjisuan" uid=1066 groups=wheel password=123123 shell=/bin/bash home=/home/yunjisuan'

3. Web02 | SUCCESS => {

4. "changed": true, 

5. "comment": "welcom to yunjisuan", 

6. "create_home": true, 

7. "group": 1066, 

8. "groups": "wheel", 

9. "home": "/home/yunjisuan", 

10. "name": "yunjisuan", 

11. "password": "NOT_LOGGING_PASSWORD", 

12. "shell": "/bin/bash", 

13. "state": "present", 

14. "system": false, 

15. "uid": 1066

16. }

17. [root@ansible ~]# ansible Web02 -m shell -a 'tail -1 /etc/passwd'

18. Web02 | SUCCESS | rc=0 >>

19. yunjisuan:x:1066:1066:welcom to yunjisuan:/home/yunjisuan:/bin/bash

20. 

21. [root@ansible ~]# ansible Web02 -m shell -a 'tail -1 /etc/shadow'

22. Web02 | SUCCESS | rc=0 >>

23. yunjisuan:123123:17783:0:99999:7::: #密码居然是明文!!!

2、安装加密模块给密码加密,有两种安装包可用

1. #安装Python2的pip工具,并通过pip工具安装Python的加密模块来给密码加密

2. [root@ansible ~]# yum -y install epel-release

3. [root@ansible ~]# yum -y install python2-pip

4. [root@ansible ~]# pip install passlib

python -V   2.7.5

3、安装完后,用下面的命令生成密文

1. #生成密文密码

2. [root@ansible ~]# python -c "from passlib.hash import sha512_crypt;import getpass;print sha512_crypt.encrypt(getpass.getpass())"

4、输入你想要加密的密码,加密成密文

3. Password: #输入你想要加密的密码

4. $6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1 #加密后的密码

5、把刚刚创建的用户删除

5. #删除之前创建的yunjisuan用户,并删除它的家目录

6. [root@ansible ~]# ansible Web02 -m user -a 'name=yunjisuan state=absent remove=true'

6、重新创建用户,把密文写成原来密码的位置

7. #继续在Web02上创建yunjisuan用户

8. [root@ansible ~]# ansible Web02 -m user -a 'name=yunjisuan comment="welcom to yunjisuan" uid=1066 groups=wheel password=$6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1 shell=/bin/bash' home=/home/yunjisuan'

9. 

10. [root@ansible ~]# ansible Web02 -m shell -a 'tail -1 /etc/shadow'

11. Web02 | SUCCESS | rc=0 >>

12. yunjisuan:$6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1:17783:0:99999:7::: #终于密文了

十一、setup模块

Ansible中使用setup模块收集,查看被管理主机的factsfactsAnsible采集被管理主机设备信息的一个功能)。每个被管理主机在接收并运行管理命令之前,都会将自己的相关信息(操作系统版本,IP地址等)发送给控制主机

日常巡检(分3种)   物理巡检:机房巡检

服务巡检:批量获取远程服务器的CPU 内存 磁盘容量,再导出EXCEL

可以用setup模块抓数据

ansible all -m setup | less  获得对方操作系统详细信息

1. #查看远程主机的facts信息

2. [root@ansible ~]# ansible Web01 -m setup | head

3. Web01 | SUCCESS => {

4.     "ansible_facts": {

5.         "ansible_all_ipv4_addresses": [

6.             "192.168.200.184"

7.         ], 

8.         "ansible_all_ipv6_addresses": [

9.             "fe80::20c:29ff:fe77:16ad"

10.         ], 

11.         "ansible_apparmor": {

12.             "status": "disabled"

十二、工作中

思路清晰,下手要狠

工作中可能有几个开发组,每个开发组都有一个开发经理,我们运维可以给每个开发组的用户创建一个用户组,我们给他们一个组权限(sudo设定好);如果开发招新人,我们要给他们创建用户,但是我们却不知道它是哪个组的,所以我们给产品经理一个权限,能往自己的用户组里加用户的权限。

而我们要做的,只是做好sudo的记录,一旦出现问题,我们有迹可查,从而开始简单而刺激的甩锅!!

原文地址:https://www.cnblogs.com/kakajiang/p/10009743.html