文章目录
1.palybook
1.1ansible临时任务和playbook区别
ansible临时任务:只适于执行一个简单任务,并且任务具有一次性。
playbook:适于执行多组任务,并且playbook是一个文本文件,写入内容为yml格式,创建文件命名必须是以 .yml 结尾。
1.2playbook格式编写
---
-[空格]name:[空格]+任务描述
[空两格]hosts:[空格]+受控主机IP
[空两格]tasks:
[空四格]-[空格]name:[空格]+对执行任务简单描述
[空六格]模块名:
[空八格]模块下使用参数:[空格]+内容
注意:模块与模块之间等级相同处于同一列;模块参数彼此等级相同处于同一列;
如冒号后无需内容不需要空格。
作为play中的一部分,tasks属性按顺序实际列出要在受管主机上运行的任务。列表中各项任务本身是一个键值对集合。
还以上面创建用户的play为例,play中唯一任务有两个键:
name是记录任务用途的可选标签。最好命名所有的任务,从而帮助记录自动流程中的每一步用途。
user是要为这个任务运行的模块。其参数作为一组键值对传递,它们是模块的子项(name、uid和state)。
---
- name: create user and user_passwd
hosts: 192.168.120.130
tasks:
- name: create user1
user:
name: kim
uid: 2021
state: present
- name: create user2
user:
name: jik
uid: 2022
state: present
注意:playbook中play和任务列出的顺序很重要,因为Ansible会按照相同的顺序运行它们。
1.3运行playbook
(1)首先编写playbook
[root@king ~]# mkdir playbook
[root@king ~]# cd playbook/
[root@king playbook]# vim play.yml
---
- name: create user and user_passwd
hosts: 192.168.120.130
tasks:
- name: create user1
user:
name: kim
uid: 2021
state: present
:wq!
(2)其次对playbook文件进行检查语句或者演示执行过程状态
1、检查语句执行命令—— --syntax-check
[root@king playbook]# ansible-playbook --syntax-check play.yml
playbook: play.yml
2、只是演示执行过程状态,并不会执行任务在受控主机上—— -C
[root@king playbook]# ansible-playbook -C play.yml
PLAY [create] ***********************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************
ok: [192.168.120.130]
TASK [create user] ******************************************************************************************************************************************
changed: [192.168.120.130]
PLAY RECAP **************************************************************************************************************************************************
192.168.120.130 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@king playbook]#
(3)运行playbook
ansible-playbook play.yml
[root@king playbook]# ansible-playbook play.yml
PLAY [create] ***********************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************
ok: [192.168.120.130]
TASK [create user] ******************************************************************************************************************************************
changed: [192.168.120.130]
PLAY RECAP **************************************************************************************************************************************************
192.168.120.130 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@king playbook]#
1.4 提高输出的详细程度
ansible-playbook命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v命令提供了额外的信息,总共有四个级别。
配置Playbook执行的输出详细程序
ansible-playbook -v play.yml
-v:显示任务结果
-vv:任务结果和任务配置都会显示
-vvv:包含关于与受管主机连接的信息
-vvvv:增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本
2.实施多个play
2.1编写多个play
---
- name: create1
hosts: 192.168.120.130
tasks:
- name: create user
user:
name: kim
uid: 2021
state: present
user:
name: jim
uid: 2022
state: absent
- name: create2
hosts: 192.168.120.131
tasks:
- name: create kim_passwd
shell:
name: kim
shell: echo "123" |passwd --stdin kim
2.2 play中的远程用户和特权升级
1> 用户属性
如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user关键字覆盖。
remote_user: kim
2>特权升级属性
Ansible也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yes或true值来启用特权升级,或者取no或false值来禁用它。
become: yes
如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级方法。
以下示例中指定sudo用于特权升级:
become_method: sudo
此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。
become_user: privileged_user
示例了特权升级用法:
控制主机上:
---
- name: create
hosts: 192.168.120.130
remote_user: kim
become: yes
become_method: sudo
tasks:
- name: create user
user:
name: popo
uid: 2000
group: kim
state: present
[root@king playbook]# ansible-playbook --syntax-check play.yml
playbook: play.yml
受控主机上:
[root@CAT ~]# echo "123"|passwd --stdin kim
更改用户 kim 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@CAT ~]# visudo
....
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
kim ALL=(ALL) ALL //修改visudo文件添加普通用户能执行root命令
....
控制主机上:
[root@king playbook]# ssh kim@192.168.120.130
kim@192.168.120.130's password:
Last failed login: Sat Oct 16 19:11:04 CST 2021 from 192.168.120.128 on ssh:notty
There was 1 failed login attempt since the last successful login.
[kim@CAT ~]$ logout
[root@king playbook]# ansible-playbook -C play.yml
PLAY [create] ***********************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************
ok: [192.168.120.130]
TASK [create user] ******************************************************************************************************************************************
changed: [192.168.120.130]
PLAY RECAP **************************************************************************************************************************************************
192.168.120.130 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
特权升级步骤:
1.受管主机创建远程登录用户,并此用户必须有密码;
2.在受管主机上visudo修改普通用户权限;
3.编写控制主机playbook配置特权升级;
4.使用需远程登录用户在控制主机上ssh登录以下,然后退出;
5.-C 测试。
2.3查找用于任务的模块—帮助文档
asible最新官网查找模块使用功能(这是个链接)
对于每一个模块,Ansible官网提供了其功能摘要,以及关于如何通过模块的选项来调用各项具体功能的说明。文档还提供了实用的示例,演示各个模块的用法,以及任务中关键字的设置方法。
ansible-doc -l命令,显示的是模块名称列表以及其功能的大概:
ansible-doc -l
使用 ansible-doc +模块名 命令来显示模块的详细文档。与Ansible官网一样,该命令提供模块功能的概要、其不同选项的详细信息,使用示例:
ansible-doc user
ansible-doc -s +模块名 该命令只示例出模块可以使用的参数有哪些,并不会详细输出使用方法:
ansible-doc -s user
使用ansible-doc命令可以查找和了解如何使用模块。尽管command、shell和raw模块的用法可能看似简单,但在可能时,应尽量避免在playbook中使用它们因为它们可以取胜任意命令,因此使用这些模块时很容易写出非幂等的playbook。
例如,以下使用shell模块的任务为非幂等。每次运行play时,它都会重写/etc/resolv.conf,即使它已经包含了行nameserver 1.1.1.4。
- name: Non-idepotent approach with shell module
shell: echo "www.a.com 1.1.1.4" > /etc/resolv.conf
可以通过多种方式编写以幂等方式使用shell模块的任务,而且有时候进行这些更改并使用shell是最佳的做法。但更快的方案或许是使用ansible-doc发现copy模块,再使用它获得所需的效果。
在以下示例中,如果/etc/resolv.conf文件已包含正确的内容,则不会重写该文件:
- name: Idempotent approach with copy module
copy:
dest: /etc/resolv.conf
content: "www.a.com 1.1.1.4\n"
copy模块可以测试来了解是否达到了需要的状态,如果已达到,则不进行任何更改。shell模块容许非常大的灵活性,但需要格外小心,从而确保它以幂等方式运行。幂等的playbook可以重复运行,确保系统处于特定的状态,而不会破坏状态已经正确的系统。
2.4playbook语法变化
1>YAML注释
注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧(空一格)的所有内容都是注释。如果注释的左侧有内容,请在该编号符号的前面加一个空格。
# This is a cat
some data # This is also a YAML comment
2>YAML字符串
YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起,如:
this is a string
'this is another string'
"this is yet another a string"
编写多行字符串有两种方式:
① 可以使用管道符表示要保留字符串中的换行字符;
service: |
Example Company
123 Main Street
Atlanta, GA 30303
② 要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。
service: >
This is an example
of a long string,
that will become
a single sentence once folded.
3>YAML字典
yaml字典中有两种表达方式:
① 下面是一个简单的字典形式(于目前比较常用,比较直观,更不容易出错)
name: server
svcservice: httpd
svcport: 80
② 字典也可以使用以大括号括起的内联块格式编写(容易出错),如下所示:
{name: server, svcservice: httpd, svcport: 80}
!!! 大多数情况下应避免内联块格式,因为其可读性较低。不过,至少有一种情形中会较常使用它。当playbook中包含角色列表时,较常使用这种语法,从而更加容易区分play中包含的角色和传递给角色的变量。
4>YAML列表
有两种表达方式。
① 最简单只管的列表如下:
hosts:
- servera
- serverb
② 使用中括号加内联格式进行写列表,如下:
hosts: [servera, serverb]
5>过时的“键=值” playbook简写
某些playbook可能使用较旧的简写方法,通过将模块的键值对放在与模块名称相同的行上来定义任务。例如,可能会看到这种语法:
---
- name: create
hosts: 192.168.120.130
remote_user: kim
become: true
become_method: sudo
tasks:
- name: create user
user: name= tang state= present
通常我们应该将这样的语法编写为如下所示(更为直观):
---
- name: create
hosts: 192.168.120.130
remote_user: kim
become: true
become_method: sudo
tasks:
- name: create user
user:
name: tang
state: present
通常我们应避免简写形式,而使用普通形式。
普通形式的行数较多,但更容易操作。任务的关键字垂直堆叠,更容易区分。阅读play时,眼睛直接向一扫视,左右运动较少。而且,普通语法是原生的YAML。