我正在尝试使用 ansible 来检查特定程序的输出是否设置为某个值。该值包括一个冒号,后跟一个空格,无论我如何引用它,这似乎都会注册为语法错误。
例子:
---
- hosts: all
tasks:
- raw: echo "something: else"
register: progOutput
- debug:
msg: "something else happened!"
when: progOutput.stdout_lines[-1] != "something: else"
Run Code Online (Sandbox Code Playgroud)
当我运行它时,第一个“原始”命令出现错误:
ERROR! Syntax Error while loading YAML.
The error appears to have been in '<snip>/test.yml': line 4, column 27, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
tasks:
- raw: echo "something: else"
^ here
Run Code Online (Sandbox Code Playgroud)
(自然,我的实际用例涉及一个真实的程序,它的输出中有一个冒号,而不是 'raw: echo'。然而,这仍然是我看到的错误。)
显然,引用有问题的字符串并不能解决问题。我还尝试使用反斜杠 ( \)转义 …
我有两个 YAML 变量文件,它们被许多剧本重用:
# playbook/group_vars/all
settings:
a: 1
b: 2
# inventory/group_vars/main.yml
settings:
c: 3
Run Code Online (Sandbox Code Playgroud)
我希望在我的剧本中settings保持平等{ a: 1, b: 2, c: 3 }。
相反,它等于{ c: 3 },因为inventory/group_vars/*具有比playbook/group_vars/all和 更高的优先级,因为哈希值被覆盖,而不是合并。
使用命名约定和前缀单独定义变量,而不是使用哈希,如下所示:
# playbook/group_vars/all
settings_a: 1
settings_b: 2
# inventory/group_vars/main.yml
settings_c: 3
Run Code Online (Sandbox Code Playgroud)我们的团队认为这个解决方案不够优雅。
{{ list_common + list_specific }}
这需要对许多剧本进行更改(我们确实有很多),而且看起来也很糟糕。
--
是否有其他选项可以合并来自不同文件的哈希值,而不是重新定义(覆盖)它们?
我们试图实现的是停止跨变量文件重复列表并仅定义特定于组/主机的那些参数。
我无需设置入口和出口规则,而是如何在 CloudFormation 模板中引用现有 EC2 安全组?
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType:
Ref: InstanceType
SecurityGroups:
- Ref: InstanceSecurityGroup
KeyName:
Ref: KeyName
ImageId:
Fn::FindInMap:
- AWSRegionArch2AMI
- Ref: AWS::Region
- Fn::FindInMap:
- AWSInstanceType2Arch
- Ref: InstanceType
- Arch
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Existing Groups
SecurityGroupIds:
- Ref: sg-12345
- Ref: sg-12312
Run Code Online (Sandbox Code Playgroud)
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
SecurityGroupEgress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Run Code Online (Sandbox Code Playgroud) 我正在考虑为 Puppet 部署设置 r10k,我有各种示例 r10k.yaml 配置文件,但有些似乎在许多行的开头使用了额外的 :,例如,在http://www.rubydoc。信息/宝石/r10k/1.1.4:
---
:cachedir: '/var/cache/r10k'
Run Code Online (Sandbox Code Playgroud)
但是,在https://github.com/puppetlabs/r10k/blob/master/r10k.yaml.example:
---
cachedir: '/var/cache/r10k'
Run Code Online (Sandbox Code Playgroud)
有什么区别,为什么我要使用另一个?
我正在编写 ansible playbook 以获取服务器的当前主机名,然后将其设置为配置文件。我无法弄清楚如何使用 lineinfile 模块推送 shell 输出。
- name: Get hostname
shell: echo $HOSTNAME
register: result
- name: Set hostname on conf file
lineinfile: dest=/etc/teste/linux/zabbix_agentd.conf regexp="^Hostname=.*" insertafter="^# Hostname=" line=Hostname=????
Run Code Online (Sandbox Code Playgroud) 我有一个新安装的 Linux 发行版。它有一个具有默认密码的普通用户和一个锁定的 root 帐户(root 上没有密码 - 不能直接通过 SSH 连接)。我希望能够运行 ansible playbook 来配置此服务器,并通过更改其密码锁定此默认帐户,而无需执行额外的带外步骤。
我的剧本所做的大部分设置都需要 root,所以它被配置为作为默认用户 ssh 进入,成为 root,并运行所有命令。这很好用。问题是更改密码。
如果我尝试使用用户模块更改用户的密码,它会成功,但之后的所有任务都会失败。即使我将更改作为剧本中的最后一步进行,所有应该在最后运行的处理程序都会失败。
对于类似的问题,我在网上遇到了 2 个建议:
使用 RSA 密钥需要您提前设置 RSA,因此不是带内的。
我一直在尝试使用初始播放以某种方式执行此操作,但到目前为止,第二个初始播放无法使用默认密码登录,ansible 退出并出现错误,并忽略其他任务,以及下一个播放。
还有一个办法做到这一点使用ssh通,这表现在这里,它应该工作,但似乎更多的是黑客攻击,和ssh通并不总是容易获得,就像上运行MacOS的ansible机器。
十多年前这里讨论过一个类似的主题,但看起来 Dave 通过将 Linux 设置为在您尝试以默认用户身份登录时显示“帐户已禁用”消息并改为更改用户来解决此问题,这听起来也像它应该可以工作,但与简单地更改默认用户的密码不同。
ansible 是否可以在不断开连接的情况下更改其运行用户的密码?
我将我的 salt sls 文件存储在一个 git 存储库中,但我有一个长期存在的问题,即我无法验证我的 YAML 是否代表了一组可以应用的有效状态(我也很难验证我的 YAML -- 那是不过要容易得多)。理想情况下,我想要某种方式在提交之前在我的工作站上验证我的状态。如果做不到这一点,某种方式可以检查预接收挂钩,这样我至少可以阻止狡猾的代码访问服务器。
我正在为我的 Puppet 基础设施编写一个外部节点分类器,我需要/etc/hosts在每个节点上操作文件。以下(由于重复键)是无效的 YAML:
---
host:
name: www1.example.com
host_aliases: www1
ip: 1.2.3.4
host:
name: www2.example.com
host_aliases: www2
ip: 1.2.3.5
Run Code Online (Sandbox Code Playgroud)
我看到了这个相关的答案,它有以下代码:
host {
# Public IPs - eth0
'front-01': ip => '192.168.1.103';
'front-02': ip => '192.168.1.106';
# Private IPs - eth1
'priv0-0': ip => '192.169.40.201';
'priv0-1': ip => '192.169.40.202';
'priv1-0': ip => '192.169.40.207';
'priv1-1': ip => '192.169.40.208';
# Virtual IPs - eth0:1
'vip-01': ip => '192.169.50.202';
'vip-02': ip => '192.169.50.205';
}
Run Code Online (Sandbox Code Playgroud)
然而,
我在 github 和 ansible docs 中看到了多个 Ansible 示例,例如:
---
# this might be in a file like handlers/handlers.yml
- name: restart apache
service: name=apache state=restarted
Run Code Online (Sandbox Code Playgroud)
以下示例同时包含注释作为name.
# Make sure Jenkins starts, then configure Jenkins.
- name: Ensure Jenkins is started and runs on startup.
service: name=jenkins state=started enabled=yes
Run Code Online (Sandbox Code Playgroud)
讨论
Aname将是足够的权利还是应该使用评论?
应该是:
- name: Symlink RabbitMQ bin to sbin
file: state=link src=/usr/lib/rabbitmq/bin dest=/usr/lib/rabbitmq/sbin
Run Code Online (Sandbox Code Playgroud)
或者:
#Symlink RabbitMQ bin to sbin
file:
state: link
src: /usr/lib/rabbitmq/binhttp://docs.ansible.com/ansible/YAMLSyntax.html …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个 SecurityGroup,它的标签类似于Name: SG-StackName. 此代码在 json 中完美运行:
"Resources": {
"SecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
...
"Tags": [{
"Key": "Name",
"Value": {
"Fn::Join" : [ "", [
"SG-",
{ "Ref" : "AWS::StackName" }
]]
}
}
]
}
},
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试将其转换为 yaml:
Resources:
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
...
Tags:
- Key: Name
- Value: !Join
- ''
- - 'SG-'
- Ref: AWS::StackName
Run Code Online (Sandbox Code Playgroud)
堆栈构建失败并显示错误“在标签属性中找不到密钥”。模板中的错误在哪里?
我想创建一个 ansible 角色来使用 ssh_keys 添加用户
\n\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ansible.cfg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 hosts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 playbooks\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 add_user.yml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 roles\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 add-user\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 files\n \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ansible.pub\n \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dhirendra.pub\n \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nitigyas.pub\n \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 vinayaks.pub\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tasks\n \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.yml\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 vars\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.yml\nRun Code Online (Sandbox Code Playgroud)\n\ntasks/main.yml 文件是:
\n\n---\n- name: AddUser in the server\n user: \n name: ansible\n password: $6$sHQAZJ32E$ujHauabN7ZTbOQ/zhT5899EIaFErOecXYvTEyhekexy4dydsAXTGdUpaB8M4fQf2UGpZgX/Zg2Uv6areeuv/r0\n comment: Ansible Configuration Mgmt\n shell: /bin/bash\n\n- name: Add SSH key to users home direcotory\n authorized_key: \n user: "{{ item.name }}"\n key: "{{ item.file }}"\n state: present\n …Run Code Online (Sandbox Code Playgroud) 我正在使用 yaml。所以,我们可以使用:
!GetAtt [ WebServer, AvailabilityZone ]
!GetAtt WebServer.AvailabilityZone
Run Code Online (Sandbox Code Playgroud)
此外,我们可以使用:
!Sub 'sometext-${AWS::StackName}'
Run Code Online (Sandbox Code Playgroud)
如何使用 GetAtt 输出而不是${AWS::StackName},最好使用 的第二种形式GetAtt?我知道如何使用,Join但我想继续使用Sub.